2014-02-25 1 views
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); 
} 
다음

은 (발췌) 내 코드입니다3210

코드에서 line_shader.addShaderFromSourceFile(QGLShader::Geometry, ":/shaders/lines.g.glsl");을 제거하면 모든 것이 예상대로 작동합니다.

내가 뭘 잘못하고 있니?

편집 : OS X 10.9, Qt 5.2.1을 사용합니다.

+1

방출 된 정점의 색상을 전달하지 마십시오 –

+0

고마워요,하지만 압니다. 나는 그것을 의도적으로 비활성화하고 프래그먼트 셰이더에서 수동으로 색상을 설정했습니다. – user2970139

+1

'# version' 지시어는 어디에 있습니까? – genpfault

답변

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"도구는 단편 및 정점 셰이더 만 지원합니다. 기하학적 셰이더를 지원하는 툴이 무엇인지 모르겠지만 셰이더에 도착하여 어떻게 든 검증했습니다.

+0

감사합니다. 나는 정말로 새로운 기계로 OSX 10.9를 사용하고 있습니다. 나는 당신이 제안한 것을했고 그것은 나에게 다음을 제공합니다 : http://pastebin.com/tZUPtEcr, Geometry Shaders가 거기에리스트되어 있습니다. 죄송합니다. OpenGL을 처음 시작했습니다. 이 경우 형상 쉐이더를 어떻게 활성화합니까? – user2970139

+0

OK, OpenGL 지원이 Qt5에서 혼란 스럽다는 것을 알고 있습니다. 이들은 QGL * 함수를 QOpenGL * 함수로 대체 할 것을 권장하지만 아직 QOpenGLWidget 클래스를 제공하지는 않습니다. – user2970139

+0

나는 그것이 올바른 방향으로 나를 인도 할 때 당신의 답을 받아 들일 것입니다. 도와 주셔서 정말로 고맙습니다! – user2970139