我刚开始使用OpenGL与Qt一起使用。我尝试使用几何着色器来更改线条的宽度,但即使是简单的传递几何着色器也会导致空白屏幕。
以下是我的代码(摘录):
line_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/shaders/lines.v.glsl");
line_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/shaders/lines.f.glsl");
line_shader.addShaderFromSourceFile(QGLShader::Geometry, ":/shaders/lines.g.glsl");
line_shader.setGeometryInputType(GL_LINES);
line_shader.setGeometryOutputType(GL_LINES);
line_shader.setGeometryOutputVertexCount(100);
line_shader.link();
line_shader.bind();
const float data[] = {
0, 0, 0, 3, 0.8, 0, 0, 0.5, 1, 0, 0, 3, 0.8, 0, 0, 0.5,
0, 0, 0, 3, 0, 0.8, 0, 0.5, 0, 1, 0, 3, 0, 0.8, 0, 0.5,
0, 0, 0, 3, 0, 0, 0.8, 0.5, 0, 0, 1, 3, 0, 0, 0.8, 0.5,
};
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(line_shader.programId());
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLint a_vertex = line_shader.attributeLocation("a_vertex");
GLint a_color = line_shader.attributeLocation("a_color");
line_shader.enableAttributeArray(a_vertex);
line_shader.enableAttributeArray(a_color);
glVertexAttribPointer(a_vertex, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
glVertexAttribPointer(a_color, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(4 * sizeof(GLfloat)));
glDrawArrays(GL_LINES, 0, 6);
顶点着色器:
attribute vec4 a_vertex;
attribute vec4 a_color;
uniform mat4 u_pmv_matrix;
void main(void) {
gl_Position = u_pmv_matrix * vec4(a_vertex.x, a_vertex.y, a_vertex.z, 1);
}
几何着色器:
void main() {
for (int i=0; i<gl_VerticesIn; ++i) {
gl_Position = gl_PositionIn[i];
EmitVertex();
}
EndPrimitive();
}
片段着色器:
varying vec4 v_color;
void main(void) {
gl_FragColor = vec4(1, 0, 0, 1);
}
如果我从代码中删除line_shader.addShaderFromSourceFile(QGLShader::Geometry, ":/shaders/lines.g.glsl");
,一切都按预期工作。
我在这里做错了什么?
编辑:我使用OS X 10.9,Qt 5.2.1。
答案 0 :(得分:1)
您的平台上未加载/解析的扩展程序是否支持几何着色器?我相信它们是可选的,但Qt会尝试加载它们(source)。
也许他们在您的实施中被命名为不同的东西。如果您必须手动解决它们this KDAB article可能会有所帮助。那里有代码列出Qt知道的扩展名:
// Query extensions
QList extensions = m_context->extensions().toList();
std::sort( extensions );
qDebug() << "Supported extensions (" << extensions.count() << ")";
foreach ( const QByteArray &extension, extensions )
qDebug() << " " << extension;
可能是扩展被称为Qt期望之外的东西。
同样显而易见,但我想你的平台上有一个着色器工具并且能够运行该着色器?我在开发的大部分时间里使用MacOSX,不幸的是“OpenGL Shader Builder”工具只支持片段和顶点着色器。我不确定哪些工具支持几何着色器,但我猜你已经到达那个着色器并以某种方式验证它。