根据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功能,或者这是唯一的方法吗?

最佳答案

直接状态访问的目的不是从应用程序中完全删除对象绑定(这是各种“无绑定”扩展的目的)。直接状态访问的目的是使您无需绑定对象即可访问对象的状态(即:直接)。

在DSA之前,您只需要绑定一个缓冲区即可分配存储空间,上传数据等。使用DSA功能,您不必这样做。您将缓冲区直接传递给用于操纵其状态的函数。

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

要将缓冲区的存储用作uniform data,必须使用glBindBufferRange(GL_UNIFORM_BUFFER(或等效调用)将其绑定到上下文。要使用缓冲区存储顶点数据,必须attach it to a VAO through glVertexArrayVertexBuffer,然后将该VAO绑定到上下文。要将缓冲区用于pixel transfer operations,必须使用glBindBuffer将缓冲区绑定到适当的位置。依此类推。

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

但这只需要在发出该命令时绑定。创建后,您不必立即绑定它。在您实际致电glDrawArraysIndirect之前。

09-06 11:37