该错误似乎是由于未禁用属性数组并正确释放缓冲区对象所致。以下代码正常工作。
绘制缓冲顶点:
// Bind array buffer
arrayBuffer->bind();
int posLocation = program->attributeLocation("a_position");
int colorLocation = program->attributeLocation("a_color");
program->enableAttributeArray("a_position");
program->enableAttributeArray("a_color");
program->setAttributeBuffer(posLocation, GL_FLOAT, 0, 3, sizeof(ColoredVertex));
program->setAttributeBuffer(colorLocation, GL_FLOAT, sizeof(QVector3D), 3, sizeof(ColoredVertex));
// Bind index buffer and draw triangles
indexBuffer->bind();
glDrawElements(GL_TRIANGLES, indicesCount(), GL_UNSIGNED_INT, 0);
indexBuffer->release();
program->disableAttributeArray(posLocation);
program->disableAttributeArray(colorLocation);
arrayBuffer->release();
绘制非缓冲顶点(面):
if (faces.size() == 0) {
qDebug("Tried to draw a textured block with no faces.");
return;
}
int posLocation = program->attributeLocation("a_position");
int texcoordLocation = program->attributeLocation("a_texcoord");
program->enableAttributeArray(posLocation);
program->enableAttributeArray(posLocation);
program->enableAttributeArray(texcoordLocation);
program->enableAttributeArray(texcoordLocation);
// Draw faces
QHashIterator<Block::Side, Face> iterator(faces);
while (iterator.hasNext()) {
Face face = iterator.next().value();
program->setAttributeArray(posLocation, face.coordinates.constData());
program->setAttributeArray(texcoordLocation, face.textureCoordinates.constData());
glDrawArrays(GL_TRIANGLES, 0, face.coordinates.size());
}
program->disableAttributeArray(posLocation);
program->disableAttributeArray(texcoordLocation);