unbind VBO, draw vertex array, rebind VBO?

Started by
2 comments, last by Brother Bob 11 years, 3 months ago

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?

Advertisement

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.

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.

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.

This topic is closed to new replies.

Advertisement