“存的时候用切线空间,凭什么打光前又要‘转回去‘?“——法线空间转换的临门一脚

📅 2026/7/25 13:33:37
“存的时候用切线空间,凭什么打光前又要‘转回去‘?“——法线空间转换的临门一脚
引子:小明的"既然切线空间这么好,为什么还要多此一举转回世界空间"小明刚刚被"切线空间"的智慧折服——法线贴图存"切线空间"的相对方向,所以能"贴遍万物",一张图适配墙、地、球,通用无比。他觉得切线空间简直完美。可就在他准备收工时,翻到了 Shader 代码的最后几行,一个新的困惑冒了出来:// ★ 转换:切线空间 → 世界空间 half3 normalWS = normalize(mul(normalTS, TBN));"等等……我从贴图里,好不容易取出了’切线空间’的法线,可为什么最后打光之前,还要费劲用一个 TBN 矩阵,把它又’转换回世界空间’??既然切线空间这么好、这么通用,为什么不直接在切线空间里打光,非要’转回去’?这不是多此一举、脱了裤子放屁吗?存储时用切线空间,使用时又转回世界空间——这一来一回,到底图什么?这最后’临门一脚’的转换,到底是为了解决什么问题?我必须搞清楚,否则总觉得这一步’莫名其妙’!"小明这个追问,问到了法线应用中一个极其关键、却常被忽略的环节——为什么"存储"用切线空间,而"打光"却必须转回世界空间。今天,我们就来讲透这"临门一脚"的转换,到底为何必须、如何实现。一、先回顾:切线