directionToFaceDirection
directionToFaceDirection
将一个方向向量转换为“面向感知”的方向。根据材质的 side:BackSide 时整体取反;DoubleSide 时按每个片元的 faceDirection(正面 +1、背面 -1)取反;FrontSide 时保持不变。
核心优势
在双面或背面渲染时自动修正方向符号,无需分支判断,使 N·V、Fresnel、边缘光等计算在正反面保持一致。
常见用途
在双面材质中,先对 viewDirection 或光线方向调用,以稳定 N·V、Fresnel 或 rim 效果。
BackSide 材质下,统一反转方向向量以沿用正面公式。
配合 reflect/refract 或自定义半角向量,保证反射/折射方向与面朝向一致。
与 faceDirection 联用,替代基于 frontFacing 的 if/else 分支。
如何调整
通过修改材质的 side 控制行为:FrontSide 不变;BackSide 始终取反;DoubleSide 按片元由 faceDirection 决定取反。通常与 normalize、dot、reflect、refract 等组合使用;若输入方向已做过面向修正,请勿重复取反。
代码示例
1// 使视线方向对正反面稳定
2material.side = THREE.DoubleSide;
3
4const V = normalize( directionToFaceDirection( viewDirection ) );
5const rim = pow( saturate( 1.0 - dot( normalView, V ) ), 3.0 );
6material.emissiveNode = vec3( 1.0, 0.6, 0.2 ).mul( rim );