Я создал шейдер, который отлично работает в Firefox, но в Chrome фрагмент и вершинный шейдер не могут быть связаны.Они компилируются просто отлично, но в связующей части что-то идет не так.Я локализовал проблему в следующем фрагменте кода:
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));
, снова она не будет работать.Если я заменю его простой константой / переменным с плавающей запятой, то, как ни странно, он скомпилируется.И что еще более странно, если я уберу att из расчета цвета, но сохраню форму в ее текущей позиции, она будет работать нормально:
att = (1.0 / (uLightAttenuation[i] * distance * distance));
color += vec3(uLightColor[i] * NdotL * uLightIntensity[i]);
Форма - это значение с плавающей точкой, и даже если оноЕсли бы была проблема с приведением типа, он не мог работать при компиляции, а не при компоновке.
Вот полные шейдеры, может быть, я пропустил что-то в другом месте кода.
Фрагментный шейдер
Вершинный шейдер