根据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
之前。