【发布时间】:2012-12-21 13:07:26
【问题描述】:
我正在使用顶点数组快速绘制很多三角形:
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);
但代码仍然没有绘制任何东西!?
glGenBuffers 调用为 vbufferid 分配了值 1,所以我不认为问题出在我的显卡上。
编辑 2: 我发现如果我注释掉 glEnableClientState(GL_COLOR_ARRAY);用VBO(但没有颜色)显示三角形!
那么在使用 VBO 作为顶点时如何将颜色传输到 GPU?
没有 GL_COLOR_BUFFER 类型!?
【问题讨论】:
-
如果认为在处理VBO时需要使用glBufferData函数,则不使用glXYZPointer方法。但我可能在这里弄错了。不过我很确定你需要glBufferData。您的片段和顶点着色器看起来如何?你确定问题不存在吗?
-
@dowhilefor:您仍然必须告诉 OpenGL 在缓冲区中的什么位置可以找到顶点数据,以及每个元素的大小。所以是的,你仍然需要使用
gl…Pointer函数。 -
@dowhilefor:感谢您的帮助,但我认为您错了。如果我注释掉 glVertexPointer 调用程序崩溃。此外,我的代码与 The Open GL Programming guide(也使用 glVertexPointer)第 104 页上的示例非常相似。
-
哦,好吧,不要介意我 :) 自从我使用 opengl 以来,它已经很久了。
-
看我的回答。颜色只是另一个顶点属性。它们也进入 GL_ARRAY_BUFFER。