根据NVIDIA's OpenGL 4.5 Update presentation的幻灯片23,以下情况属实:
非DSA :glGenBuffers + glBindBuffer
DSA :glCreateBuffers
我尝试过编写仅限DSA的程序。在使用module app
绘制时,我强迫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);
非DSA?答案 0 :(得分:5)
直接状态访问的目的不是完全从应用程序中删除对象绑定(这将是各种"无绑定"扩展的目的)。直接状态访问的目的是允许您访问对象的状态,而不必绑定它(即: direct 强> LY)。
Pre-DSA,您必须绑定缓冲区才能分配存储空间,上传数据等。使用DSA功能,您不必这样做。您将缓冲区直接传递给用于操纵其状态的函数。
但是要在渲染过程中实际使用缓冲区,您仍然必须将其绑定到上下文或将其附加到其他自身将绑定到上下文的对象。
要将缓冲区的存储用作uniform data,必须将其绑定到具有glBindBufferRange(GL_UNIFORM_BUFFER
(或等效调用)的上下文。要使用缓冲区存储顶点数据,必须attach it to a VAO through glVertexArrayVertexBuffer
,然后将该VAO绑定到上下文。要为pixel transfer operations使用缓冲区,必须使用glBindBuffer
将缓冲区绑定到适当的位置。等等。
使用缓冲区作为间接命令执行的源也是如此。这是一个渲染操作,因此在发出间接命令之前,缓冲区必须绑定到间接目标。
但是只需要在发出该命令时绑定它。您不必在创建后立即绑定它。就在您实际致电glDrawArraysIndirect
之前。