我正试图在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。他们之间有什么联系吗?任何建议都将不胜感激。
1条答案
按热度按时间kxkpmulp1#
在调用
glVertexAttribPointer
之前,必须绑定VBO。当调用glVertexAttribPointer
时,当前绑定到GL_ARRAY_BUFFER target
的缓冲区与指定的属性索引相关联,并且缓冲区对象的ID存储在当前绑定的VAO的状态向量中。因此,在调用glVertexAttribPointer
之前,必须绑定Vao和VBO。