gpt4 book ai didi

opengl - VAO 如何保持缓冲区绑定(bind)?

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

我很难理解 VAO 到底是如何处理缓冲区映射的。我正在做的事情可以用这个伪代码来描述:

SetUp:
BindVAO
BindArrayBuffer
glBufferData(GL_ARRAY_BUFFER, ExpectedMaxCount, NULL, GL_DYNAMIC_DRAW);//Allocate storage
glEnableVertexAttribArray
glVertexAttribPointer

BindElementBuffer
Allocate storage (no data yet)

UnbindVAO
UnbindArrayBuffer
UnbindElementBuffer

Draw:
SubArrayAndElementDataIfNeeded
BindVAO
DrawElements
  1. 当调用 DrawElements 时,OpenGL 使用绑定(bind)的 VAO 来解析数组和元素缓冲区绑定(bind),这是否正确?在 Draw 调用之后,绑定(bind)数组缓冲区为 0,但元素缓冲区仍然是用于 Draw 的缓冲区。

  2. 在VAO设置期间是否强制分配缓冲存储器?如果设置后调用BufferData,VAO会失效吗?

最佳答案

I am struggling to understand how exactly VAO is handling buffer mapping.

在“缓冲区”周围使用“映射”一词时要非常小心;有 a specific meaning when dealing with buffer objects ,您可能不希望出现这种情况。

Is this correct that when DrawElements is called OpenGL uses bound VAO to resolve array and element buffer bindings? After a Draw call the bound array buffer is 0, but element buffer is still the one that was used to Draw.

一个与另一个无关。一个Vertex Array Object顾名思义,包含从数组中提取顶点数据所需的所有状态。当您绑定(bind)一个时,所有该状态都会返回到上下文中。

调用后“绑定(bind)数组缓冲区”为 0 的原因是因为在调用之前它为 0。绘制调用不会更改 OpenGL 状态。

此外,您似乎陷入了 GL_ARRAY_BUFFER 陷阱。 GL_ARRAY_BUFFER 绑定(bind)仅对三个函数重要:glVertexAttribPointer, glVertexAttribIPointer, and glVertexAttribLPointer (看到模式了吗?)。这些是查看该绑定(bind)的唯一函数。它们所做的就是获取调用这些函数时绑定(bind)的缓冲区,并将该缓冲区与当前的 VAO 关联起来。 GL_ARRAY_BUFFER 不是 VAO 状态的一部分。仅当您调用这三个函数之一时,缓冲区对象才会与 VAO 关联。进行该调用后,您可以将任何想要的内容绑定(bind)到 GL_ARRAY_BUFFER

GL_ELEMENT_ARRAY_BUFFER VAO 状态的一部分。

Is it mandatory to allocate buffer memory during VAO setup? Would VAO be invalidated if BufferData was called after setup?

技术上不可以,但在缓冲区有存储空间之前不使用它是一种很好的形式。特别是如果它们是静态缓冲区。

关于opengl - VAO 如何保持缓冲区绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642167/

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