深入理解加法混合与减法混合,实现 Photoshop 级别的视觉效果
什么是混合模式?
混合模式(Blend Mode)定义了当前渲染像素 与已存在于帧缓冲区的像素 如何组合。 这个概念源自 Photoshop,几乎所有 Photoshop 中的图层混合模式都可以在 URP 中通过 Blend 指令实现。
核心公式
Result = Source × SrcFactor + Dest × DstFactor
Source 是当前 Shader 输出,Dest 是帧缓冲区中的颜色
加法混合(Additive Blend)
加法混合是最常用的混合模式之一,通过 Blend One One 实现。 它将两个图层的颜色值直接相加,结果只会越叠越亮,永不过曝。

代码实现
cs
// 加法混合核心设置
Shader "Custom/AdditiveGlow"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_GlowColor ("Glow Color", Color) = (1, 0.6, 0, 1)
_GlowIntensity ("Intensity", Range(0, 5)) = 1
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
// 👇 加法混合核心:Source + Dest,保持亮度
Blend One One
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
fixed4 _GlowColor;
float _GlowIntensity;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv) * _GlowColor;
return col * _GlowIntensity;
}
ENDCG
}
}
}
Shader Graph 实现
cs
// 在 Shader Graph 中设置 Surface Type
Surface Type → Transparent
Blend Mode → Additive
// 等效于代码中的:Blend One One

减法/乘法混合(Multiply Blend)
乘法混合通过 Blend DstColor Zero 实现。 它将两层颜色相乘,结果只会越叠越暗。相当于 Photoshop 中的正片叠底模式。

cs
// 乘法混合核心设置
Shader "Custom/MultiplyBlend"
{
Properties
{
_Color ("Tint Color", Color) = (0.5, 0.5, 0.5, 1)
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
// 👇 乘法混合核心:Source × Dest
Blend DstColor Zero
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
fixed4 _Color;
fixed4 frag (v2f i) : SV_Target
{
fixed4 tex = tex2D(_MainTex, i.uv);
// 颜色值与帧缓冲相乘
return tex * _Color;
}
ENDCG
}
}
}
透明度处理
乘法混合默认会丢失透明度信息。如果需要保留透明度,使用 Blend DstColor Zero, DstAlpha OneMinusDstAlpha 或者在 Shader 中手动采样 alpha。
🌑 变暗效果
模拟阴影投射,创建深度感
🖼️ 纹理叠加
给物体添加细节纹理而不改变基础色
🎨 颜色滤镜
快速应用颜色分级和色调映射
Photoshop 混合模式对照表
URP 的 Blend 指令支持灵活的组合,下面列出常用混合模式与 Photoshop 的对应关系:
| 效果 | Unity URP | Photoshop | 公式 |
|---|---|---|---|
| 变暗 | DstColor Zero | 正片叠底 | Src × Dst |
| 加亮 | One One | 线性减淡 | Src + Dst |
| 滤色 | One OneMinusDstColor | 滤色 | 1 - (1-Src)(1-Dst) |
| 叠加 | 自定义 | 叠加 | 条件判断 |
| 柔光 | 自定义 | 柔光 | 平滑曲线 |
| 颜色减淡 | SrcAlpha One | 颜色减淡 | Dst/(1-Src) |
| 颜色加深 | Zero OneMinusSrcAlpha | 颜色加深 | 1-(1-Dst)/Src |
| 差值 | OneMinusDstColor OneMinusSrcColor | 差值 | ` |
常用混合公式速查
加法混合 (Additive)
Blend One One
颜色相加,越叠越亮。适合发光效果。
×
乘法混合 (Multiply)
Blend DstColor Zero
颜色相乘,越叠越暗。适合阴影和叠色。
☀
滤色 (Screen)
Blend One OneMinusDstColor
反相乘法再反相。白色完全通过,黑色无影响。
⊕
差值 (Difference)
BlendOp Sub
Blend One One
相减取绝对值。产生反转效果,常用于检测差异。
⍺
Alpha 混合 (Standard)
Blend SrcAlpha OneMinusSrcAlpha
标准透明度混合。Src × α + Dst × (1-α)。
◐
预乘 Alpha
Blend One OneMinusSrcAlpha
RGB 已预乘 alpha。避免边缘黑边问题。
高级技巧:自定义叠加混合
对于 叠加 (Overlay) 和 柔光 (Soft Light) 这类非线性混合模式, 需要自定义 Blend 操作符:
cs
// 叠加混合:亮的地方更亮,暗的地方更暗
Shader "Custom/OverlayBlend"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_BlendTex ("Blend (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "Queue"="Transparent" }
// 使用 Min/Max 操作符实现叠加
BlendOp Add
Blend DstColor Zero, Zero SrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
sampler2D _BlendTex;
fixed4 frag (v2f i) : SV_Target
{
fixed4 base = tex2D(_MainTex, i.uv);
fixed4 blend = tex2D(_BlendTex, i.uv);
// 叠加公式实现
fixed4 result;
result.rgb = base.rgb < 0.5
? 2.0 * base.rgb * blend.rgb
: 1.0 - 2.0 * (1.0 - base.rgb) * (1.0 - blend.rgb);
result.a = blend.a;
return result;
}
ENDCG
}
}
}
实战建议
大多数情况下,Blend One One(加法)和 Blend DstColor Zero(乘法)就能满足 90% 的需求。 只有在需要精确还原 Photoshop 效果时才需要自定义 Shader 逻辑。
总结
🎯 核心要点
- 加法混合 (
Blend One One): 颜色相加,越叠越亮。用于发光、火焰、能量体。 - 乘法混合 (
Blend DstColor Zero): 颜色相乘,越叠越暗。用于阴影、叠色、变暗效果。 - 组合使用 :大多数 Photoshop 图层模式都可以通过
Blend指令组合实现。 - Shader Graph:透明物体直接选择 Surface Type 为 Transparent,再选择对应的 Blend Mode 即可。
渲染队列注意
使用混合模式时,确保设置正确的 RenderQueue。 半透明物体需要在不透明物体之后渲染,所以通常设置 Tags { "Queue" = "Transparent" }。