Stream Buffering with indexs

Started by
5 comments, last by Dekowta 11 years, 3 months ago

Hi,

A while ago I was recommended to use buffer streaming to pass data across to the GPU.

Now the problem im currently having is I have set up an index buffer to reduce the size of the data being passed to the VBO however when the next buffer is orphaned the next draw glitch out and seem to connect to the other sprites.

Hopefully this image should show the issue. The lower sprite also flickers.


jf69H.png

I use the following method to render.


if (m_BufferOffset +  (SpriteCount * m_spriteSize) >= m_BufferSize)
{
   VBO->setBufferData(m_BufferSize, NULL, GL_STREAM_DRAW);
   m_BufferOffset = 0;
}

VertexPosTexCol* mappedData = (VertexPosTexCol*)VBO->mapRange(m_BufferOffset, m_BufferOffset +   (SpriteCount  * m_spriteSize));

//Set all the sprite data

glBindTexture(GL_TEXTURE_2D, m_LastTexture);
VBO->unmap();

IBO->bind();

glDrawElements(GL_TRIANGLES, SpriteCount * 6, GL_UNSIGNED_INT, NULL);
        
m_BufferOffset += (SpriteCount * m_spriteSize);

IBO->unbind();

VBO->unbind();
//unbind the texture
glBindTexture(GL_TEXTURE_2D, 0);


The index buffer is fixed to 4096 sprite index's so I can only render 4096 sprites before I have have to call draw elements again (unless the texture changes).

At the moment the buffer size is fixed to accomidate for 4096 sprites as well so In the image there are 4096 sprites rendered on the higher sprite and then the lower sprite is the 4097 so it will use a new buffer to send the data across.

Im not sure if there is anything I am missing or if I have explained anything incorrectly but Im sure im doing something wrong otherwise I wouldnt not be getting this issue.

Thanks

Advertisement

I still have not been able to get this working with an index buffer.

Am I correct in thinking that each time I Bind the IBO and then Draw elements it starts at 0 in the IBO? Then when I unbind the IBO it will go back to 0 ready for the next draw call.

If not then that is the problem but I still haven't worked out a solution for it.


Binding a GL_ELEMENT_ARRAY_BUFFER doesn't affect any buffer offsets - these are actually specified in the last param of your glDrawElements call, which I see is always NULL in your code, meaning that it will always draw from the start of your index buffer. You probably should be using "(void *) m_BufferOffset" instead (I say "probably" because I'm guessing based on the rest of your code).

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

That seemed to work. Had to set the last param to the same offset but in with int's instead of the VertexPosTexCol size.

I thought the last param of the glDrawElements was for passing a index array accross without using a buffer or does it change when a IBO is applied.

Thanks a lot for the help though.

Ended up saying that it worked a little too soon.

Its not causing any graphical issues like in the image but its now very temperamental on what it renders.

I'm going to mess around a little to try and solve it. I thought its due to the index buffer being fixed to a smaller size than the vertex buffer so when the buffer size gets too big it wont be able to find a the address to start at for the index's.

I thought the last param of the glDrawElements was for passing a index array accross without using a buffer or does it change when a IBO is applied.

Yes, the last param of glDrawElements is interpreted as an offset into the index buffer when a non-zero GL_ELEMENT_ARRAY_BUFFER is bound.

The info I gave in my previous post is actually incorrect (my bad) - using m_BufferOffset shouldn't work as that's the offset into your vertex buffer; you need to specify a separate offset into your index buffer calculated from the first index to draw and the size of your index format type (unsigned int in this case).

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

I set the last param to (void*)0 because I wish to start at 0 of the IBO because I have a limit of 4096 quads in the IBO which I can draw at one time but I may need to draw a set of 4096 and then 89 or something after and I would need to start at 0 again.

How ever it still refused to draw some of the sprites.

This topic is closed to new replies.

Advertisement