Unity URP Shader 混合模式完全指南

深入理解加法混合与减法混合,实现 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 逻辑。

总结

🎯 核心要点

  1. 加法混合 (Blend One One): 颜色相加,越叠越亮。用于发光、火焰、能量体。
  2. 乘法混合 (Blend DstColor Zero): 颜色相乘,越叠越暗。用于阴影、叠色、变暗效果。
  3. 组合使用 :大多数 Photoshop 图层模式都可以通过 Blend 指令组合实现。
  4. Shader Graph:透明物体直接选择 Surface Type 为 Transparent,再选择对应的 Blend Mode 即可。

渲染队列注意

使用混合模式时,确保设置正确的 RenderQueue。 半透明物体需要在不透明物体之后渲染,所以通常设置 Tags { "Queue" = "Transparent" }

相关推荐
mxwin2 小时前
Unity URP 下 HDR 与 Tonemapping 的 Shader 意识
unity·游戏引擎
沉默金鱼3 小时前
U3D高级编程:主程手记——第二章2.1读书笔记
unity·游戏引擎
mxwin14 小时前
Unity Shader 深度写入与关闭ZWrite Off · 半透明排序 · 粒子穿插
unity·游戏引擎·shader
张老师带你学16 小时前
宇宙飞船完整Unity项目
科技·游戏·unity·游戏引擎·模型
mxwin16 小时前
Unity URP 下的流体模拟 深入解析 Navier-Stokes 方程与浅水方程的数学原理
unity·游戏引擎
mxwin19 小时前
Unity Shader 深度重建世界坐标
unity·游戏引擎·shader
雪儿waii20 小时前
Unity 中继承(父类子类)用法详解
unity·游戏引擎
总写bug的程序员20 小时前
用 AI 蒸馏球员的思维操作系统:qiuyuan-skill 技术解析
人工智能·unity·游戏引擎
mxwin1 天前
Unity Shader 预乘 Alpha 完全指南 解决半透明纹理边缘黑边问题,让你的 UI 渲染更干净
unity·游戏引擎