cameraNormalMatrix
cameraNormalMatrix
一个 mat3 类型的特殊矩阵,用于将模型法线(Normal Vector)从模型空间正确地变换到视图空间。它通过使用模型视图矩阵的“逆转置”来解决非等比缩放下的法线变形问题,确保光照计算的物理正确性。
核心优势
自动化地保证了光照计算的正确性。开发者无需手动计算和传递复杂的逆转置矩阵(法线矩阵),也无需关心模型或相机的变换,TSL 会自动处理这一切,极大地简化了自定义光照着色器的编写。
常见用途
在经典光照模型(如 Blinn-Phong)中计算视图空间法线,用于漫反射和高光计算。
为环境反射/折射计算提供正确的表面法线,以实现精确的环境贴图采样。
在卡通渲染中用于精确的轮廓线检测(法线与视线垂直的区域)。
作为法线贴图计算的基础,用于将切线空间法线转换到视图空间。
变换由程序化置换(如水面波动)动态生成的法线,以进行正确的光照处理。
如何调整
此节点的值不能直接调整以获得艺术效果,它的值由模型和相机的变换被动决定。其效果通过对比实验来理解:当模型被非等比缩放时(例如,一个球被压扁),使用此节点能保持光照的自然和正确;若误用其他矩阵(如 modelViewMatrix),光照会发生扭曲,与模型表面轮廓不匹配。
代码示例
1/* 将模型空间的法线正确变换到视图空间 */
2const viewNormal = cameraNormalMatrix.mul( objectNormal ).normalize();