一 基础介绍
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)