У меня есть следующий код GLSL для освещения:Как превратить направленный свет в пространство камеры в GLSL
uniform vec3 lightDir; // Parallel light
uniform float ambient;
uniform vec3 lightColour;
void main()
{
gl_Position = ftransform();
vec3 eyeNormal = normalize(gl_NormalMatrix * gl_Normal);
float intensity = max(ambient, dot(eyeNormal, normalize(-lightDir));
gl_FrontColor = gl_Color * vec4(lightColour, 1.0) * intensity;
}
света вектор, указанный в мировом пространстве. Я установил ориентацию и положение камеры, используя gluLookAt
. Поскольку OpenGL предполагает, что вектор света находится в пространстве камеры, свет перемещается вместе с камерой, а не остается неподвижной.
Я попытался активировать шейдер и установить вектор света до и после вызова gluLookAt
, но я получаю тот же эффект. Что именно я должен сделать, чтобы правильно преобразовать вектор света?
Я попытался умножая lightDir на gl_NormalMatrix в затенении и не было никакого эффекта. Я также попробовал умножить на gl_ModelViewMatrix, например: 'vec3 lightEyeDir = normalize (vec3 (gl_ModelViewMatrix * vec4 (-lightDir, 1.0)));' Выполнение этого полностью отбросило диффузный вклад. Для преобразования вектора света в программный код, какое преобразование я бы сделал точно? – Aaron
Преобразуя световой сигнал в обратную модельную матрицу, вы должны получить свет пространства модели. – Tryum
NormalMatrix - это просто часть вращения модели ModelView (без перевода и масштабирования). Умножение света на него означает также применение вращения модели (и вы этого не хотите). – MaR