我的代码正在运行,但它可能是巧合,我不想稍后再讨论一个bug,所以我试图尽可能保持它的清洁:
我执行以下操作来初始化网格:
根据我的理解,VAO将存储我启用的顶点属性数组的状态.它还将存储我绑定的VBO和IBO.由于我通过将顶点阵列绑定回0来"关闭"VAO上的所有操作,因此我确保没有其他代码会弄乱我的VAO.所以,如果这样可以,我需要呈现的是:
这应该既可以存储AttribArray状态,也可以存储VBO和IBO.我的问题是:
A.设置VertexAttribPointers后,是否需要绑定IBO?如果是这样,为什么?
B.是否真的VAO存储两者的VBO 和国际文凭组织?我听说它只存储绑定的最后一个缓冲区,这意味着我必须像这样渲染:
但这没有任何意义,为什么在不存储缓冲区对象时使用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);
Run Code Online (Sandbox Code Playgroud)
画画
glBindVertexArray(m_vao);
glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,reinterpret_cast<const GLvoid*>(0));
glBindVertexArray(0); …Run Code Online (Sandbox Code Playgroud)