OpenGL 3.x - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) and VAOs

OpenGL 3.x - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) and VAOs

本文关键字:ARRAY ELEMENT BUFFER VAOs and GL glBindBuffer OpenGL      更新时间:2023-10-16

我有一个初始化VBO/VAO的方法:

        glBindBuffer(GL_ARRAY_BUFFER, mVBO_VertexShader);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

        // setup VAO
        glBindVertexArray(mVAO);
        glBindBuffer(GL_ARRAY_BUFFER, mVBO_VertexShader);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);

然后是单独的绘图方法;

    glBindVertexArray(mVAO);
    glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_SHORT, &mIndexBuffer);
    glBindVertexArray(0);

我是否需要在调用glDrawElements后取消绑定GL_ELEMENT_ARRAY_BUFFER,或者其状态是否与VAO"绑定"?(所以如果我解绑VAO,GL_ELEMENT_ARRAY_BUFFER也会解绑)?

>GL_ELEMENT_ARRAY_BUFFER与VAO状态相关联。我引用 OpenGL 3.3 规范:"生成的顶点数组对象是一个新的状态向量,包含表 6.4 和 6.5 中列出的所有状态值。表 6.4 包含 ELEMENT ARRAY BUFFER BINDING 。所以不,你不需要解绑它。

此外,您可能希望将NULL作为示例中要glDrawElements的最后一个参数传递,因为地址是相对于绑定元素数组缓冲区的

在设置顶点属性指针时绑定顶点数组。所以基本上不要解绑你的顶点数组,因为你只有一个。