Sign in to follow this  
GlassBil

Problem with glDrawElements when using indices

Recommended Posts

GlassBil    100
Hi, I have the following data structure of my heightmap: GLfloat **vertices; // Vertices GLuint *indices; // Vertex indices bool mesh; // Mesh ON/OFF GLfloat **normals; // Triangle normals int sizeX; // Terrain "width" (in pixels) int sizeZ; // Terrain "height" (in pixels) int numTriangles; // Number of triangles vertices is [sizeX*sizeZ][3], where sizeX*sizeZ is the area of my heightmap. normals are stored like [numTriangles][3] where numTriangles is (sizeX - 1)*(sizeZ - 1)*2. It all works fine when I draw it like this: for(int i = 0, n = 0; i < 3 * numTriangles; i = i + 3, n++) { if(mesh) { glBegin(GL_LINE_STRIP); } else { glBegin(GL_TRIANGLES); } glNormal3fv(normals[n]); glVertex3fv(vertices[indices[i]]); glVertex3fv(vertices[indices[i+1]]); glVertex3fv(vertices[indices[i+2]]); glEnd(); } However, I want to draw it with glDrawElements. I use the following code and it doesn't work: glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glNormalPointer(GL_FLOAT, 0, normals); if(mesh) { glDrawElements(GL_LINE_STRIP, 3 * numTriangles, GL_UNSIGNED_INT, indices); } else { glDrawElements(GL_TRIANGLES, 3 * numTriangles, GL_UNSIGNED_INT, indices); } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); Any idea what I'm doing wrong? I've been searching the web and I've noticed that most people store the vertices in a 1D array instead of a 2D array. Do I have to do that to make it work? A 2D array feels more intuitive. :) //GlassBil

Share this post


Link to post
Share on other sites
Brother Bob    10344
You can store your vertices in a 2D-array if you want, but that's not what you're doing. You're storing them in an array of pointers to vertices, which is an entirely different layout in memory and is not compatible with OpenGL's vertex arrays. The pointer passed to OpenGL is assumed to point to the vertex data, but instead you point to pointers to vertex data.

If you want to store them in a dynamic 2D-array, make an array of arrays, not an array of pointers.

GLfloat (*vertices)[3];
GLfloat (*normals)[3];
...
vertices = new vertices[numVertices][3];
normals = new vertices[numnormals][3];

These arrays are compatible with OpenGL, because they point an array of vertices, not to an array of pointers to vertices.

Share this post


Link to post
Share on other sites
GlassBil    100
Thanks alot! That helped. I have one issue still though.

I believe it's the normals that are the issue. Do I have to store one normal for every vertex, or one normal for every triangle when using DrawElements? (As in, does DrawElement use indices to look up the normals?)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this