1

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

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

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 照明示例?

* 更新 *

感谢 Kos,我解决了“灯光随相机移动”的问题,但这是另一个问题:

我有

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

1 回答 1

3

我不太记得 OpenGL 中的“旧”照明功能,但我相信您的问题是gl_LightSource[0].position.

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

如果模型-视图矩阵是恒等式,则指定眼睛空间中的光位置,这会给您一种它们随相机移动的印象(好吧,请记住相机始终位于 (0,0,0) 处,这就是世界哪个移动)。

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

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

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

希望有帮助。

于 2010-12-07T11:42:59.733 回答