目录
一、节点功能概述
法线混合节点(Normal Blend Node)是 Unity Shader Graph 中用于合并两个法线贴图的专用工具,通过特定算法将输入的法线向量 A 和 B 混合,生成新的法线向量。该节点在材质细节叠加、动态模型变形和程序化纹理生成中具有关键作用,核心优势在于:
- 双法线融合:支持两种混合模式(Default/Reoriented)处理不同场景需求
- 自动归一化:输出始终为单位法线向量,确保光照计算正确性
- 性能高效:底层实现为纯数学运算,无额外纹理采样开销
二、端口与参数详解
2.1 端口配置
端口名称 | 方向 | 数据类型 | 描述 |
---|---|---|---|
A | 输入 | Vector 3 | 第一个法线向量(通常为基础法线) |
B | 输入 | Vector 3 | 第二个法线向量(通常为叠加法线) |
Out | 输出 | Vector 3 | 混合并归一化后的法线向量 |
2.2 混合模式(Mode)解析
2.2.1 Default 模式
原理:直接混合法线贴图的 RGB 通道,适用于叠加细节法线
- 绿色通道(G)和红色通道(R)直接相加
- 蓝色通道(B)采用乘法混合
- 最终结果归一化为单位向量
2.2.2 Reoriented 模式
原理:基于法线重定向算法,适用于不同空间法线的融合
- 将法线 A 转换到切线空间
- 与法线 B 进行方向重定向混合
- 保持法线方向的物理正确性
三、数学原理与代码解析
3.1 Default 模式算法
hlsl
void Unity_NormalBlend_float(float3 A, float3 B, out float3 Out)
{
Out = normalize(float3(A.rg + B.rg, A.b * B.b));
}
解析:
- 通道混合:
- 切线空间中法线的 XY 分量(RG 通道)直接相加
- Z 分量(B 通道)采用乘法混合(保留深度信息)
- 归一化处理:
normalize
函数确保输出为单位向量,避免光照计算误差
3.2 Reoriented 模式算法
hlsl
void Unity_NormalBlend_Reoriented_float(float3 A, float3 B, out float3 Out)
{
float3 t = A.xyz + float3(0.0, 0.0, 1.0);
float3 u = B.xyz * float3(-1.0, -1.0, 1.0);
Out = (t / t.z) * dot(t, u) - u;
}
解析:
- 切线空间转换:
t = A + (0,0,1)
将法线 A 转换到以 (0,0,1) 为基准的切线空间 - 方向重定向:
u
对法线 B 进行 XY 分量取反(适配不同法线贴图 conventions)- 通过点积
dot(t, u)
计算方向相似度
- 混合公式:
(t/t.z)*dot(t,u) - u
实现法线方向的重定向融合
四、应用场景与实战案例
4.1 角色装备法线混合
场景:盔甲细节叠加
- 需求:基础盔甲法线与装饰纹路法线融合
- 实现:
- A 端口:盔甲主体法线(大尺度凹凸)
- B 端口:装饰纹路法线(小尺度细节)
- 模式:Default
- Shader 逻辑:
hlsl
float3 baseNormal = UnpackNormal(tex2D(_BaseNormalTex, uv)); float3 detailNormal = UnpackNormal(tex2D(_DetailNormalTex, uv * 4)); float3 finalNormal = Unity_NormalBlend_float(baseNormal, detailNormal);
4.2 地形法线混合
场景:地形材质过渡
- 需求:草地与岩石法线的平滑过渡
- 步骤:
- A 端口:草地法线
- B 端口:岩石法线
- 混合权重:基于高度图控制
- 效果代码:
csharp
// C#脚本控制混合权重 material.SetFloat("_BlendWeight", heightMapValue);
4.3 动态变形法线处理
场景:布料褶皱动态生成
- 需求:基础法线与动态褶皱法线融合
- 模式选择:Reoriented
- 优势:
- 保持动态法线的方向一致性
- 避免 Default 模式下的法线方向冲突
五、使用技巧与优化策略
5.1 模式选择指南
应用场景 | 推荐模式 | 优势 |
---|---|---|
静态细节叠加 | Default | 简单高效,保留细节层次 |
不同空间法线融合 | Reoriented | 保持法线方向物理正确 |
动态变形物体 | Reoriented | 适应法线方向变化 |
5.2 性能优化
- 预合并法线:
- 对静态模型,使用 DCC 软件提前合并法线贴图
- 减少采样:
- 合并多个法线纹理为 RGBM 格式,通过一次采样获取多法线信息
- 移动端优化:
- 使用 half 精度代替 float,降低计算开销
5.3 常见问题解决
- 法线方向冲突:
- 检查法线贴图的 convention(DirectX/OpenGL),通过
float3(-1,-1,1)
调整
- 检查法线贴图的 convention(DirectX/OpenGL),通过
- 光照异常:
- 确保输出法线已归一化,可添加
normalize
二次校验
- 确保输出法线已归一化,可添加
六、总结与拓展应用
法线混合节点通过科学的算法设计,为 3D 渲染中的法线细节处理提供了高效解决方案。从静态材质叠加到动态变形处理,其核心价值在于:
- 细节增强:通过多层法线混合实现丰富的表面细节
- 物理正确性:Reoriented 模式保证法线方向的物理合理性
- 性能平衡:纯数学运算实现高质量法线融合
拓展方向:
- 结合噪声纹理生成程序性法线混合效果
- 在 VR 中通过手势数据动态混合骨骼法线
- 开发基于深度学习的智能法线混合算法