VAO如何保持缓冲区绑定?

Kim*_*imi 9 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
Run Code Online (Sandbox Code Playgroud)
  1. 这是正确的,当调用DrawElements时,OpenGL使用绑定的VAO来解析数组和元素缓冲区绑定吗?在Draw调用之后,绑定数组缓冲区为0,但元素缓冲区仍然是用于绘制的缓冲区.

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

Nic*_*las 13

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

在"缓冲区"周围使用"映射"一词时要非常小心; 在处理缓冲区对象时具有特定含义,这可能是您不想要的.

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

一个与另一个无关.甲顶点数组对象,顾名思义,包含所有这需要从阵列拉顶点数据的状态的.当你绑定一个时,所有状态都会回到上下文中.

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

此外,你似乎已陷入GL_ARRAY_BUFFER陷阱.该GL_ARRAY_BUFFER只事项三种功能结合:glVertexAttribPointer,glVertexAttribIPointer,和glVertexAttribLPointer(见模式?).这些是查看该绑定的唯一函数.他们所做的是获取调用这些函数时绑定的缓冲区,并将该缓冲区与当前VAO相关联.GL_ARRAY_BUFFER不是该VAO的部分状态.只有在调用这三个函数之一时,缓冲区对象才会与VAO关联.拨打电话后,您可以绑定任何您想要的内容GL_ARRAY_BUFFER.

GL_ELEMENT_ARRAY_BUFFER VAO州的一部分.

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

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