glBindBuffer 和直接状态访问?

glBindBuffer and direct state access?

根据 NVIDIA's OpenGL 4.5 Update presentation 的幻灯片 23,以下内容正确:

非 DSA:glGenBuffers + glBindBuffer

DSA:glCreateBuffers

我尝试编写一个仅 DSA 的程序。在使用 glDrawArraysIndirect 绘图时,我不得不使用 glBindBufferglCreateBuffers


这是工作代码的片段:

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);

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

在 DSA 之前,您必须绑定缓冲区才能分配存储空间、上传数据等。有了 DSA 功能,您就不必这样做了。您将缓冲区直接传递给用于操作其状态的函数。

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

要将缓冲区的存储空间用作 uniform data, it must be bound to the context with glBindBufferRange(GL_UNIFORM_BUFFER (or equivalent calls). To use a buffer to store vertex data, you must attach it to a VAO through glVertexArrayVertexBuffer, then bind that VAO to the context. To use a buffer for pixel transfer operations,您必须使用 glBindBuffer 将缓冲区绑定到适当的位置。等等。

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

但它只需要在您发出该命令时绑定。您不必在创建后立即绑定它。就在您实际调用 glDrawArraysIndirect.

之前