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

相关推荐
HH‘HH19 小时前
Unity引擎界面各个功能面板详细介绍
unity·游戏引擎
℡枫叶℡19 小时前
Unity 2D资产命名常用缩写
unity·资产命名缩写
丁小未1 天前
Unity AssetBundle商业化项目资源方案
unity·游戏引擎·assetbundle·unity框架
unityのkiven1 天前
通过 Unity 实现杀戮尖塔2式卡牌系统与机制
unity·游戏引擎
郝学胜-神的一滴1 天前
中级OpenGL教程 020:巧用数组与循环实现多点点光源渲染,告别冗余代码重构方案
c++·unity·游戏引擎·godot·图形渲染·unreal
Duo1J1 天前
【UE】Slate 编辑器工具开发01 - Slate语法 & 常用控件
ue5·编辑器·游戏引擎·ue4
qq_170264751 天前
unity的锁帧和垂直同步
unity·游戏引擎
承渊政道1 天前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
unityのkiven2 天前
Unity 共享材质修改问题与 MaterialPropertyBlock 解决方案
unity·游戏引擎·材质
丁小未2 天前
Unity 极致高效的IM设计方案教程
unity·性能优化·游戏引擎·im