glBindBuffer和直接状态访问?

时间:2016-05-14 10:43:06

标签: opengl opengl-4

根据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?
  • 我错过了另一个较新的DSA功能还是这是唯一的方法?

1 个答案:

答案 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之前。