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

相关推荐
mxwin1 天前
unity shader中 ddx ddy是什么
unity·游戏引擎·shader
郝学胜-神的一滴1 天前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
nnsix1 天前
Unity ILRuntime 笔记
unity·游戏引擎
nnsix2 天前
Unity API 兼容的 .NET Standard 2.1 和 .NET Framework 区别
unity·游戏引擎·.net
mxwin2 天前
Unity Shader 制作半透明物体 使用多Pass提前写入深度的方式 避免穿模
unity·游戏引擎
nnsix2 天前
Unity HybridCLR 笔记
笔记·unity·游戏引擎
nnsix2 天前
Unity Addressables 笔记
unity·游戏引擎
RReality2 天前
【Unity Shader URP】视差贴图 实战教程
ui·平面·unity·游戏引擎·图形渲染·贴图
小清兔2 天前
Addressable的设置打包流程
笔记·游戏·unity·c#
3D霸霸2 天前
Sourcetree 拉取新工程
数据仓库·unity