我正在将我的着色器从依赖 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 矩阵,因为它包含翻译,而我不想翻译向量。
我可以根据当前提供给着色器的矩阵来计算我需要的矩阵吗?如果可以,我需要计算什么?如果不是,我需要添加什么矩阵以及如何计算?