我知道这个问题已经被问了很多,但我仍然无法做到这一点。
所以,在我的顶点着色器中,我需要获得光线和眼睛位置。这是我的代码:
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;
}
结果光随着相机的移动而移动。我到底需要做什么?可能没有使用非opengl矩阵。
是否有适当的相机控制的glsl灯光示例?
*更新*
感谢科斯,我设法“灯光移动相机”问题,但这是另一个问题:
我有
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)中的茶壶相同。我该如何解决这个问题?
以下的顶点着色器代码:
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;
}
答案 0 :(得分:3)
我不太清楚OpenGL中的“旧”照明功能,但我相信您的问题在gl_LightSource[0].position
中的值无效。
如何指定灯光位置(glLightParameterfv(GL_LIGHT_POSITION, ...);
)?最重要的是,当你指定它们时,模型 - 视图矩阵的状态是什么?
如果模型视图矩阵是标识,则指定眼睛空间中的灯光位置,这会让您感觉它们随相机一起移动(好吧,请记住相机处于(0) ,0,0)总是这是移动的世界。
为了获得正确的结果,我相信您应该在世界空间中指定灯光,即在对模型视图矩阵执行相机变换之后,但在对其进行任何其他操作之前。
在指定时,灯光位置乘以模型视图矩阵,因此您的着色器将始终获得眼睛空间中的值,这很有用 - 您无需修改因为照明计算是在眼睛空间完成的。这也意味着您的计算中eyePos
应该只是(0,0,0)
,这使v
等于normalize(-p)
。
此外,为了获得最佳结果,请在片段着色器中进行这些计算,而不是使用顶点着色器。 :)
希望有所帮助。