Glsl phong着色器和相机

时间:2010-12-06 21:29:01

标签: opengl camera glsl lighting

我知道这个问题已经被问了很多,但我仍然无法做到这一点。

所以,在我的顶点着色器中,我需要获得光线和眼睛位置。这是我的代码:

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;
}

1 个答案:

答案 0 :(得分:3)

我不太清楚OpenGL中的“旧”照明功能,但我相信您的问题在gl_LightSource[0].position中的值无效。

如何指定灯光位置(glLightParameterfv(GL_LIGHT_POSITION, ...);)?最重要的是,当你指定它们时,模型 - 视图矩阵的状态是什么?

如果模型视图矩阵是标识,则指定眼睛空间中的灯光位置,这会让您感觉它们随相机一起移动(好吧,请记住相机处于(0) ,0,0)总是这是移动的世界。

为了获得正确的结果,我相信您应该在世界空间中指定灯光,即在对模型视图矩阵执行相机变换之后,但在对其进行任何其他操作之前。

在指定时,灯光位置乘以模型视图矩阵,因此您的着色器将始终获得眼睛空间中的值,这很有用 - 您无需修改因为照明计算是在眼睛空间完成的。这也意味着您的计算中eyePos应该只是(0,0,0),这使v等于normalize(-p)

此外,为了获得最佳结果,请在片段着色器中进行这些计算,而不是使用顶点着色器。 :)

希望有所帮助。

相关问题