| CodeGuru Home | VC++ / MFC / C++ | .NET / C# | Visual Basic | Newsletters | VB Forums | Developer.com |
|
|||||||
| Graphics Programming Discussion graphics programming using C++. Valid topics include OpenGL, DirectX, GDI/GDI+, Aero, and more. |
![]() |
|
|
Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
|
glDrawElements () draws only part of my mesh... What to do.??
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 Code:
std::map<unsigned int, EObjects*> MeshElements Code:
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: Code:
enum{
INDEX_OBJECT = 0,
POSITION_OBJECT = 1
};
static const int BufferSize = 2;
static GLuint BufferName[BufferSize];
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); 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.. |
|
#2
|
|||
|
|||
|
Re: glDrawElements () draws only part of my mesh... What to do.??
Hi,
I don't know much about the OpenGL but it looks like you have a problem with types. The v_ind and i_ind variables are both ints with a max value of 32, 767. I don't know how big your mesh is, but if it has over 11,000 triangles then i_ind will need to be able to reach 33,000 so will wrap round. Try setting the i_ind and v_ind as a unsigned long ints and see what happens. Let me know if that helps. |
|
#3
|
|||
|
|||
|
Re: glDrawElements () draws only part of my mesh... What to do.??
Hi.
Thanks to bring me the notice of the logical mistake.. But it still doesn't work.. With the same above mentioned code, it works for points.. In my previous post i had mentioned [quote]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..[\quote] i.e. if i use [code]glDrawArrays( GL_POINTS, 0, mVertexCount * 3);[\code] it works absolutely fine.. All points are being displayed properly... Any, suggestions..?? Thanks |
![]() |
| Bookmarks |
|
||||||
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|