我正在尝试将顶点数组对象与顶点缓冲区&组合。使用Qt的索引缓冲区。
以下代码结合了VAO和VBO,完美运行:
// Create buffers
void Tile::setupBuffers() {
vbo.create();
vbo.bind();
vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D));
vbo.release();
vao.create();
shaderProgram->bind();
vao.bind();
vbo.bind();
shaderProgram->enableAttributeArray(0);
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);
vao.release();
shaderProgram->disableAttributeArray(0);
vbo.release();
shaderProgram->release();
}
// Draw triangle
void Tile::draw() {
shaderProgram->bind();
vao.bind();
glDrawArrays(GL_TRIANGLES, 0, 3);
vao.release();
shaderProgram->release();
}
当我现在尝试添加索引缓冲区时,除了清晰的颜色外,不会绘制任何内容。这是代码:
// Create buffers
void Tile::setupBuffers() {
vbo.create();
vbo.bind();
vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D));
vbo.release();
ibo.create();
ibo.bind();
ibo.setUsagePattern(QOpenGLBuffer::StaticDraw);
ibo.allocate(indices.constData(), indices.size() * sizeof(GLushort));
ibo.release();
vao.create();
shaderProgram->bind();
vao.bind();
vbo.bind();
shaderProgram->enableAttributeArray(0);
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);
ibo.bind();
vao.release();
shaderProgram->disableAttributeArray(0);
vbo.release();
ibo.release();
shaderProgram->release();
}
void Tile::draw() {
shaderProgram->bind();
vao.bind();
glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);
vao.release();
shaderProgram->release();
}
这是我的顶点矢量&的内容。索引向量:
vertices = {
QVector3D(1.0f, -1.0f, 0.0f),
QVector3D(1.0f, 1.0f, 0.0f),
QVector3D(-1.0f, -1.0f, 0.0f)
};
indices = {
0, 1, 2
};
我假设在第二个代码块中绑定VAO / VBO / IBO的顺序是错误的,我只是不知道它是如何正确完成的。任何帮助表示赞赏。
答案 0 :(得分:2)
GLushort
您的索引是GL_INVALID_ENUM
s,而不是浮点数。您应该收到shaderProgram->disableAttributeArray(0);
错误;你应该经常检查GL错误。
此外,shaderProgram->enableAttributeArray(0);
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);
完全没必要。启用/禁用状态是VAO的一部分(相反,Qt的愚蠢包装)。由于您取消了该属性,因此禁用该属性不会更改VAO。而且你无论如何也不想禁用它。
最后,有这个:
|
这两个函数的第一个参数应该相同。他们可能是,所以这更像是一个良性的错误。但它仍然是错误的。