Я занимаюсь разработкой приложения OpenGL 2.1 с использованием шейдеров, и у меня проблема с освещением для каждого фрагмента.Освещение корректно при начальной загрузке сцены, но когда я перемещаюсь по сцене, освещение перемещается с помощью «камеры», а не остается в неподвижном месте.Например, если я расположу свой свет далеко вправо, будет освещена правая сторона объектов.Если я затем переместлю камеру на другую сторону объекта и укажу в противоположном направлении, освещение все еще будет на правой стороне объекта (а не на левой стороне, как должно быть сейчас).Я предполагаю, что я рассчитываю освещение в неправильной системе координат, и это вызывает неправильное поведение.Я рассчитываю освещение следующим образом ...
В вершинном шейдере ...
ECPosition = gl_ModelViewMatrix * gl_Vertex;
WCNormal = gl_NormalMatrix * vertexNormal;
, где vertexNormal - нормаль в пространстве объекта / модели.
Вфрагментный шейдер ...
float lightIntensity = 0.2; //ambient
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse
, где LightPosition, например, (100.0, 10.0, 0.0), который поместил бы свет на правую сторону мира, как описано выше.Часть, в которой я не уверен, это часть gl_NormalMatrix.Я не совсем уверен, что это за матрица и в какое координатное пространство она помещает мою нормаль (я предполагаю мировое пространство).Если нормаль поместить в мировое пространство, то я решил, что проблема в том, что ECPosition находится в глазном пространстве, а LightPosition и WCNormal в мировом пространстве.Что-то в этом не кажется правильным, но я не могу понять это.Я также попытался поместить ECPosition в мировое пространство, умножив его на свою собственную модельMatrix, которая содержит только преобразования, которые я делаю, чтобы получить координату в мировом пространстве, но это не сработало.Дайте мне знать, если мне потребуется предоставить другую информацию о моих шейдерах или коде.