如何在现代GLSL中将定向光转换为屏幕坐标?

时间:2011-12-17 11:25:55

标签: opengl glsl

我正在切换我的着色器,而不是依赖于使用OpenGL固定功能管道。以前,OpenGL会自动为我改变灯光,但现在我需要自己做。

我的顶点着色器中有以下GLSL代码:

//compute all of the light vectors. we want normalized vectors 
//from the vertex towards the light
for(int i=0;i < NUM_LIGHTS; i++)
{
    //if w is 0, it's a directional light, it is a vector 
    //pointing from the world towards the light source
    if(u_lightPos[i].w == 0)
    {
        vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));
        v_lightDir[i] = transformedLight;
    }
    else
    {
        //this is a positional light, transform it by the view*projection matrix
        vec4 transformedLight = u_vp_matrix * u_lightPos[i];

        //subtract the vertex from the light to get a vector from the vertex to the light
        v_lightDir[i] = normalize(vec3(transformedLight - gl_Position));
    }
}

我该怎么更换???在vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));行?

我已经将以下矩阵作为输入:

uniform mat4 u_mvp_matrix;//model matrix*view matrix*projection matrix
uniform mat4 u_vp_matrix;//view matrix*projection matrix
uniform mat3 u_normal_matrix;//normal matrix for this model

我认为这些都不是。它显然不是mvp矩阵或普通矩阵,因为它们是特定于当前模型的,我正在尝试转换为视图坐标。我不认为它是vp矩阵,因为它包括翻译,我不想翻译矢量。

我可以根据当前提供给着色器的内容计算我需要的矩阵,如果是,我需要计算什么?如果没有,我需要添加什么矩阵以及如何计算?

2 个答案:

答案 0 :(得分:4)

您可以使用相同的view_projection矩阵。是的,矩阵 包含一个转换,但由于光矢量的w = 0,矩阵乘法不会应用它。

答案 1 :(得分:4)

您应该将灯光位置/方向转换为 CPU 上的视图空间,而不是着色器。这是制服;每个灯每帧完成一次。它不会改变,因此不需要每个顶点计算它。这是浪费时间。