3

我有一种初始化我的 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);

我是否需要GL_ELEMENT_ARRAY_BUFFER在调用后解除绑定,glDrawElements或者它的状态是否“绑定”到 VAO?(所以如果我解除绑定 VAO,GL_ELEMENT_ARRAY_BUFFER也会解除绑定)?

4

2 回答 2

7

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

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

于 2012-12-03T14:08:13.797 回答
0

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

于 2012-12-03T12:29:55.520 回答