我试图使用法线贴图而不是顶点法线,我无法弄清楚我做错了哪一步.我想将光线方向转换为切线空间并从那里进行计算.首先,我将矢量法线和切线转换为视图空间.
vec3 norm_viewsp = mat3(view) * normalize(norm);
vec3 tangent_viewsp = mat3(view) * normalize(tangent);
vec3 bitangent_viewsp = cross(tangent_viewsp, norm_viewsp);
Run Code Online (Sandbox Code Playgroud)
接下来,我构建矩阵,该矩阵应执行从视图空间到切线空间的变换,并使用它来计算切线空间中光线的距离.
mat3 tbn = transpose(mat3(tangent_viewsp, bitangent_viewsp, norm_viewsp));
vec3 light_dir = light_pos - pos.xyz;
vec3 light_dir_viewsp = mat3(view) * light_dir;
v_light_dir_tansp = tbn * light_dir_viewsp;
Run Code Online (Sandbox Code Playgroud)
在片段着色器中,我然后从法线贴图中采样法线并将其与光线方向相乘.
vec3 norm = texture(normal_map, v_tex_pos).rgb * 2.0 - 1.0;
float diffuse = dot(normalize(norm), normalize(v_light_dir_tansp));
Run Code Online (Sandbox Code Playgroud)
法线贴图肯定正确加载.
结果左上角太暗,左下角太亮.
我认为问题出在光线方向的某处,但我无法发现错误.
Nore,在上面的图片中,值介于-1和1之间,这就是为什么例如法线贴图看起来太暗.
编辑:灯光位于模型的中心.如果使用顶点法线,则照明工作正常.在视图空间而不是切线空间中进行计算没有任何区别.