GLSL Vertex Shader компилируется без отображения

Я пытаюсь реализовать затенение Фонга безрезультатно. Я создаю шейдеры понемногу (что само по себе может быть проблемой), но сейчас я нахожусь здесь. Я ожидаю, что это выведет мой результат (чайник из Юты) в виде белого изображения на моем черном фоне. Он делает это правильно, когда я удаляю строку 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 в настоящее время не устанавливаются. Я пробовал с их включением ранее для аналогичных результатов. Насколько я понимаю, они должны быть установлены на значения по умолчанию.


person Kyle    schedule 25.03.2012    source источник
comment
Должны ли вы установить w на 0,0 или 1,0 в строке 18?   -  person user1118321    schedule 25.03.2012
comment
@user1118321 user1118321 Нормаль — это вектор, поэтому к нему не применяются переводы, и он должен иметь значение 0.   -  person kevintodisco    schedule 25.03.2012
comment
Стоит отметить, что файлы .frag' and .vert в файле решения всегда будут compile даже с синтаксическими ошибками и т. д. VS предполагает, что они верны, независимо от того, отображают они что-либо или нет, зависит от того, верны они на самом деле или нет. Похоже, вы разобрались с проблемой :D   -  person Reanimation    schedule 07.11.2013


Ответы (1)


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

person kevintodisco    schedule 25.03.2012
comment
Да, это была проблема. Я думал, что ранее читал, что поведение было определено (по крайней мере, для матриц), но это оказалось проблемой. - person Kyle; 25.03.2012
comment
вы только что подали мне идею, которая помогла мне совершить прорыв в отладке другой проблемы с GLSL, из-за которой у меня был черный экран без ошибок, спасибо :) Кстати. идея заключалась в том, чтобы просто вывести белый цвет для всех обработанных фрагментов и двигаться оттуда в обратном направлении, чтобы увидеть, что ломается - person xalpha; 08.02.2021