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" }

相关推荐
winlife_10 小时前
在 Unity 里用 AI 做游戏:funplay-unity-mcp 从安装到第一次让 AI 改场景
人工智能·游戏·unity·ai编程·claude·mcp
qq_2052790511 小时前
Unity 运行时候会时不时卡顿一下,哪怕是空场景
unity·游戏引擎
美团骑手阿豪14 小时前
Unity UGUI自适应分辨率
unity·游戏引擎
LONGZETECH16 小时前
软硬协同+故障注入:无人机仿真维修与操控仿真底层算法逻辑拆解
大数据·c语言·算法·3d·unity·无人机
winlife_16 小时前
让 AI 跑通“调跳跃手感“的完整闭环:funplay-unity-mcp 实战案例
人工智能·unity·游戏引擎·ai编程·mcp·游戏手感
winlife_16 小时前
从一句话到可玩原型:用 funplay-unity-mcp 让 AI 搭起完整游戏循环
人工智能·游戏·unity·ai编程·mcp·游戏原型
ellis197019 小时前
Unity中使用Cursor辅助开发
unity
avi911121 小时前
Unity商业插件之(三) Editor扩展,二次开发
unity·单例·editor扩展·editor开发
winlife_1 天前
让 AI 自动跑 PlayMode 回归测试:从 BUG 注入到自动判 FAIL 的完整闭环
人工智能·unity·bug·ai编程·mcp·回归测试·游戏测试
WarPigs2 天前
游戏签到系统
unity