如何在opengl中使用单个缓冲区对象作为VBO和UBO(也可能是任何其他类型的缓冲区)



我的问题涉及如何在opengl中处理分配。如果使用glGenBuffers(1, &id)创建缓冲区对象,那么假设使用glBindBuffer(GL_ARRAY_BUFFER, id)glBufferData(GL_ARRAY_BUFFER, ...)用网格的顶点数据填充它。我现在的问题是:我上传的数据会具体绑定到GL_ARRAY_BUFFER标签吗?那么,我以后是否可以使用glBindBuffer(GL_UNIFORM_BUFFER, id)并将该数据用作统一缓冲区,或者更改相关目标是否会导致内存释放,迫使我使用glGetBufferSubData来检索并重新上传现在绑定到GL_uniform_buffer标签的数据?只要缓冲区对象没有被删除,它就会保留它的数据,而目标参数更多的是向gpu提示数据可以更优化地存储在哪里,以及可以对缓冲区进行哪些操作,这似乎很直观。这样做对opengl的状态有什么影响?除了双重上传或重新上传之外,还有其他推荐的选择吗。

缓冲区目标对缓冲区的内容没有任何影响。缓冲区本身甚至不知道它绑定到哪个目标。您可以在任何时候将缓冲区绑定到任何其他目标,甚至可以同时绑定到多个目标。

缓冲区目标仅由API用于确定命令应该对哪个缓冲区进行操作。例如,glBufferData要求将缓冲区绑定到传递给它的同一目标。但使用哪个目标并不重要。其他一些命令,如glVertexAttribPointer,期望缓冲区绑定到某个目标,但这里的绑定不会改变/修改缓冲区本身。

请注意,自OpenGL 4.5以来的核心直接状态访问(DSA(方法根本不使用绑定目标,同时提供与有状态方法相同的功能。

相关内容

最新更新