我正在使用顶点数组(Vertex Array)快速地绘制许多三角形:
void initializeGL() {
...
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
}
void paintGL() {
...
glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, indices);
}
然而,我希望通过使用顶点缓冲对象(VBO)来进一步加快渲染速度。
我的理解是否正确:glVertexPointer()告诉GPU从CPU哪里获取顶点数据,然后GPU在每个paintGL()中从CPU的这个位置复制它?
使用VBO会改善这种情况,因为它只会将顶点数据写入GPU一次,是这样吗?
由于我正在使用Qt,所以尝试使用QGLBuffer类:
void GLWidget::initializeGL() {
...
vertexBuffer = new QGLBuffer(QGLBuffer::VertexBuffer);
vertexBuffer->create();
vertexBuffer->bind();
vertexBuffer->setUsagePattern(QGLBuffer::StaticDraw);
vertexBuffer->allocate(vertices, 3*numVertices*sizeof(float)); // copies vertices to GPU?
vertexBuffer->release();
#define BUFFER_OFFSET(bytes) ((GLubyte*) NULL + (bytes))
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
glColorPointer(3, GL_FLOAT, 0, colors);
}
当我运行这个程序时,它会在崩溃前长时间卡住:-(。如果我注释掉vertexBuffer->release();这一行,则根本不显示任何内容,但不会崩溃。
我做错了什么呢?
另外:我怎样才能将我的颜色一次性发送到GPU上?QGLBuffer::ColorBuffer类型不存在!?
编辑: 我在项目中包含了GLee.[h/c]文件,并用以下代码替换了QGLBuffer调用:
unsigned int vbufferid;
glGenBuffers(1, &vbufferid);
glBindBuffer(GL_ARRAY_BUFFER, vbufferid);
int size = 3*numVertices*sizeof(float);
glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW);
但是代码仍然没有绘制任何内容!?
glGenBuffers调用将vbufferid分配为值1,因此我认为问题不在于我的显卡。
编辑2:我发现如果注释掉“glEnableClientState(GL_COLOR_ARRAY);”行,三角形将使用VBO显示(但是没有颜色)!
那么在使用VBO进行顶点绘制时,如何将颜色传输到GPU?
没有GL_COLOR_BUFFER类型!?
gl...Pointer
函数。 - datenwolf