目录
一、节点功能概述
混合节点(Blend Node)是 Unity Shader Graph 中实现多层颜色混合的核心工具,支持 23 种专业图形学混合模式,通过透明度(Opacity)参数控制混合强度。该节点广泛应用于材质叠加、纹理混合、后处理效果等场景,其核心优势在于:
- 多模式混合:覆盖 Photoshop 等软件的经典混合模式,如叠加(Overlay)、正片叠底(Multiply)、滤色(Screen)等
- 动态控制:通过 Opacity 参数实现 0(仅基础层)到 1(仅混合层)的平滑过渡
- 维度自适应:支持 Vector2/3/4 等不同维度的输入输出
二、端口与参数详解
2.1 端口配置
端口名称 | 方向 | 数据类型 | 描述 |
---|---|---|---|
Base | 输入 | Dynamic Vector | 基础层颜色值(底层图像) |
Blend | 输入 | Dynamic Vector | 混合层颜色值(上层图像) |
Opacity | 输入 | Float | 混合强度(0-1,0 为仅 Base) |
Out | 输出 | Dynamic Vector | 混合后的颜色值 |
2.2 混合模式(Mode)详解
混合模式决定了 Base 与 Blend 的计算逻辑,以下是核心模式分类解析:
2.2.1 基础数学混合(线性运算)
模式 | 数学公式 | 视觉效果特点 |
---|---|---|
Multiply | Out = Base × Blend | 变暗,常用于叠加阴影或纹理 |
Screen | Out = 1 - (1 - Base) × (1 - Blend) | 变亮,常用于发光或光效叠加 |
Add | Out = Base + Blend (注:Unity 中 LinearDodge 模式等效) | 亮度叠加,适合光源混合 |
Subtract | Out = Base - Blend | 颜色相减,用于差值效果 |
2.2.2 对比度增强混合
模式 | 核心逻辑 | 典型应用 |
---|---|---|
Darken | Out = min(Base, Blend) | 保留两层中的较暗部分 |
Lighten | Out = max(Base, Blend) | 保留两层中的较亮部分 |
Overlay | 依据 Base 亮度自动选择 Multiply 或 Screen(Base<0.5 时 Multiply,否则 Screen) | 增强对比度,保持底层细节 |
2.2.3 特殊效果混合
模式 | 数学公式 | 视觉效果特点 | ||
---|---|---|---|---|
Difference | `Out = | Base - Blend | ` | 突出颜色差异,用于边缘检测 |
Exclusion | Out = Base + Blend - 2 × Base × Blend | 低对比度的 Difference,色彩更柔和 | ||
HardMix | Out = step(1 - Base, Blend) | 二值化混合,产生硬边缘效果 |
三、核心算法与代码解析
3.1 混合流程总览
- 模式计算:根据 Mode 参数执行对应混合算法
- 透明度插值:通过
lerp(Base, 混合结果, Opacity)
实现强度控制 - 值域限制:部分模式需手动添加
saturate
函数避免值溢出
3.2 关键模式代码解析
3.2.1 正片叠底(Multiply)
hlsl
void Unity_Blend_Multiply_float4(float4 Base, float4 Blend, float Opacity, out float4 Out)
{
Out = Base * Blend; // 基础乘法混合
Out = lerp(Base, Out, Opacity); // 透明度插值
}
原理:将两层颜色相乘,结果必然小于等于任意一层,适用于叠加阴影或纹理细节。
3.2.2 叠加(Overlay)
hlsl
void Unity_Blend_Overlay_float4(float4 Base, float4 Blend, float Opacity, out float4 Out)
{
float4 result1 = 1.0 - 2.0 * (1.0 - Base) * (1.0 - Blend); // Base<0.5时的Multiply逻辑
float4 result2 = 2.0 * Base * Blend; // Base≥0.5时的Screen逻辑
float4 zeroOrOne = step(Base, 0.5); // 亮度判断掩码
Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1; // 动态选择混合模式
Out = lerp(Base, Out, Opacity);
}
原理:根据 Base 的亮度自动切换混合模式,在暗部执行 Multiply,亮部执行 Screen,保持底层细节的同时增强对比度。
3.2.3 柔光(SoftLight)
hlsl
void Unity_Blend_SoftLight_float4(float4 Base, float4 Blend, float Opacity, out float4 Out)
{
float4 result1 = 2.0 * Base * Blend + Base * Base * (1.0 - 2.0 * Blend); // 亮部处理
float4 result2 = sqrt(Base) * (2.0 * Blend - 1.0) + 2.0 * Base * (1.0 - Blend); // 暗部处理
float4 zeroOrOne = step(0.5, Blend); // 混合层亮度判断
Out = result2 * zeroOrOne + (1 - zeroOrOne) * result1;
Out = lerp(Base, Out, Opacity);
}
原理:通过非线性运算模拟柔和的光照效果,Blend>0.5 时增亮,Blend<0.5 时变暗,效果比 HardLight 更柔和。
四、应用场景与实战案例
4.1 材质细节叠加
场景:金属材质磨损效果
- Base 层:金属基础纹理(如银色)
- Blend 层:磨损贴图(黑色划痕)
- 模式:Multiply(正片叠底)
- 效果:划痕区域变暗,模拟真实磨损
csharp
// 动态控制磨损强度
material.SetFloat("_WearOpacity", wearLevel); // wearLevel 0-1
4.2 后处理色彩调整
场景:赛博朋克风格色调
- Base 层:原始场景颜色
- Blend 层:蓝紫色调渐变纹理
- 模式:Overlay(叠加)
- 参数:Opacity=0.3
- 效果:增强色彩对比度,突出赛博朋克的高饱和色调
4.3 动态视觉反馈
场景:角色受伤闪烁效果
- Base 层:角色基础材质
- Blend 层:红色闪烁纹理(通过 Time 节点驱动动画)
- 模式:Add(加法混合)
- 逻辑:受伤时 Opacity 从 0 瞬间升至 0.5,然后平滑回落
hlsl
// Shader中实现闪烁效果
float flash = sin(_Time.y * 10) * 0.5 + 0.5; // 0-1闪烁动画
float3 finalColor = Unity_Blend_Add_float3(baseColor, flashColor, flash * injuryIntensity);
五、高级技巧与性能优化
5.1 模式选择策略
场景需求 | 推荐模式 | 优势 |
---|---|---|
纹理细节叠加 | Multiply / Overlay | 保留底层细节 |
光效与发光效果 | Screen / Add | 自然增亮不丢失细节 |
边缘检测与差异对比 | Difference | 突出颜色变化 |
风格化艺术效果 | HardMix / VividLight | 强对比与色彩夸张 |
5.2 性能优化建议
-
减少高精度运算:
- 避免在移动平台使用 VividLight、PinLight 等复杂模式
- 对静态混合效果,预烘焙到单张纹理中(如 DCC 软件中提前混合)
-
合并混合操作:
csharp
// 优化前(多次调用) color = BlendMode1(color, layer1); color = BlendMode2(color, layer2); // 优化后(一次计算) color = CustomBlend(color, layer1, layer2);
-
移动端兼容:
- 对 iOS/Android 设备,优先使用 Multiply、Add、Screen 等简单模式
- 将 Opacity 参数限制在 [0,0.5] 范围,减少浮点运算精度损失
六、注意事项与常见问题
6.1 值域控制
- 部分模式(如 Divide、Dodge)可能产生超过 [0,1] 的值,需手动添加
Clamp
或saturate
:hlsl
Out = saturate(Unity_Blend_Divide_float3(Base, Blend, Opacity));
6.2 透明通道处理
- 若处理 RGBA 颜色,需确保混合模式对 Alpha 通道的影响符合预期:
- 对 UI 元素,建议单独处理 Alpha 通道(如使用 Overwrite 模式)
6.3 模式冲突排查
- 当混合效果与预期不符时,可按以下步骤排查:
- 确认输入颜色值域在 [0,1] 范围内
- 将 Opacity 设为 1,确认纯混合层效果
- 逐步调整 Opacity,观察过渡是否平滑
七、总结与拓展应用
混合节点通过丰富的模式选项和科学的算法实现,为开发者提供了强大的视觉效果控制能力。从基础的纹理叠加到复杂的风格化渲染,其核心价值在于:
- 艺术创作自由:通过不同模式组合实现无限视觉可能
- 性能可控性:可根据平台需求选择合适的混合算法
- 动态交互性:结合脚本实现实时视觉反馈
拓展应用方向:
- 结合噪声纹理实现程序性混合(如地形材质过渡)
- 在 VR/AR 中通过眼动追踪动态调整混合区域
- 开发自定义混合模式,满足特殊艺术需求