c++ - 直通几何着色器

标签 c++ qt opengl shader geometry-shader

我刚开始将 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。

最佳答案

您的平台上未加载/解析的扩展是否支持几何着色器?我相信它们是可选的,但 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”工具仅支持片段和顶点着色器。我不确定哪些工具支持几何着色器,但我想您已经找到了那个着色器并以某种方式验证了它。

关于c++ - 直通几何着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22005550/

相关文章:

c++ - qVariantValue 是 "QT_DEPRECATED"- 替换的是什么?

c++ - 如何在 Qt 中更有效地将标志传递给此函数?

qt - 为什么某些DLL文件需要一个附加的.lib文件进行链接?

c++ - 使用互斥操作和原语实现信号量

c++ - 为什么 VS2013 在销毁唯一指针时抛出异常?

windows - 如何找出引入 AVX 标志的内容

java - 奇怪的 glVertexAttrib 行为?

控制台中的 openGL 上下文

image - S3/DXT/BC 压缩和纹理格式

c++ - Cmake 中的 Find_path 不起作用