我正在切换我的着色器,而不是依赖于使用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矩阵,因为它包括翻译,我不想翻译矢量。
我可以根据当前提供给着色器的内容计算我需要的矩阵,如果是,我需要计算什么?如果没有,我需要添加什么矩阵以及如何计算?
答案 0 :(得分:4)
您可以使用相同的view_projection矩阵。是的,矩阵 包含一个转换,但由于光矢量的w = 0,矩阵乘法不会应用它。
答案 1 :(得分:4)
您应该将灯光位置/方向转换为 CPU 上的视图空间,而不是着色器。这是制服;每个灯每帧完成一次。它不会改变,因此不需要每个顶点计算它。这是浪费时间。