Jump to content

  • Log In with Google      Sign In   
  • Create Account


Stream Buffering with indexs


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 Dekowta   Members   -  Reputation: 260

Like
0Likes
Like

Posted 28 December 2012 - 11:59 AM

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



Sponsor:

#2 Dekowta   Members   -  Reputation: 260

Like
0Likes
Like

Posted 01 January 2013 - 11:06 AM

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.


 



#3 mhagain   Crossbones+   -  Reputation: 7644

Like
1Likes
Like

Posted 02 January 2013 - 05:42 AM

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).


It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#4 Dekowta   Members   -  Reputation: 260

Like
0Likes
Like

Posted 02 January 2013 - 10:07 AM

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.



#5 Dekowta   Members   -  Reputation: 260

Like
0Likes
Like

Posted 02 January 2013 - 10:35 AM

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.



#6 mhagain   Crossbones+   -  Reputation: 7644

Like
1Likes
Like

Posted 02 January 2013 - 11:37 AM

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).


It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.


#7 Dekowta   Members   -  Reputation: 260

Like
0Likes
Like

Posted 03 January 2013 - 05:44 AM

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.

Edited by Dekowta, 03 January 2013 - 06:36 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS