其他分享
首页 > 其他分享> > c – OpenGL 3.x – glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)和VAO

c – OpenGL 3.x – glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)和VAO

作者:互联网

我有一个初始化我的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的最后一个参数传递,因为该地址是相对于绑定元素数组缓冲区的.

标签:opengl-3,c,opengl
来源: https://codeday.me/bug/20190823/1696139.html