小编Sog*_*omn的帖子

法线贴图根据方向而不同

我试图使用法线贴图而不是顶点法线,我无法弄清楚我做错了哪一步.我想将光线方向转换为切线空间并从那里进行计算.首先,我将矢量法线和切线转换为视图空间.

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之间,这就是为什么例如法线贴图看起来太暗.

完整的着色器代码

编辑:灯光位于模型的中心.如果使用顶点法线,则照明工作正常.在视图空间而不是切线空间中进行计算没有任何区别.

opengl shader glsl light game-engine

7
推荐指数
1
解决办法
690
查看次数

标签 统计

game-engine ×1

glsl ×1

light ×1

opengl ×1

shader ×1