根据NVIDIA's OpenGL 4.5 Update presentation的第23张幻灯片以下说法正确的是:
非 DSA:glGenBuffers + glBindBuffer
DSA:glCreateBuffers
我尝试编写一个仅 DSA 的程序。使用 glDrawArraysIndirect
进行绘制时,我被迫使用 glBindBuffer
以及 glCreateBuffers
这是工作代码的片段:
glCreateBuffers(1, &bufObj);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash
glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW);
...
glDrawArraysIndirect(GL_TRIANGLES, 0);
<小时/>
glBindBuffer
是非 DSA 吗?- 我是否缺少另一个较新的 DSA 功能,还是这是唯一的方法?
最佳答案
直接状态访问的目的不是从应用程序中完全删除对象绑定(bind)(这将是各种“无绑定(bind)”扩展的目的)。直接状态访问的目的是允许您访问对象的状态而无需绑定(bind)它(即:直接ly)。
在 DSA 之前,您必须绑定(bind)缓冲区才能分配存储、上传数据等。使用 DSA 功能,您不必这样做。您可以将缓冲区直接传递给用于操作其状态的函数。
但要在渲染过程中实际使用缓冲区,您仍然必须将其绑定(bind)到上下文或将其附加到其他对象,该对象本身将绑定(bind)到上下文。
将缓冲区的存储用作 uniform data ,它必须使用 glBindBufferRange(GL_UNIFORM_BUFFER
(或等效调用)绑定(bind)到上下文。要使用缓冲区存储顶点数据,您必须 attach it to a VAO through glVertexArrayVertexBuffer
,然后将该 VAO 绑定(bind)到上下文。要使用pixel transfer operations 的缓冲区,您必须使用 glBindBuffer
将缓冲区绑定(bind)到适当的位置。依此类推。
使用缓冲区作为间接命令执行的源也是如此。这是一个渲染操作,因此在发出间接命令之前必须将缓冲区绑定(bind)到间接目标。
但它只需要在您发出该命令时绑定(bind)。您不必在创建后立即绑定(bind)它。就在您实际调用 glDrawArraysIndirect
之前。
关于opengl - glBindBuffer 和直接状态访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225635/