【发布时间】:2013-06-27 00:28:28
【问题描述】:
我的代码运行正常,但这可能是巧合,我不想稍后再纠缠于错误,所以我尽量保持它的整洁:
我执行以下操作来初始化网格:
- 生成并绑定 VBO 和缓冲区数据
- 生成和绑定 IBO 和缓冲区数据
- 生成和绑定 VAO
- 绑定与之前相同的 VBO,在 1 中生成。
- 启用我需要的顶点属性数组并设置顶点属性指针
- 再次绑定 IBO(不知道为什么)
- BindVertexArray 回到 0,这样我就不会弄乱我刚刚创建的 VAO
据我了解,VAO 将存储我启用的顶点属性数组的状态。它还将存储我绑定的 VBO 和 IBO。由于我通过将顶点数组绑定回 0 “关闭”了 VAO 上的所有操作,因此我确保没有其他代码会弄乱我的 VAO。所以如果这没问题,我只需要渲染:
- 绑定 VAO
- 绘制元素
- 解除绑定 VAO(绑定到 0)
这应该带来 AttribArray 状态以及存储的 VBO 和 IBO。我的问题是:
A. 设置 VertexAttribPointers 后是否需要绑定 IBO?如果有,为什么?
B. VAO 是否真的存储 VBO 和 IBO?我听说它只存储绑定的 last 缓冲区,这意味着我必须像这样渲染:
- 绑定 VAO
- 绑定 VBO
- 绘制元素
- 解除绑定 VAO
但这没有任何意义,为什么在不存储两个缓冲区对象的情况下使用 VAO?不就是绑定 VBO 和 IBO,然后绘制元素而不绑定 VAO 一样吗?
提前感谢您的帮助。
代码如下:
初始化
// generate VBO
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, m_vertices.size()*sizeof(GLfloat), m_vertices.data(), GL_STATIC_DRAW);
// generate IBO
glGenBuffers(1, &m_ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size()*sizeof(unsigned short), m_indices.data(), GL_STATIC_DRAW);
// generate VAO
glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
// set the vertex attribute pointer
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,vertexSize,reinterpret_cast<const GLvoid*>(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBindVertexArray(0);
绘图
glBindVertexArray(m_vao);
glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,reinterpret_cast<const GLvoid*>(0));
glBindVertexArray(0);
另外,这样写是不是更干净:
- 生成和绑定 VAO
- 生成并绑定 IBO 和 BufferData
- 生成并绑定 VBO 和 BufferData
- EnableVertexAttribArrays 我需要并设置 VertexAttribPointers
- 解除绑定 VAO(绑定到 0)
看起来更干净,但我不知道结果是否相同,特别是在第 4 步和第 5 步之间缺少 IBO 绑定。
【问题讨论】: