在编辑Vao之前必须绑定VBO感到困惑

nx7onnlm  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(175)

我正试图在OpenGL中绘制一个有纹理的立方体。首先,我在类构造函数中初始化VBO和VAO,如下所示。

Block::Block(...)
{
    glGenBuffers(1, &VBO);
    glGenVertexArrays(1, &VAO);
    //glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBindVertexArray(VAO);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)(3 * 
    sizeof(float)));
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)(6 * 
    sizeof(float)));
    glEnableVertexAttribArray(2);
}

在名为renderBlock()的方法中,我以如下方式呈现立方体

void Block::renderBlock()
{
    setMatrix();
    shader.use();
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBindVertexArray(VAO);

    glActiveTexture(GL_TEXTURE0);
    shader.setInt("tex", 0);

    shader.use();
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glBindTexture(GL_TEXTURE_2D, texture);
    glBindVertexArray(VAO);

    glDrawArrays(GL_TRIANGLES, 0, 6);
}

如果我调用lock.renderBlock(),程序将在glDrawArrays(GL_TRIANGLES, 0, 6);崩溃。错误消息显示0xC0000005: Access conflict occurred at read position 0x0000000000000000.。但如果我在构造函数中取消对//glBindBuffer(GL_ARRAY_BUFFER, VBO);的注解,程序将成功运行。这让我很困惑。为什么我要在编辑VAO之前绑定VBO。他们之间有什么联系吗?任何建议都将不胜感激。

kxkpmulp

kxkpmulp1#

在调用glVertexAttribPointer之前,必须绑定VBO。当调用glVertexAttribPointer时,当前绑定到GL_ARRAY_BUFFER target的缓冲区与指定的属性索引相关联,并且缓冲区对象的ID存储在当前绑定的VAO的状态向量中。因此,在调用glVertexAttribPointer之前,必须绑定Vao和VBO。

相关问题