2012-03-25 5 views
3

Я пытаюсь реализовать phong shading безрезультатно. Я поэтапно строю шейдеры (что может быть проблемой само по себе), но вот где я сейчас. Я ожидаю, что это даст мой результат (чайник Юты) как белое изображение на моем черном фоне. Он делает это правильно, когда я удаляю строку 18 из вершинного шейдера, но когда строка там отсутствует, и нет ошибки. Есть идеи?GLSL Vertex Shader компилируется без отображения

Фрагмент Shader:

1 #version 120                      
    2                         
    3 varying vec3 vertexNormal;                   
    4 varying vec3 cameraSpacePos;                  
    5                         
    6 vec3 calcSpecular(vec3 l, vec3 n, vec3 v, vec3 cL, vec3 cS, float p)        
    7 {                         
    8  vec3 r = 2.0 * n * (n * l) - l;                
    9  return cL * cS * pow(max(0.0, dot(r, v)), p);             
10 }                         
11                         
12 vec3 calcDiffuse(vec3 l, vec3 n, vec3 cL, vec3 cD)             
13 {                         
14  return cL * cD * max(0.0, dot(n, l));               
15 }                         
16                         
17 void main(void)                     
18 {                         
19  vec3 lightDirection = normalize(vec3(-1.0, 0.0, -1.0));          
20  vec3 objectColor = vec3(0.5, 0.0, 0.0);              
21  vec3 ambientColor = vec3(0.1, 0.1, 0.1);              
22  vec3 lightColor  = vec3(0.3, 0.0, 0.3);              
23  vec3 specularColor = vec3(1.0, 1.0, 1.0);              
24                         
25  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);              
26 }     

Vertex Shader:

1 #version 120 
    2 
    3 uniform mat4 modelView; 
    4 uniform mat4 normalModelView; 
    5 uniform mat4 projection; 
    6 
    7 attribute vec3 position; 
    8 attribute vec3 normal; 
    9 
10 varying vec3 vertexNormal; 
11 varying vec3 cameraSpacePos; 
12 
13 void main(void) 
14 { 
15  vec4 tmpCameraSpacePos = modelView * vec4(position, 1.0); 
16  gl_Position = projection * tmpCameraSpacePos; 
17 
18  vertexNormal = (normalModelView * vec4(normal, 0.0)).xyz; 
19  cameraSpacePos = (tmpCameraSpacePos).xyz; 
20 
21 } 
22 

Это может быть также стоит отметить, что нормальный и normalModelView в настоящее время не установлены. Я пробовал с ними ранее включенные аналогичные результаты. Я понимаю, что они должны быть установлены на значения по умолчанию.

+0

Должно ли быть установлено значение w на 0.0 или 1.0 в строке 18? – user1118321

+1

@ user1118321 Нормаль - это вектор, поэтому переводы к нему не применяются, и оно должно иметь значение 0. – kevintodisco

+0

Ах, конечно. Хорошая точка зрения. – user1118321

ответ

1

Поскольку вы упомянули, что normal и normalModelView не установлены, я полагаю, что они также не установлены для значений по умолчанию, и являются технически недействительными данными. Когда в шейдере используются недействительные данные, результаты не определены, что является причиной того, что шейдеры трудно отлаживать. Убедитесь, что вы указали значения этих переменных, прежде чем пытаться ссылаться на них в коде.

+0

Да, это была проблема. Я думал, что раньше я читал, что поведение было определено (по крайней мере, для матриц), но это оказалось проблемой. – Kyle