Вершинный шейдер GLSL компилируется без отображения


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

Шейдер Фрагментов:

  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 }                   

Вершинный Шейдер:

  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

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

1 3

1 ответ:

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