faceforward
faceforward
将向量 N 按参考向量 Nref 与入射向量 I 的相对朝向进行取向:当 dot(Nref, I) < 0 时返回 N,否则返回 -N。常用于保证法线在双面或薄片表面上的朝向一致。别名:faceForward(与 GLSL 同名)。
核心优势
以常数代价消除法线符号翻转带来的光照“跳变”,让漫反射、菲涅尔、边缘光、反射/折射在背面与正面过渡稳定。
常见用途
双面材质的法线统一(避免背面变黑或高光翻转)
稳定的菲涅尔/轮廓光与基于视角的遮罩
反射/折射在薄片或开口几何上的方向稳定
在程序化着色中确保与法线相关的阈值判断不抖动
如何调整
该函数无可调参数。通过改变判定用的 I 或 Nref 可控制取向规则:例如令 I = lightDirection.negate() 使法线总是朝向光源;或改用视图空间向量(normalView、positionViewDirection)保持空间一致性。注意必须保证三个输入处于同一坐标空间。别名:faceForward。参数个数固定为 3。
代码示例
1// 统一法线朝向(世界空间示例)
2const N = normalWorld.normalize();
3const I = viewDirection; // 从表面指向摄像机的方向
4const Nref = N; // 使用几何法线作为参考
5const N_oriented = faceforward( N, I, Nref );
6
7// 用取向后的法线进行稳定的漫反射
8const lambert = dot( N_oriented, lightDirection ).max( 0.0 );