unity_blend

博客主要介绍了Unity中Shader的混合相关内容。Blend是混合关键字,能让源颜色与颜色缓冲区颜色按规则混合。文中给出了多种Blend语法,如关闭混合、配置并启用混合等,还提及可设置上层渲染目标混合模式,适用于多数现代API/GPU。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • blend:混合关键字,意在让当前片元计算出的源颜色与颜色缓冲区中已存在的颜色按照一定规矩进行混合。
  • unity官方文档:ShaderLab:混合 - Unity 手册

语法

Blend Off: 关闭混合(这是默认值)

Blend SrcFactor DstFactor: 配置并启用混合。生成的颜色将乘以 SrcFactor。屏幕上的已有颜色乘以 DstFactor,然后将这两个值相加。

Blend SrcFactor DstFactor, SrcFactorA DstFactorA: 同上,但使用不同系数来混合 Alpha 通道。

BlendOp OP:不将混合颜色相加,而是对它们执行不同的操作。

BlendOp OpColor, OpAlpha:同上,但是对颜色 (RGB) 通道和 Alpha (A) 通道使用不同的混合操作。

此外,您还可以设置上层渲染目标混合模式。当使用多渲染目标 (MRT) 渲染时,上面的常规语法 将为所有渲染目标设置相同的混合模式。以下语法可以为各个渲染目标设置不同的混合模式,其中 N 是渲染目标索引(0 到 7)。此功能适用于大多数现代 API/GPU(DX11/12、GLCore、Metal 和 PS4):

  • Blend N SrcFactor DstFactor
  • Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
  • BlendOp N Op
  • BlendOp N OpColor, OpAlpha
常用混合模式
Blend SrcAlpha OneMinusSrcAlpha传统透明度
Blend One OneMinusSrcAlpha预乘透明度
Blend One One 加法
Blend OneMinusDstColor One软加法
Blend DstColor Zero

乘法

Blend DstColor SrcColor2x 乘法


P2

Shader常用枚举类型

Shader "MyShaders/EnumTest"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}

        [Header(Option)]
        [Space(5)]
        [Enum(UnityEngine.Rendering.BlendOp)] _BlendOp("BlendOp", Float) = 0
        [Enum(UnityEngine.Rendering.BlendMode)] _SrcMode("SrcMode", Float) = 1
        [Enum(UnityEngine.Rendering.BlendMode)] _DstMode("DstMode", Float) = 0
        [Enum(UnityEngine.Rendering.CullMode)] _CullMode("CullMode", Float) = 0
        [Enum(UnityEngine.Rendering.CompareFunction)] _ZTestMode("ZTestMode", Float) = 0
        [Enum(UnityEngine.Rendering.ColoWriteMask)] _ColorMask("ColorMask", Float) = 15
        //控制深度写入的比较特殊,可以用 Toggle 或者自定义的 Enum
        [Enum(off, 0, On, 1)] _ZWriteMode("ZWriteMode", Float) = 1


        [Header(Stencil)]
        [Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp ("Stencil Comparison",         Float) = 8
        [IntRange] _StencilWriteMask ("Stencil Write Mask", Range(0,255)) = 255
        [IntRange] _StencilReadMask ("Stencil Read Mask", Range(0,255)) = 255
        [IntRange] _Stencil ("Stencil ID", Range(0,255)) = 0
        [Enum(UnityEngine.Rendering.StencilOp)] _StencilPass ("Stencil Pass", Float) = 0
        [Enum(UnityEngine.Rendering.StencilOp)] _StencilFail ("Stencil Fail", Float) = 0
        [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFail ("Stencil ZFail", Float) = 0

    }

    SubShader
    { 
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            BlendOp [_BlendOp]
            Blend [_SrcMode][_DstMode]
            ZTest [_ZTestMode]
            ZWrite [_ZWriteMode]
            Cull [_CullMode]
            ColorMask [_ColorMask]

            Ref [_Stencil]
            Comp [_StencilComp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
            Pass [_StencilPass]
            Fail [_StencilFail]
            ZFail [_StencilZFail]

            ......
        }
    }

     Fallback Off   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值