gpt4 book ai didi

opengl - VAO 和 GL_ELEMENT_ARRAY_BUFFER 关联

转载 作者:行者123 更新时间:2023-12-04 18:01:43 26 4
gpt4 key购买 nike

我无法理解 VAO 和绑定(bind)到 GL_ELEMENT_ARRAY_BUFFER 的缓冲区之间的关联。 (我们称之为 EBO)。我知道它是 VAO 状态的一部分,但不同于与 glVertexAttribPointer 一起使用的缓冲区。调用(这些缓冲区被 VAO 简单地记住为属性存储,省略了绑定(bind)它们的需要 - 如果我理解正确的话)。
this讨论它声称:

Unlike GL_ARRAY_BUFFER, a VAO store the current binding for GL_ELEMENT_ARRAY_BUFFER. Calling glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) stores a reference to the specified buffer in the currently-bound VAO. glDrawElements() etc take the vertex indices from the buffer stored in the currently-bound VAO. So switching between VAOs switches between element arrays.



但是我需要调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)吗?在绑定(bind)和取消绑定(bind) VAO 以确保它将“保存”它的状态或 VAO 将在创建 VAO 时仅采用当前绑定(bind)的 EBO?
我也不清楚上面引用的答案是否 VAO 只是“知道”(作为属性存储缓冲区)必须从哪些缓冲区索引( glDrawElements )或者 VAO 在绑定(bind) VAO 时绑定(bind)正确的 EBO?

编辑:我的第一个问题已经回答 here ,但是我相信@Rabbid76 回答了第二个问题。

最佳答案

如果您设置正确,则在绘制时您应该只绑定(bind) VAO。这就是重点,避免为每个几何图形重复调用 GL 驱动程序的 CPU 开销。

在初始设置期间,您应该创建和绑定(bind) VAO,然后绑定(bind)所有属性缓冲区并使用 glVertexAttribPointer 描述它们,使用 glEnableVertexAttribArray 启用它们,最后绑定(bind) GL_ELEMENT_ARRAY_BUFFER。之后,我会将 VAO 绑定(bind)为 null,这样您就不会在以下几行中意外绑定(bind)其他内容。

(注意,属性缓冲区本身的glBindBuffer并不是直接记录到VAO中的,而是在glVertexAttribPointer的调用处推断出来的。也就是说,调用glVertexAttribPointer时当前绑定(bind)到GL_ARRAY_BUFFER的东西就是VAO的顶点拉取源.)

在渲染循环期间,您应该绑定(bind)之前创建的不同 VAO。

这有点令人困惑,因为在实践中,有时绑定(bind) VAO 意味着“我想开始录制一个小宏”(在初始设置时),有时绑定(bind) VAO 意味着“我希望你播放我录制的那个宏中的所有绑定(bind)更早”(在渲染时)。它在原始 RFC 中被描述为:

   The currently bound vertex array object is used for all commands
which modify vertex array state, such as VertexAttribPointer and
EnableVertexAttribArray; all commands which draw from vertex arrays,
such as DrawArrays and DrawElements; and all queries of vertex
array state.

https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_vertex_array_object.txt

另请参阅 GL 标准中的表 6.4 和 6.5,以准确了解 VAO 结构中存储了哪些字段:

https://www.khronos.org/registry/OpenGL/specs/gl/glspec32.core.pdf

关于opengl - VAO 和 GL_ELEMENT_ARRAY_BUFFER 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46133849/

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