我想用Qt在OpenGL中绘制一个使用顶点缓冲对象的样板。 这里是我的几何形状:如何在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;
}
谢谢奥列格!但我仍然没有选择任何矩形。我认为我的模型视图和投影很好。如果我添加一个glutSolidTeapot(2.0f);调用我的paintGL方法,这显示得很好。 – Andy
@Andy我在'glDrawElements()'调用中发现了另一个错误。在主帖中看到它。 –