opengl - glBindBuffer 和直接状态访问?

标签 opengl opengl-4

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

最佳答案

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

在 DSA 之前,您必须绑定(bind)缓冲区才能分配存储、上传数据等。使用 DSA 功能,您不必这样做。您可以将缓冲区直接传递给用于操作其状态的函数。

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

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

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

但它只需要在您发出该命令时绑定(bind)。您不必在创建后立即绑定(bind)它。就在您实际调用 glDrawArraysIndirect 之前。

关于opengl - glBindBuffer 和直接状态访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225635/

相关文章:

c++ - 对齐 SSBO 的内存(它是包含数组的结构数组)?

opengl - 使用 assimp 加载不同的纹理类型

c++ - 使用 glMapBuffer 用一个缓冲区渲染多个对象?

c++ - glBufferSubData 导致未处理的异常 : 0xC0000005

ios - OpenGL 4.1 中顶点数组对象未正确绑定(bind)

opengl - 非索引渲染中的 gl_VertexID

c++ - OpenGL - 从顶点着色器访问缓冲区中的下 3 个顶点

c# - 可能的渲染性能优化

c++ - 在现代游戏设计中,游戏的哪些部分被编写为可移植的?

opengl - gl_PrimitiveID 在曲面分割控制和评估着色器中如何解释?