Сквозная геометрия шейдера

Я только начал с 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.

1

Решение

Поддерживаются ли геометрические шейдеры расширением, которое не загружается / не разрешается на вашей платформе? Я считаю, что они необязательны, но Qt пытается загрузить их (источник).

Возможно, они названы как-то иначе в вашей реализации. Если вам нужно разрешить их вручную эта статья 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» поддерживает только фрагментные и вершинные шейдеры. Я не уверен, какие инструменты поддерживают геометрические шейдеры, но я думаю, что вы пришли к этому шейдеру и как-то его проверили.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]