1

Qt と組み合わせて OpenGL を使い始めたところです。ジオメトリ シェーダを使用して線の幅を変更しようとしていますが、単純なパススルー ジオメトリ シェーダでも画面が空になります。

ここに私のコード(の抜粋)があります:

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 を使用しています。

4

1 に答える 1

1

ジオメトリ シェーダーは、プラットフォームでロード/解決されていない拡張機能でサポートされていますか? オプションだと思いますが、Qt はそれらをロードしようとします ( source )。

おそらく、実装では別の名前が付けられています。手動で解決する必要がある場合は、この KDAB 記事が役立つ場合があります。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" ツールはフラグメント シェーダーと頂点シェーダーしかサポートしていません。どのツールがジオメトリ シェーダーをサポートしているかはわかりませんが、そのシェーダーにたどり着き、何らかの方法で検証したと思います。

于 2014-02-25T06:41:21.693 に答える