пофрагментная система координат освещения

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


person Nitrex88    schedule 12.07.2011    source источник


Ответы (1)


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

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

person bosmacs    schedule 12.07.2011
comment
хороший учебник по gl_NormalMatrix. Теперь я это понимаю. Я попробую преобразовать мою LightPosition в пространство для глаз и посмотреть, что произойдет. Хорошее предложение. - person Nitrex88; 13.07.2011