2013-05-10 6 views
1

Я работаю с ОЧЕНЬ простой программой, которая передает массив точек в программируемую линию для рисования куба. Я пытаюсь настроить его, чтобы изменить геометрию каждого кадра (на основе некоторого внешнего ввода) и, как таковой, для освещения, мне нужно пересчитать нормали лица после их изменения. Я делаю это в геометрическом шейдере как упражнение.Значение геометрии GLSL меняется, когда оно не должно

Мои шейдеры являются следующие:

Vertex:

#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 

uniform mat4 MVP; 

void main(){  
    gl_Position = MVP * vec4(vertexPosition_modelspace,1); 
} 

Геометрия:

#version 330 

precision highp float; 

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

out vec3 normal; 

void main(void) 
{ 
    for (int i = 0; i < gl_in.length(); i++) { 
     gl_Position = gl_in[i].gl_Position; 
     EmitVertex(); 
    } 

    EndPrimitive(); 

    normal = vec3(0,0,1); 
} 

Фрагмент:

#version 330 

in vec3 normal; 
out vec4 color; 

void main() 
{ 
    color = vec4(normal,1); 
} 

Я пытался вычислить нормаль (но У меня пульс вывел этот код для отладки причин), и нормальное значение было freaking, когда я запускал программу. Таким образом, я устанавливаю цвет фрагмента как обычное значение. (Чтобы убедиться, что это действительно нормально.) Итак, по какой-то причине значение «нормальное» переливается между красным, зеленым, белым и черным без объяснения причин. Если я просто указываю вектор цвета в шейдере фрагмента, то куб отображает весь этот цвет.

Почему значение нормального изменения вообще?

Мысли?

ответ

4

Значение normal является undefined.

Вы должны написать все из геометрии шейдерных выходов перед тем каждого вызова на EmitVertex. GS не работают как рендеринг в режиме немедленного режима.

+1

Благодарим вас за ответ. Это устранило мою проблему. Во всем моем чтении о геометрических шейдерах я никогда не видел ничего такого, что рассказывало мне об этом. Хотя это моя собственная некомпетентность. Благодарю. – APalmer