Unity Alpha Blend混合的最终解释

17 篇文章 9 订阅
16 篇文章 1 订阅

抓手:

unity官方文档对于alpha blend的解释不知是翻译还是什么问题,感觉略深奥呀,感觉不通俗。

今天来给自己和大家做一个关于alpha blend的终极解释,建议大家把alpha blend当做一个简单的计算公式看待。

最后会提供一个灵活的例子,展示在shader里咋写会更灵活。

 

关于Alpha Blend的定义

shader执行后,计算出来的像素颜色值与已有像素的颜色值的组合方式的 控制命令称为:alpha blend!

也就是,alpha blend是一种控制命令,是一种命令!

我自己对于Alpha Blend理解的定义:

alpha blend是一个计算公式,和Photoshop的图层的混合模式的计算公式类似。

 

语法:

Blend SrcFactor DstFactor

翻译 Factor:因子

其中,SrcFactor和DstFactor的值类型应该是vector到vector4,例如float(1.0)或float4(0.5,0.8,0.5,1)这种。

对应的公式为:

最终的颜色 = (shader计算的颜色*SrcFactor) + (屏幕已有的颜色*DstFactor)

 

所有的Factor如下:

One 1

Zero 0

SrcColor shader计算后的rgb值

SrcAlpha shader计算后alpha值

DrcColor 帧缓冲区的源rgb值(屏幕已有颜色)

DrcAlpha 帧缓冲区的源alpha值(屏幕已有颜色的alpha值)

OneMinusSrcColor  也就是1-SrcColor

OneMinusSrcAlpha 也就是1-SrcAlpha

OneMinusDstColor 也就是1-DstColor

OneMinusDstAlpha 也就是1-DstAlpha

 

运算:

BlendOp Op  可以更换blend的运算,默认的blend运算是add,也就是相加

可以改成

BlendOp Sub 也就是:

最终的颜色 = (shader计算的颜色*SrcFactor) - (屏幕已有的颜色*DstFactor)

BlendOp RevSub 也就是

最终的颜色 =  (屏幕已有的颜色*DstFactor) - (shader计算的颜色*SrcFactor)

Min

最终的颜色 =  min((屏幕已有的颜色*DstFactor), (shader计算的颜色*SrcFactor))

也就是,这个像素的颜色为: (屏幕已有的颜色*DstFactor) 和  (shader计算的颜色*SrcFactor) 里选一个颜色值最小的颜色。

Max

最终的颜色 =  max((屏幕已有的颜色*DstFactor), (shader计算的颜色*SrcFactor))

也就是,这个像素的颜色为: (屏幕已有的颜色*DstFactor) 和  (shader计算的颜色*SrcFactor) 里选一个颜色值最大的颜色。

 

例如:

公式:

Blend One One = shader计算出来的颜色*1+屏幕已有颜色(也就是背景的蓝色)*1

和Photoshop的线性减淡类似。

 

所以同理可得:

blend One OneMinusSrcAlpha = shaderCol*1+screen*(1-贴图alpha)

blend SrcAlpha OneMinusSrcAlpha = shaderCol*(贴图alpha)+screen*(1-贴图alpha)

 

在shader里也可以这样写:

Properties

{

  ...

  _BlendSrc("_BlendSrc",int) = 1

  _BlendDrc("_BlendDrc",int) = 1

  _BlendOp("_BlendOp",int) = 0

}

SubShader

       {

       Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }

         LOD 100

         Pass

            {

            Blend [_BlendSrc] [_BlendDrc]

            BlendOp [_BlendOp]

                ...

            }

   }

其中_BlendSrc或_BlendDrc的值代表:

具体可以参考UnityEngine.Rendering.BlendMode的数值:

namespace UnityEngine.Rendering

{

    //

    // 摘要:

    //     Blend mode for controlling the blending.

    public enum BlendMode

    {

        //

        // 摘要:

        //     Blend factor is (0, 0, 0, 0).

        Zero = 0,

        //

        // 摘要:

        //     Blend factor is (1, 1, 1, 1).

        One = 1,

        //

        // 摘要:

        //     Blend factor is (Rd, Gd, Bd, Ad).

        DstColor = 2,

        //

        // 摘要:

        //     Blend factor is (Rs, Gs, Bs, As).

        SrcColor = 3,

        //

        // 摘要:

        //     Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad).

        OneMinusDstColor = 4,

        //

        // 摘要:

        //     Blend factor is (As, As, As, As).

        SrcAlpha = 5,

        //

        // 摘要:

        //     Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As).

        OneMinusSrcColor = 6,

        //

        // 摘要:

        //     Blend factor is (Ad, Ad, Ad, Ad).

        DstAlpha = 7,

        //

        // 摘要:

        //     Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad).

        OneMinusDstAlpha = 8,

        //

        // 摘要:

        //     Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad).

        SrcAlphaSaturate = 9,

        //

        // 摘要:

        //     Blend factor is (1 - As, 1 - As, 1 - As, 1 - As).

        OneMinusSrcAlpha = 10

    }

}

 

Blend operation的可以参考UnityEngine.Rendering.BlendOp

    public enum BlendOp

    {

        //

        // 摘要:

        //     Add (s + d).

        Add = 0,

        //

        // 摘要:

        //     Subtract.

        Subtract = 1,

        //

        // 摘要:

        //     Reverse subtract.

        ReverseSubtract = 2,

        //

        // 摘要:

        //     Min.

        Min = 3,

        //

        // 摘要:

        //     Max.

        Max = 4,

                         ...

}

看完以上内容来思考这个问题:

那么Blend Off 是不是等于 Blend One Zero呢?

也就是 shader计算的颜色+0

 

 

獾方文档

https://docs.unity3d.com/Manual/SL-Blend.html

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值