对编辑VAO之前必须绑定VBO感到困惑

  • 本文关键字:VBO 绑定 VAO 编辑 c++ opengl
  • 更新时间 :
  • 英文 :


我正试图在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);
}

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

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

最新更新