ShaderGraph节点解析(八):混合节点(Blend Node)详解

目录

一、节点功能概述

二、端口与参数详解

2.1 端口配置

2.2 混合模式(Mode)详解

2.2.1 基础数学混合(线性运算)

2.2.2 对比度增强混合

2.2.3 特殊效果混合

三、核心算法与代码解析

3.1 混合流程总览

3.2 关键模式代码解析

3.2.1 正片叠底(Multiply)

3.2.2 叠加(Overlay)

3.2.3 柔光(SoftLight)

四、应用场景与实战案例

4.1 材质细节叠加

场景:金属材质磨损效果

4.2 后处理色彩调整

场景:赛博朋克风格色调

4.3 动态视觉反馈

场景:角色受伤闪烁效果

五、高级技巧与性能优化

5.1 模式选择策略

5.2 性能优化建议

六、注意事项与常见问题

6.1 值域控制

6.2 透明通道处理

6.3 模式冲突排查

七、总结与拓展应用


一、节点功能概述

混合节点(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 基础数学混合(线性运算)
模式数学公式视觉效果特点
MultiplyOut = Base × Blend变暗,常用于叠加阴影或纹理
ScreenOut = 1 - (1 - Base) × (1 - Blend)变亮,常用于发光或光效叠加
AddOut = Base + Blend(注:Unity 中 LinearDodge 模式等效)亮度叠加,适合光源混合
SubtractOut = Base - Blend颜色相减,用于差值效果
2.2.2 对比度增强混合
模式核心逻辑典型应用
DarkenOut = min(Base, Blend)保留两层中的较暗部分
LightenOut = max(Base, Blend)保留两层中的较亮部分
Overlay依据 Base 亮度自动选择 Multiply 或 Screen(Base<0.5 时 Multiply,否则 Screen)增强对比度,保持底层细节
2.2.3 特殊效果混合
模式数学公式视觉效果特点
Difference`Out =Base - Blend`突出颜色差异,用于边缘检测
ExclusionOut = Base + Blend - 2 × Base × Blend低对比度的 Difference,色彩更柔和
HardMixOut = step(1 - Base, Blend)二值化混合,产生硬边缘效果

三、核心算法与代码解析

3.1 混合流程总览

  1. 模式计算:根据 Mode 参数执行对应混合算法
  2. 透明度插值:通过lerp(Base, 混合结果, Opacity)实现强度控制
  3. 值域限制:部分模式需手动添加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 材质细节叠加

场景:金属材质磨损效果
  1. Base 层:金属基础纹理(如银色)
  2. Blend 层:磨损贴图(黑色划痕)
  3. 模式:Multiply(正片叠底)
  4. 效果:划痕区域变暗,模拟真实磨损

csharp

// 动态控制磨损强度
material.SetFloat("_WearOpacity", wearLevel); // wearLevel 0-1

4.2 后处理色彩调整

场景:赛博朋克风格色调
  1. Base 层:原始场景颜色
  2. Blend 层:蓝紫色调渐变纹理
  3. 模式:Overlay(叠加)
  4. 参数:Opacity=0.3
  5. 效果:增强色彩对比度,突出赛博朋克的高饱和色调

4.3 动态视觉反馈

场景:角色受伤闪烁效果
  1. Base 层:角色基础材质
  2. Blend 层:红色闪烁纹理(通过 Time 节点驱动动画)
  3. 模式:Add(加法混合)
  4. 逻辑:受伤时 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 性能优化建议

  1. 减少高精度运算

    • 避免在移动平台使用 VividLight、PinLight 等复杂模式
    • 对静态混合效果,预烘焙到单张纹理中(如 DCC 软件中提前混合)
  2. 合并混合操作

    csharp

    // 优化前(多次调用)
    color = BlendMode1(color, layer1);
    color = BlendMode2(color, layer2);
    
    // 优化后(一次计算)
    color = CustomBlend(color, layer1, layer2);
    
  3. 移动端兼容

    • 对 iOS/Android 设备,优先使用 Multiply、Add、Screen 等简单模式
    • 将 Opacity 参数限制在 [0,0.5] 范围,减少浮点运算精度损失

六、注意事项与常见问题

6.1 值域控制

  • 部分模式(如 Divide、Dodge)可能产生超过 [0,1] 的值,需手动添加Clampsaturate

    hlsl

    Out = saturate(Unity_Blend_Divide_float3(Base, Blend, Opacity));
    

6.2 透明通道处理

  • 若处理 RGBA 颜色,需确保混合模式对 Alpha 通道的影响符合预期:
    • 对 UI 元素,建议单独处理 Alpha 通道(如使用 Overwrite 模式)

6.3 模式冲突排查

  • 当混合效果与预期不符时,可按以下步骤排查:
    1. 确认输入颜色值域在 [0,1] 范围内
    2. 将 Opacity 设为 1,确认纯混合层效果
    3. 逐步调整 Opacity,观察过渡是否平滑

七、总结与拓展应用

混合节点通过丰富的模式选项和科学的算法实现,为开发者提供了强大的视觉效果控制能力。从基础的纹理叠加到复杂的风格化渲染,其核心价值在于:

  1. 艺术创作自由:通过不同模式组合实现无限视觉可能
  2. 性能可控性:可根据平台需求选择合适的混合算法
  3. 动态交互性:结合脚本实现实时视觉反馈

拓展应用方向

  • 结合噪声纹理实现程序性混合(如地形材质过渡)
  • 在 VR/AR 中通过眼动追踪动态调整混合区域
  • 开发自定义混合模式,满足特殊艺术需求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李也疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值