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);
}
ただし、Vertex Buffer Objects (VBO) を使用して、レンダリングをさらに高速化したいと考えています。
glVertexPointer() が CPU のどこで頂点データを取得できるかを GPU に伝え、GPU がそれぞれの paintGL() に対して CPU のこの場所からデータをコピーすることを理解していますか?
また、VBO を使用すると、頂点データを GPU に 1 回だけ書き込むことでこれが改善されますか?
私は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型がない!?