Hello…
I have recently shifted from Display lists to VBOs… It’s a very nice thing in OpenGL i found to render huge amount of data smoothly…
Let me explain you the scenario… I have maintained a list of triangle objects as
std::map<unsigned int, EObjects*> MeshElements
Thus, MeshElements contains all the triangles generated by the mesh generator. Now inorder to display, i call a routine first as shown below:
mVertexCount = MeshElements.size();
mVertices = new GLfloat[mVertexCount * 6];
mIndices = new GLuint[mVertexCount * 3];
int v_ind = 0, i_ind = 0;
for( std::map<unsigned int, EObjects*>::iterator it = MeshElements.begin(); it != MeshElements.end(); it++ )
{
EObjects *ob = (*it).second;
mVertices[v_ind] = ob->GetNodeOne().GetX(); v_ind++;
mVertices[v_ind] = ob->GetNodeOne().GetY(); v_ind++;
mIndices[i_ind] = ob->GetNodeOneIndex(); i_ind++;
mVertices[v_ind] = ob->GetNodeTwo().GetX(); v_ind++;
mVertices[v_ind] = ob->GetNodeTwo().GetY(); v_ind++;
mIndices[i_ind] = ob->GetNodeTwoIndex(); i_ind++;
mVertices[v_ind] = ob->GetNodeThree().GetX(); v_ind++;
mVertices[v_ind] = ob->GetNodeThree().GetY(); v_ind++;
mIndices[i_ind] = ob->GetNodeThreeIndex(); i_ind++;
}
glGenGuffersARB(BufferSize, BufferName);
where BufferSize and BufferName are declared globally as follows:
enum{
INDEX_OBJECT = 0,
POSITION_OBJECT = 1
};
static const int BufferSize = 2;
static GLuint BufferName[BufferSize];
Below is my rendering code:
glBindBufferARB( GL_ARRAY_BUFFER_ARB, BufferName[POSITION_OBJECT]);
glBufferDataARB( GL_ARRAY_BUFFER_ARB, mVertexCount * 6 * sizeof(float), mVertices, GL_STREAM_DRAW_ARB );
glVertexPointer(2, GL_FLOAT, 0, 0);
glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, BufferName[INDEX_OBJECT] );
glBufferDataARB( GL_ELEMENT_ARRAY_BUFFER_ARB, mVertexCount * 3 * sizeof(GLuint), mIndices, GL_STREAM_DRAW_ARB );
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_INDEX_ARRAY);
glDrawElements( GL_TRIANGLES, mVertexCount*3, GL_UNSIGNED_INT, NULL );
glDisableClientState(GL_INDEX_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
This code is working fine… But, only the outer part of the mesh is displayed… the Inner part is not displayed… I mean to say, if the mesh is of shape “D”, it should have filled all the triangles in “D”… Instead of doing so, it is rather, drawing triangles only along the border of the shape “D” Inner part, triangles are not drawn…
Before using glDrawElements(), i was using glDrawArrays()… It also produced the same output… So I used, GL_POINTS with glDrawArrays(), just to check if it is reading all the points… In response to this test, it rendered all the points… But when i said, GL_TRIANGLES, it is not rendering the inner part…
On the other hand, GL_POINTS with glDrawElements() is also rendering only at the boundaries… Not inner part like glDrawArrays()…
Is something wrong with my code above…?? Please someone guide me properly…
Thanks in advance…