glBindBuffer和直接状态访问



根据NVIDIA OpenGL 4.5更新演示的幻灯片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);

  • glBindBuffer不是DSA吗
  • 我是错过了另一个更新的DSA功能,还是这是唯一的方法

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

在DSA之前,你只需要绑定一个缓冲区来分配存储、上传数据等。使用DSA函数,你不必这样做。你可以直接将缓冲区传递给用来处理其状态的函数。

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

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

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

但它只需要在您发出该命令时进行绑定。您不必在创建后立即绑定它。就在您实际呼叫glDrawArraysIndirect之前。

相关内容

  • 没有找到相关文章

最新更新