Я знаю, что этот вопрос задавали много, но я все еще не могу сделать это правильно.Glsl phong shader and camera
Итак, в моем вершинном шейдере мне нужно получить легкие постуки и положение глаз. Вот мой код:
void main(void)
{
vec3 p = vec3 (gl_ModelViewMatrix * gl_Vertex);
l = normalize (vec3 (gl_LightSource[0].position));
v = normalize (vec3 (eyePos) - p);
n = normalize (gl_NormalMatrix * gl_Normal);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
В результате свет движется с движением камеры. Что именно мне нужно сделать здесь? Возможно, без использования неопренг-матриц.
Есть ли пример освещения glsl с правильным управлением камерой?
* UPDATE *
Благодаря Кос, мне удалось "огни двигаться с камерой" проблема, но вот еще один:
У меня есть
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
ctLight -> enable();
glPushMatrix();
glTranslatef(0, 0, 0);
glRotatef(angle, 0, 1, 0);
glutSolidTeapot(2.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0, 0, 8);
glRotatef(angle, 0, 1, 0);
glutSolidTeapot(2.0);
glPopMatrix();
ctLight -> disable();
glDisable(GL_LIGHT0);
Теперь второй чайник загорается так же, как и в (0, 0, 0). Как это исправить?
Vertex код шейдера в случае:
void main(void)
{
vec3 p = vec3 (gl_ModelViewMatrix * gl_Vertex); // transformed point to world space
l = normalize (vec3 (gl_LightSource[0].position));
v = normalize (- p);
h = normalize (l + v);
n = normalize (gl_NormalMatrix * gl_Normal); // transformed n
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
что я сделал: 1. переехал "glLightfv (GL_LIGHT0, GL_POSITION, light_position);" справа после функции render(), которая устанавливает матрицу просмотра модели с gluLookAt. 2. изменен v, чтобы нормализовать (p), как вы посоветовали. теперь задняя сторона моего чайника выглядит темным, как и должно быть, но если я осматриваюсь на светлой стороне, то яркое пятно все еще движется. не так ли? Я не уверен – spacevillain 2010-12-07 17:02:49