首页 > 编程知识 正文

unity blend(unity静态合批)

时间:2023-05-05 10:59:44 阅读:74635 作者:3977

抓手:

虽然不知道unity对alphablend的官方文档是翻译还是什么,但感觉有点深奥,有点庸俗。

今天给自己和大家关于alphablend的终极说明。 建议将alphablend视为简单的计算公式。

最后,我将给出一个灵活的例子,说明如何在shader中书写会更灵活。

关于Alpha Blend的定义

执行shader后,计算出的像素的色值和现有像素的色值的组合方法的控制命令以下,alphablend!

也就是说,alphablend是一种控制命令,一种命令!

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

字母为计算公式,类似于Photoshop中图层混合模式的计算公式。

语法:

Blend SrcFactor DstFactor

翻译因子

其中,SrcFactor和DstFactor的值类型应该从vector变为vector4,例如float(1.0 )或float) 0.5、0.8、0.5和1。

对应的公式为:

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

所有因子如下:

One 1

零零零

SrcColorshader计算的rgb值

SrcAlphashader计算后的阿尔法值

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

DRC alpha帧缓冲区的源alpha值。 画面上现有颜色的alpha值)

OneMinusSrcColor即1-SrcColor

OneMinusSrcAlpha即1-SrcAlpha

OneMinusDstColor即1-DstColor

OneMinusDstAlpha即1-DstAlpha

运算:

blendop可以替换blend的运算,默认的blend运算是add,即加法

中选择所需的墙类型

混合操作辅助,即:

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

BlendOp RevSub即

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

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

也就是说,在(屏幕上的现有颜色(*DstFactor )和(shader计算的颜色) *SrcFactor )中,该像素的颜色选择色值最小的颜色之一。

最大值

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

也就是说,该像素的颜色是(屏幕上现有颜色(*DstFactor )和(shader计算的颜色) *SrcFactor )中颜色值最大的颜色之一。

例如:

公式:

Blend One One=shader计算的颜色*1屏幕上已有颜色*1

类似于Photoshop的线性淡入淡出。

所以可以做同样的事情:

blendoneoneminussrcalpha=shader col *1screen * (1-地图阿尔法) ) ) ) ) )。

blendsrcalphaoneminussrcalpha=shader col * (贴图alpha screen * (1-贴图alpha ) () ) ) ) ) ) ) )。

在shader里也可以这样写:

属性

{

.

_blendsrc(_blendsrc ),int )=1

_blendDRC(_blendDRC ),int )=1

_blendop(_blendop ),int )=0

}

次着色器

{

tags { ' render type '=' 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

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。