Hi !
i have two problems :
- my implementation of VBOs don’t work with glDrawElement or glDrawArray (my program works with glDrawElement without VBOs)
- with or without VBOs, glDrawArray don’t works : i have strange rendering
I put my code here for both :
void loader3ds::buildBOs()
{
for (i=0 ; i<=myLoader->getCounterObj() ; i++)
{
glGenBuffers(1, &myLoader->myObjects[i].vertexBufferName );
glBindBuffer( GL_ARRAY_BUFFER, myLoader->myObjects[i].vertexBufferName );
glBufferData( GL_ARRAY_BUFFER, sizeof(float)*3*myLoader->myObjects[i].nbVertices, &myLoader->myObjects[i].myVertices, GL_STATIC_DRAW );
glGenBuffers(1, &myLoader->myObjects[i].indexBufferName );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, myLoader->myObjects[i].indexBufferName );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short int)*myLoader->myObjects[i].nbVertices, &myLoader->myObjects[i].myIndices, GL_STATIC_DRAW );
glGenBuffers(1, &myLoader->myObjects[i].texCoordName );
// Get A Valid Name
glBindBufferARB( GL_ARRAY_BUFFER_ARB, myLoader->myObjects[i].texCoordName ); // Bind The Buffer
// Load The Data
glBufferData( GL_ARRAY_BUFFER_ARB, sizeof(float)*2*myLoader->myObjects[i].nbVertices, &myLoader->myObjects[i].myMapping, GL_STATIC_DRAW_ARB );
glGenBuffers(1, &myLoader->myObjects[i].normalsBufferName );
glBindBuffer( GL_ARRAY_BUFFER, myLoader->myObjects[i].normalsBufferName ); // Bind The Buffer
glBufferData( GL_ARRAY_BUFFER, sizeof(float)*3*myLoader->myObjects[i].nbVertices, &myLoader->myObjects[i].perVertexNormals, GL_STATIC_DRAW );
// Our Copy Of The Data Is No Longer Necessary, It Is Safe In The Graphics Card
glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
delete [] myLoader->myObjects[i].perVertexNormals ;
delete [] myLoader->myObjects[i].myVertices ;
}
}
void display ()
{
glClear (GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT ) ;
glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_INDEX_ARRAY);
glEnableClientState (GL_TEXTURE_COORD_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);
glFrontFace(GL_CCW) ;
glEnable (GL_CULL_FACE) ;
glCullFace(GL_BACK) ;
int i ;
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL) ;
glRotatef(c, 0.0, 1.0, 0.0) ;
for (i=0 ; i<=myLoader->getCounterObj() ; i++)
{
glBindBuffer( GL_ARRAY_BUFFER, myLoader->myObjects[i].vertexBufferName );
glVertexPointer (3, GL_FLOAT, 0, (char *) NULL );
glBindBuffer( GL_ARRAY_BUFFER, myLoader->myObjects[i].indexBufferName );
glIndexPointer (GL_SHORT, 0, (char *) NULL );
glBindTexture (GL_TEXTURE_2D, texname[i]) ;
glBindBuffer( GL_ARRAY_BUFFER_ARB, myLoader->myObjects[i].texCoordName );
glTexCoordPointer (2, GL_FLOAT, 0, (char *) NULL );
glBindBuffer( GL_ARRAY_BUFFER, myLoader->myObjects[i].normalsBufferName );
//glDrawElements (GL_TRIANGLES, (myLoader->myObjects[i].nbPoly*3), GL_UNSIGNED_SHORT, &(myLoader->myObjects[i].myIndices[0][0])) ;
glDrawArrays( GL_TRIANGLES, 0, myLoader->myObjects[i].nbVertices);
glutSwapBuffers() ;
}
int main(int argc, char *argv[])
{
myLoader= new loader3ds() ;
//cout<<"pos cam "<<myLoader->getCamPosX()<<" "<<myLoader->getCamPosY()<<" "<<myLoader->getCamPosZ()<<endl ;
//cout<<"target cam "<<myLoader->getCamTargetX()<<" "<<myLoader->getCamTargetY()<<" "<<myLoader->getCamTargetZ()<<endl ;
glutInit (&argc, argv) ;
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH) ;
glutInitWindowSize (640, 480) ;
glutInitWindowPosition (250,250) ;
glutCreateWindow (argv [0]) ;
glewInit();
glEnable( GL_DEPTH_TEST );
glClearColor(0, 0, 1, 0);
myLoader->buildBOs();
myLoader->loadTextures() ;
myLoader->lighting() ;
glutReshapeFunc (reshape) ;
glutKeyboardFunc (keyboard) ;
glutDisplayFunc (display) ;
glutIdleFunc(display);
glutMainLoop () ;
return 0 ;
}