gpt4 book ai didi

opengl - glBindBuffer 和直接状态访问?

转载 作者:行者123 更新时间:2023-12-02 02:17:47 24 4
gpt4 key购买 nike

根据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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com