【问题标题】:Glsl phong shader and cameraGlsl phong 着色器和相机
【发布时间】:2011-05-21 05:53:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: opengl camera glsl lighting


    【解决方案1】:

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

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

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

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

    光的位置乘以指定时刻的模型视图矩阵,所以你的着色器总是会得到眼睛空间中的值,这很有用——你不需要修改它不再是因为照明计算是在眼睛空间中完成的。这也意味着eyePos 在您的计算中应该只是(0,0,0),这使得v 等于normalize(-p)

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

    希望对您有所帮助。

    【讨论】:

    • 我做了什么:1. 移动了“glLightfv(GL_LIGHT0, GL_POSITION, light_position);”在 render() 函数之后,它使用 gluLookAt 设置模型视图矩阵。 2. 按照您的建议,将 v 更改为 normalize(p)。现在我的茶壶背面看起来应该是暗的,但是如果我从亮的一侧环顾四周,眩光点仍然会移动。应该是?我不确定
    • 如果“眩光点”是镜面高光,那么是的。环境分量始终相同,漫反射分量取决于表面光矢量(移动相机时它不应该改变),镜面反射分量也考虑表面眼睛矢量。
    • “灯一样”是什么意思?它应该如何点亮,它是如何点亮的?另外,如何指定灯光位置?是点光源还是定向光源?
    • 例如,如果我有 4 个盒子在我的灯周围飞行,那么每个盒子都会亮起,就好像灯光从右侧放置一样。在我看来,我使用 lightPos[4] = { 3.0, 4.0, 0.0, 0.0 };
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多