2013-04-17 2 views
4

На данный момент у меня есть рабочая вершина и фрагмент шейдера. Если я полностью удалю свой геометрический шейдер, тогда я получаю ожидаемый куб с цветами в каждой вершине. Но при добавлении геометрического шейдера геометрия вообще не появляется.glsl pass through geometry shader issue

Vertex Shader:

#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 
layout(location = 1) in vec3 vertexColor; 

out VertexData 
{ 
    vec3 color; 
} vertex; 

uniform mat4 MVP; 

void main(){  

    gl_Position = MVP * vec4(vertexPosition_modelspace,1); 
    vertex.color = vertexColor; 
} 

Geometry Shader:

#version 330 

precision highp float; 

in VertexData 
{ 
    vec3 color; 
} vertex[]; 

out vec3 fragmentColor; 

layout (triangles) in; 
layout (triangle_strip) out; 
layout (max_vertices = 3) out; 

void main(void) 
{ 
    for (int i = 0; i > gl_in.length(); i++) { 

     gl_Position = gl_in[i].gl_Position; 
     fragmentColor = vertex[i].color; 
     EmitVertex(); 
    } 

    EndPrimitive(); 
} 

Фрагмент Shader:

#version 330 core 

in vec3 fragmentColor; 

out vec3 color; 

void main(){ 
    color = fragmentColor; 
} 

Моя видеокарта поддерживает OpenGL 3.3 от того, что я могу сказать. И, как я уже сказал. Он работает без шейдера Geometry. В качестве данных я передаю два массива GLfloat, где каждый из них соответствует вершине или цвету вершин.

+0

И, конечно, обычный вопрос: сначала компиляция шейдера и ссылка на программу, если нет, что говорит информационный журнал? –

ответ

6
for (int i = 0; i > gl_in.length(); i++) //note the '>' 

Это условие цикла будет ложным с самого начала, поэтому вы никогда не будете излучать какие-либо вершины. То, что вы, скорее всего, имели в виду, - i < gl_in.length().

+1

Я чувствую себя настолько глупо. Я буквально потратил неделю, пытаясь разобраться в этой проблеме. Мне никогда не приходило в голову проверить мою логику цикла. Спасибо. – APalmer