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

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

7
задан Nitrex88 12 July 2011 в 20:24
поделиться