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

Ell*_*ott 2 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我该用什么代替???与在行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
Run Code Online (Sandbox Code Playgroud)

我不认为是这些。它显然不是 mvp 矩阵或法线矩阵,因为它们特定于当前模型,并且我正在尝试转换为视图坐标。我也不认为这是 vp 矩阵,因为它包含翻译,而我不想翻译向量。

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

Nic*_*las 5

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