GLSL-шейдеры и проблема WebGL - PullRequest
0 голосов
/ 08 февраля 2011

Я создал шейдер, который отлично работает в 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]);

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

Фрагментный шейдер
Вершинный шейдер

1 Ответ

2 голосов
/ 08 февраля 2011

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

...