2011-02-08 3 views
0

Я создал шейдер, который отлично работает в Firefox, но в Chrome фрагмент и вершинный шейдер не могут быть связаны. Они компилируются просто отлично, но в части соединения что-то идет не так. Я локализована проблема в паровании битого кода:GLSL-шейдеры и проблема WebGL

 else if (uLightType[i] == 1) { //point light 

     NdotL = dot(n, normalize(lightDir[i])); 

     if (NdotL > 0.0) { 
      distance = length(lightDir[i]); 
      att = (1.0/(uLightAttenuation[i] * distance * distance)); 
      color += vec3(uLightColor[i] * NdotL * uLightIntensity[i] * att);     
     } 
} 

Этот небольшой фрагмент кода вычисляет диффузный цвет отраженного от точечного источника света. Это часть более крупного цикла. Как показано здесь, он не будет ссылаться на все, но если я удалю uLightAttenuation из расчета ATT, например, так:

att = (1.0/(distance * distance));  

это работает просто отлично. Если я заменил его на любую другую форму, скажем, uLightIntensity,

att = (1.0/(uLightIntensity[i] * distance * distance)); 

снова он не будет работать. Если я заменил его простым постоянным значением/float variabile, как ни странно, он компилируется. И что еще более странно, если удалить ATT из расчета цвета, но сохранить форму в его нынешнем положении, он работает просто отлично:

att = (1.0/(uLightAttenuation[i] * distance * distance)); 
color += vec3(uLightColor[i] * NdotL * uLightIntensity[i]); 

Равномерное является значение с плавающей точкой, и даже если бы это было проблема с литьем типа должна быть неудачной при компиляции, а не в связывании.
Вот полные шейдеры, возможно, я пропустил что-то в другом месте в коде.

Fragment Shader
Vertex Shader

+0

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

ответ

2

мне удалось сделать его работу, оказывается, у меня было 2 проблемы. Один из них имеет деление на 0 при вычислении att. Это позволило бы мне разделить что-то по форме с плавающей точкой, поэтому я объединил uLightAttenuation и uLightIntensity в единую униформу vec2, после чего эта часть работала. Во-вторых, при вычислении цвета мне приходилось ссылаться на каждый компонент отдельно (цвет [0], цвет [1] и т. Д.) И работать только с переменными float, а не с векторами. После этого он работал правильно в хроме.

Смежные вопросы