glBindBuffer和直接状态访问?

Tek*_*Tek 3 opengl opengl-4

根据NVIDIA OpenGL 4.5 Update演示文稿的幻灯片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);
Run Code Online (Sandbox Code Playgroud)
  • glBindBuffer无DSA?
  • 我错过了另一个较新的DSA功能还是这是唯一的方法?

Nic*_*las 5

直接状态访问的目的不是完全从应用程序中删除对象绑定(这将是各种"无绑定"扩展的目的).直接状态访问的目的是允许您访问对象的状态不必绑定它(即:直接访问).

在DSA之前,您必须绑定缓冲区以分配存储,上传数据等.使用DSA功能,您不必这样做.您将缓冲区直接传递给用于操作其状态的函数.

但是要在渲染过程中实际使用缓冲区,您仍然必须将其绑定到上下文或将其附加到其他自身将绑定到上下文的对象.

要将缓冲区的存储用作统一数据,必须使用glBindBufferRange(GL_UNIFORM_BUFFER(或等效调用)将其绑定到上下文.要使用缓冲区存储顶点数据,必须将其附加到VAOglVertexArrayVertexBuffer,然后将该VAO绑定到上下文.要使用缓冲区进行像素传输操作,必须将缓冲区绑定到适当的位置glBindBuffer.等等.

使用缓冲区作为间接命令执行的源也是如此.这是一个渲染操作,因此在发出间接命令之前,缓冲区必须绑定到间接目标.

但它只需要在发出该命令时受到约束.您不必在创建后立即绑定它.就在你真正打电话之前glDrawArraysIndirect.