根据NVIDIA OpenGL 4.5更新演示的幻灯片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功能,还是这是唯一的方法
直接状态访问的目的不是从应用程序中完全删除对象绑定(这将是各种"无绑定"扩展的目的)。直接状态访问的目的是允许您访问对象的状态,而不必绑定它(即:直接ly)。
在DSA之前,你只需要绑定一个缓冲区来分配存储、上传数据等。使用DSA函数,你不必这样做。你可以直接将缓冲区传递给用来处理其状态的函数。
但是,要在渲染过程中实际使用缓冲区,您仍然必须将其绑定到上下文,或者将其附加到其他对象,这些对象本身将绑定到上下文。
要将缓冲区的存储用作统一数据,必须使用glBindBufferRange(GL_UNIFORM_BUFFER
(或等效调用)将其绑定到上下文。若要使用缓冲区存储顶点数据,必须通过glVertexArrayVertexBuffer
将其附加到VAO,然后将该VAO绑定到上下文。要将缓冲区用于像素传输操作,必须使用glBindBuffer
将缓冲区绑定到适当的位置。等等
使用缓冲区作为间接命令执行的源也是如此。这是一个渲染操作,因此在发出间接命令之前,缓冲区必须绑定到间接目标。
但它只需要在您发出该命令时进行绑定。您不必在创建后立即绑定它。就在您实际呼叫glDrawArraysIndirect
之前。