【发布时间】:2012-12-15 14:49:13
【问题描述】:
我正在尝试使用带有 Qt 的 OpenGL 中的顶点缓冲区对象绘制一个样方。 这是我的几何图形:
numVertices = 4;
vertices = new float[3*numVertices];
int i = 0;
vertices[i++] = 0.0f; vertices[i++] = 0.0f; vertices[i++] = 0.0f; // (0,0,0)
vertices[i++] = 1.0f; vertices[i++] = 0.0f; vertices[i++] = 0.0f; // (1,0,0)
vertices[i++] = 1.0f; vertices[i++] = 1.0f; vertices[i++] = 0.0f; // (1,1,0)
vertices[i++] = 0.0f; vertices[i++] = 1.0f; vertices[i++] = 0.0f; // (0,1,0)
i = 0;
// spilt quad into two triangles:
numTriangles = 2;
indices = new unsigned int[numTriangles*3];
indices[i++] = 0; indices[i++] = 1; indices[i++] = 2;
indices[i++] = 0; indices[i++] = 2; indices[i++] = 3;
initializeGL 方法中的下一步:
QGLBuffer vertexBuffer;
vertexBuffer.create();
vertexBuffer.bind();
vertexBuffer.allocate(vertices, numVertices*sizeof(float));
QGLShaderProgram* shaderProgram_ = new QGLShaderProgram;
shaderProgram_->addShaderFromSourceFile(QGLShader::Vertex,"C:/src/light.vert.glsl") ) {
shaderProgram_->addShaderFromSourceFile(QGLShader::Fragment, "C:/src/light.frag.glsl");
bool ok = shaderProgram_->link();
ok = shaderProgram_->bind();
我认为 VBO 部分所做的只是将顶点复制到 GPU? (为什么这么多行?)
着色器部分在旧式 glBegin(GL_QUADS); 下工作得很好;
接下来我的paintGL方法:
shaderProgram_->setAttributeBuffer("vertex", GL_FLOAT, 0, 3, 0);
shaderProgram_->enableAttributeArray("vertex");
glDrawElements(GL_TRIANGLES, numTriangles, GL_UNSIGNED_INT, indices);
前两行在做什么?也许告诉着色器有一个名为“顶点”的顶点缓冲区,类型为 GL_FLOAT? 但是我在创建 VBO 时没有指定任何名称!? OpenGL怎么知道这是“顶点”?
反正我什么都没看到!? 有没有我遗漏的步骤? 我的着色器很简单:
# version 120
varying vec4 color;
void main() {
vec4 vertex = gl_Vertex;
// pass trough:
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vertex;
color = gl_Color;
}
# version 120
varying vec4 color;
void main (void)
{
// pass-trough:
gl_FragColor = color;
}
【问题讨论】:
-
我知道这是一个老问题,但作为一个 opengl 初学者,我发现 this QT 使用 VBO 和 OpenGL ES 绘制立方体的示例非常有用。我基本上注释掉了在顶点和索引数组中生成其他 5 个面的代码行,并在相应的 glBufferData 调用中更正了顶点和索引的数量,仅此而已。 QT 有很多有据可查的示例,请随时查看