VAO如何保持缓冲区绑定?

时间:2012-09-28 14:40:40

标签: opengl vertex-buffer

我很难理解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使用绑定的VAO来解析数组和元素缓冲区绑定吗?在Draw调用之后,绑定数组缓冲区为0,但元素缓冲区仍然是用于绘制的缓冲区。

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

1 个答案:

答案 0 :(得分:13)

  

我很难理解VAO究竟是如何处理缓冲区映射的。

使用"映射"时要非常小心周围"缓冲&#34 ;;它有a specific meaning when dealing with buffer objects,你可能不打算。

  

这是正确的,当调用DrawElements时,OpenGL使用绑定的VAO来解析数组和元素缓冲区绑定吗?在Draw调用之后,绑定数组缓冲区为0,但元素缓冲区仍然是用于绘制的缓冲区。

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

"绑定数组缓冲区的原因"调用后为0,因为在调用之前它是0 。绘制调用不会改变OpenGL状态。

此外,你似乎已陷入GL_ARRAY_BUFFER陷阱。 GL_ARRAY_BUFFER绑定仅对三个函数有用:glVertexAttribPointer, glVertexAttribIPointer, and glVertexAttribLPointer(参见模式?)。这些是仅查看该绑定的 函数。他们所做的是在调用这些函数时将绑定的缓冲区并将该缓冲区与当前VAO相关联。 GL_ARRAY_BUFFER 是VAO州的一部分。当您调用这三个函数之一时,缓冲区对象将与仅VAO 关联。拨打电话后,您可以将任意内容绑定到GL_ARRAY_BUFFER

GL_ELEMENT_ARRAY_BUFFER 是VAO州的一部分。

  

在VAO设置期间是否必须分配缓冲存储器?如果在安装后调用BufferData,VAO会失效吗?

技术上没有,但在存储之前不使用缓冲区是一种好形式。特别是如果他们是静态缓冲区。