我使用顶点数组非常快地绘制了很多三角形:
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 从 CPU 中的这个位置为每个paintGL() 复制它?
并且使用 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);
但代码仍然没有绘制任何东西!?
vbufferid 被 glGenBuffers 调用赋值为 1,所以我不认为问题出在我的显卡上。
编辑2:我发现如果我注释掉 glEnableClientState(GL_COLOR_ARRAY); 用VBO(但没有颜色)显示三角形!
那么在使用 VBO 作为顶点时如何将颜色传输到 GPU 上呢?
没有 GL_COLOR_BUFFER 类型!?