Opengl VAO如何保持缓冲区绑定?

Opengl VAO如何保持缓冲区绑定?,opengl,vertex-buffer,Opengl,Vertex Buffer,我很难理解VAO到底是如何处理缓冲区映射的。 我所做的可以用以下伪代码描述: SetUp: BindVAO BindArrayBuffer glBufferData(GL_ARRAY_BUFFER, ExpectedMaxCount, NULL, GL_DYNAMIC_DRAW);//Allocate storage glEnableVertexAttribArray glVertexAttribPointer BindElementBuffer Allocate

我很难理解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
  • 当调用抽屉元素时,OpenGL使用绑定VAO来解析数组和元素缓冲区绑定是否正确?在绘制调用之后,绑定的数组缓冲区为0,但元素缓冲区仍然是用于绘制的缓冲区

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

  • 我很难理解VAO到底是如何处理缓冲区映射的

    在“缓冲区”周围使用“映射”一词时要非常小心;这是一个你可能不想做的事情

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

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

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

    此外,您似乎陷入了
    GL\u数组\u缓冲区
    陷阱。
    GL\u ARRAY\u BUFFER
    绑定只与三个函数有关:(查看模式?)。这些是查看该绑定的唯一函数。它们所做的是获取在调用这些函数时绑定的缓冲区,并将该缓冲区与当前VAO关联<代码>GL_数组_缓冲区
    不是VAO状态的一部分。只有在调用这三个函数之一时,缓冲区对象才会与VAO关联。一旦您进行了该调用,您就可以绑定任何您想要的
    GL\u ARRAY\u BUFFER

    GL\u元素\u数组\u缓冲区是VAO状态的一部分

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


    从技术上讲,没有,但最好在缓冲区有存储之前不使用缓冲区。尤其是当它们是静态缓冲区时。

    在OpenGL中没有“设置”这样的东西。虽然必须将VAO绑定回去,但您可以自己定义何时设置。@theAmateurProgrammer:从概念上讲,您正在设置一个VAO,为什么不将其放入一个单独的函数中?当VAO的缓冲区关联(由
    glVertexAttrib*指针设置)被破坏时?解除绑定VAO后?或者只是绑定到另一个数组缓冲区?@id256:我不知道你的问题是什么意思。只有通过后续调用
    glVertexAttrib*指针
    ,关联才会被“破坏”。VAO的全部意义在于它保留了这种状态,这种状态是在VAO中设置的。所以,只有当你故意明确地改变它时,它才会丢失。是的,我显然应该用双引号“break”。谢谢你的解释。