осевая система координат освещения - PullRequest
7 голосов
/ 13 июля 2011

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

1 Ответ

6 голосов
/ 13 июля 2011

gl_NormalMatrix превращает ваш нормальный в пространство глаз (подробнее см. в этом уроке ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...