Sign in to follow this  
Followers 0
Funkymunky

unbind VBO, draw vertex array, rebind VBO?

3 posts in this topic

If I'm drawing a whole bunch of data from a VBO, is it terrible practice to unbind the VBO, render some stuff with a standard vertex array, then rebind the VBO and continue drawing from it?  Or is it better to just switch to a different VBO for that middle render?

0

Share this post


Link to post
Share on other sites

In the modern API, you are required to use VBO for all vertex arrays, so if you can use VBO then there's no reason why you should use VBO for only some of your vertex arrays. Get in line with the new API and use VBO for all your vertex arrays.

0

Share this post


Link to post
Share on other sites
In the modern API, you are required to use VBO for all vertex arrays, so if you can use VBO then there's no reason why you should use VBO for only some of your vertex arrays. Get in line with the new API and use VBO for all your vertex arrays.

 

The core profile for OpenGL 4.3 says no such thing. Certainly the old fixed function pointer methods have been removed (e.g. glVertexPointer), but glVertexAttribPointer can be used to specify system memory based vertex arrays. Even glVertexAttrib3f() is still part of the core spec. There is what seems to be a typo in the online GL docs, where is says the INVALID_OPERATION will be generated if no ARRAY_BUFFER is bound, and the pointer is not NULL (which makes no sense, since that would mean using 0 for the array buffer, and null for the pointer would be valid). I'm guessing that's where the confusion has arisen from.

0

Share this post


Link to post
Share on other sites
In the modern API, you are required to use VBO for all vertex arrays, so if you can use VBO then there's no reason why you should use VBO for only some of your vertex arrays. Get in line with the new API and use VBO for all your vertex arrays.

 

The core profile for OpenGL 4.3 says no such thing. Certainly the old fixed function pointer methods have been removed (e.g. glVertexPointer), but glVertexAttribPointer can be used to specify system memory based vertex arrays.

Version 4.3 core specification, section 10.8.3, page 304; last sentence says "If any enabled array’s buffer binding is zero when DrawArrays or one of the
other drawing commands defined in section 10.5 is called, the result is undefined
." Thus, it is an error to draw with the zero-buffer bound; an array must therefore have a non-zero buffer binding.

 

There is what seems to be a typo in the online GL docs, where is says the INVALID_OPERATION will be generated if no ARRAY_BUFFER is bound, and the pointer is not NULL (which makes no sense, since that would mean using 0 for the array buffer, and null for the pointer would be valid). I'm guessing that's where the confusion has arisen from.

Even the specification itself says that: page 299 in the definition of glVertexAttribArray.
 

Even glVertexAttrib3f() is still part of the core spec.

glVertexAttrib*() is used to set the default attribute value for attributes that doesn't have an enabled buffer attached to it. I don't see what it has to do with my comment you questioned though.

0

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  
Followers 0