抓手:
虽然不知道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