Sign in to follow this  
Kaptein

Indices and vertices

Recommended Posts

I'm converting a "huge" pipeline to support indices, and I have a strange problem.

 

Each vertex array can be still drawn on its own, since I'm in the "make it work stage." So I thought I would start with mapping each vertex in a one-to-one mapping to indices. Considering that the vertex order contains the correct winding/order to represent the terrain properly, this shouldn't be a problem, right?

 

Because it's not working. And I'm slowly going crazy. My entire indices array is basically a sequential array of numbers 0->N-1 where N is the number of vertices. There are small constant patches of terrain that contain errors.

 

This should work, and I'm just looking for a bug of my own creation, right?

 

Share this post


Link to post
Share on other sites

Do you have primitive restarting enabled, and if so are any of your indices the primitive restart value?

Share this post


Link to post
Share on other sites

No, but thanks for the tip. I set it to 65535 (and disabled just in case)

 

It's looking more and more like my own fault. I'm assembling a generated terrain from parts that are sorted by shader.

I'm writing every single test I can come up with, but everything is just right.. The problem is that I don't understand where my logic fails. =)

What a classic.

 

Looks like I'll be showering and toileteering alot to find this logic error.

Edited by Kaptein

Share this post


Link to post
Share on other sites

I find unlikely a mesh terrain can generate perfectly sequential index arrays. Are you sure the filter is pulling up the correct values?

If your terrain is 2D, use height maps directly. They're both easier and more efficient.

 

In general, to take two vertex buffers and concatenate them to fit a single one, there are two approaches (in case this is what you're asking)

  1. Mark the corresponding drawcall to use an index offset (fast, but cannot be batched)
  2. Use a buffer offset (as above but slower, not recommended)
  3. As you upload the indices, add the count of previously loaded vertices (slow, but only once at loading time, can be batched).
Edited by Krohm

Share this post


Link to post
Share on other sites

Yes, I'm currently doing #3.

 

 

I finally found the problem, completely by mistake:

glDrawElements(GL_QUADS, cv->indices[i], GL_UNSIGNED_SHORT, (GLvoid*) (intptr_t) (cv->indexoffset[i]*2));

 

For some reason, the "offset" value is in bytes. I just multiplied by 2 there just to see how fast it would crash.

It boggles the mind.

Edited by Kaptein

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