第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > unity ShaderLab 基础之【像素混合Blend】Blend命令详解 shaderLab blend blendOp透明度颜色混合

unity ShaderLab 基础之【像素混合Blend】Blend命令详解 shaderLab blend blendOp透明度颜色混合

时间:2020-02-09 20:17:29

相关推荐

unity ShaderLab 基础之【像素混合Blend】Blend命令详解 shaderLab blend blendOp透明度颜色混合

一 基础介绍

1颜色相关

在unity中,颜色分为RGB255,RGB1,HSV。这几种格式的值不同,但效果都一样。

【RGB 0-255】:

形式一般为(R,G,B,A),取值范围为0-255。

rgb的值越低则越趋近黑色,越高则越趋近白色

a的值越低则透明度效果越好,越高则透明效果越不好。

【RGB 0-1】

与RGB 255差不多,不过取值范围是0-1

【HSV】

HSV的形式为(H,S,V,A),H的取值范围为0-360,SVA的取值范围为100

点击查看混色公式

2 Blend 混合

设置当前物体与场景物体重合时,通过深度和透明测试的像素该如何显示。

3 缓冲区

【颜色缓冲区】:也叫帧缓冲区,场景中的物体的像素都要写入该缓冲区,然后再渲染到屏幕上显示

【深度缓冲区】:用于记录颜色缓冲区中每个像素的深度值,通过深度缓冲区,我们可以通过深度测试来确定像素的遮挡关系

【模版缓冲区】:与深度缓冲类似,但这个值是可以自己设定的。,通过设置每个像素的模板缓冲值,就可以指定只渲染某些像素,用于实现类似遮罩之类的效果。

4 深度测试ZTest、透明测试AlphaTest、混合模式Blend的关系

总的来说深度测试ZTest决定遮挡关系,是否用当前像素替换缓存像素

透明测试alphatest决定是否显示透明度达标的像素,要么完全显示,要么完全不显示

颜色混合blend决定通过测试的像素如果重合如何显示

二 Blend 混合

1 语法说明

Blend的计算公式:【当前颜色 x 因子1 处理方式 缓存颜色 x 因子2】

假设当前颜色的四个分量是 (R1, G1, B1, A1), 缓存颜色的四个分量是(R2,G2, B2, A2),

设当前因子为(r1, g1, b1, a1), 缓存因子为 (r2, g2, b2, a2)

则混合产生的新颜色为,: (R1 * r1 + R2 * r2, G1 * g1 + G2 * g2,B1 * b1 + B2 * b2,A1 * a1 + A2 * a2)

【shader写法】

//声明命令 当前像素*因子1 缓存像素*因子2Blend 因子1 因子2//可选的混合操作 如果不写 就默认是Add 该操作决定上面 当前像素与缓存像素的处理关系BlendOp Add

如果不写BlendOp,Blend 的 计算公式就是当前颜色 x 因子1 + 缓存颜色 x 因子2

如果 BlendOp Sub,Blend 的 计算公式就是当前颜色 x 因子1 - 缓存颜色 x 因子2

2 混合相关命令说明

【Blend命令】

3 混合因子说明

因子是用作混合规则参数的值

【当前因子】 当前像素就是指当前shader脚本所属的模型像素

【缓存因子】 准备输出到屏幕上的像素,被称为缓存像素

【启用Blend必要条件】Blend不为Off

4 BlendOp 混合操作

BlendOp 的作用是决定Blend 混合的 当前像素与缓存像素如何处理。如果不写就默认是Add

三 实例

【准备工作】

首先创建两个image ui 分别命名A、B,创建单独的材质与shader并将分别他们赋给这两个iamge。将下面代码放入shader中,设置A的颜色值为(0,255,255,255),B的颜色设置为(255,0,255,155),155是透明度

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/B"{Properties{_MainTex ("贴图", 2D) = "white" {}_BackgroundColor ("背景颜色", Color) = (1, 1, 1, 1)}SubShader{Pass{///这段 是 Bshader 独有的 ,在Ashader中请删掉Tags {"Queue" = "Transparent" "RenderType"="Transparent" }Blend SrcAlpha OneMinusSrcAlpha///CGPROGRAM#pragma vertex vert#pragma fragment frag//从程序传染顶点渲染器的数据struct a2v{float4 vertex : POSITION;float2 uv : TEXCOORD0;};//从顶点渲染器传入片元渲染器的数据struct v2f{float4 position : SV_POSITION;float2 uv : TEXCOORD0;};//格子背景sampler2D _MainTex;fixed4 _BackgroundColor;//顶点着色器v2f vert (a2v v){v2f o;//将像素空间从模型转为裁剪空间o.position = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}//片段着色器fixed4 frag (v2f o) : COLOR{fixed4 renderTex = tex2D(_MainTex, o.uv);//合成贴图、遮罩、线的像素return renderTex * _BackgroundColor;}ENDCG}}}

结果:

【实例1 正常混合】

描述:当前颜色 x 当前透明度 +(1 - 当前透明度)x 缓存颜色

语法:Blend SrcAlpha OneMinusSrcAlpha

计算:(0,255,255,255)* (127 / 255) +(255,0,255,155)* (1 - 127 / 255)

= (0,127,127,127)* 0.5 + (127,0,127,127)* 0.5

= (127,127,255,255)

【实例2 柔和相加】

描述:当前颜色 x (1 - 缓存颜色) + 缓存颜色 x 1

语法:Blend OneMinusDstColor One

【实例3 正片叠底】

描述:当前颜色 x 缓存颜色 + 缓存颜色 x 0

语法:Blend DstColor Zero

【实例4 两倍相乘】

描述:当前颜色 x 缓存颜色 + 缓存颜色 x 当前颜色

语法:Blend DstColor SrcColor

【实例5 变暗】

描述: min(当前颜色,缓存颜色) x 1 + min(当前颜色,缓存颜色) x 1

语法:

BlendOp Min

Blend One One

【实例6 变亮】

描述: max(当前颜色,缓存颜色) x 1 + min(当前颜色,缓存颜色) x 1

语法:BlendOp Max

Blend One One

【实例7 滤色】

描述:当前颜色 x (1 - 缓存颜色) + 缓存颜色 x 1 或 当前颜色 x 1 + 缓存颜色 x (1 - 缓存颜色)

语法:Blend OneMinusDstColor One 或Blend One OneMinusSrcColor

【实例7 线性减淡】

语法:Blend One One

描述:缓存颜色 * 1 + 当前颜色 * 1

计算:(0,255,255,255)* 1 +(255,0,255,127)* 1 = 255,255,255,255)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。