transformNormal
transformNormal
用于正确地将法线向量从局部空间转换到另一坐标空间(默认为世界空间),专门解决了模型存在非均匀缩放时导致的光照错误问题。
核心优势
即使在非均匀缩放下也能保证光照计算的正确性,同时通过更高效的数学方法优化性能,并封装了复杂逻辑,极大地简化了开发。
常见用途
标准PBR或Blinn-Phong光照
三平面纹理映射 (Triplanar Mapping)
程序化地形或水面着色
如何调整
主要通过两方面调整:一是务必对结果使用 `.normalize()`,否则模型缩放时会导致光照强度错误;二是可以替换输入法线,如使用噪声函数生成凹凸不平的表面效果;三是可以显式提供第二个参数(如 `modelViewMatrix`)来将法线变换到不同坐标空间(如视图空间)进行计算。
代码示例
1// 将局部法线转换到世界空间。
2// 节点会自动使用 modelWorldMatrix 作为变换矩阵。
3// 注意:其输出不保证是单位向量,通常需要手动归一化。
4const worldNormal = transformNormal( normalLocal ).normalize();