赞
踩
在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
点击查看混色公式
设置当前物体与场景物体重合时,通过深度和透明测试的像素该如何显示。
【颜色缓冲区】:也叫帧缓冲区,场景中的物体的像素都要写入该缓冲区,然后再渲染到屏幕上显示
【深度缓冲区】:用于记录颜色缓冲区中每个像素的深度值,通过深度缓冲区,我们可以通过深度测试来确定像素的遮挡关系
【模版缓冲区】:与深度缓冲类似,但这个值是可以自己设定的。,通过设置每个像素的模板缓冲值,就可以指定只渲染某些像素,用于实现类似遮罩之类的效果。
总的来说深度测试ZTest决定遮挡关系,是否用当前像素替换缓存像素
透明测试alphatest决定是否显示透明度达标的像素,要么完全显示,要么完全不显示
颜色混合blend决定通过测试的像素如果重合如何显示
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 缓存像素*因子2
Blend 因子1 因子2
//可选的混合操作 如果不写 就默认是Add 该操作决定上面 当前像素与缓存像素的处理关系
BlendOp Add
如果不写BlendOp,Blend 的 计算公式就是当前颜色 x 因子1 + 缓存颜色 x 因子2
如果 BlendOp Sub,Blend 的 计算公式就是当前颜色 x 因子1 - 缓存颜色 x 因子2
【Blend命令】
指令 | 说明 | 实例 |
---|---|---|
Blend Off | 关闭混合 | |
Blend 混合因子 混合因子 | 混合因子SrcFactor的介绍在下面。开启后当前颜色会乘以已经存于缓存中的颜色,然后把两者相加后再存入颜色缓冲中 | |
Blend SrcFactor DstFactor, SrcFactorA DstFactorA | 上同,组合混合 | |
BlendOp BlendOperation | 使用BlendOperation进行附加操作 |
因子是用作混合规则参数的值
【当前因子】 当前像素就是指当前shader脚本所属的模型像素
【缓存因子】 准备输出到屏幕上的像素,被称为缓存像素
【启用Blend必要条件】Blend不为Off
指令 | 说明 | 实例 |
---|---|---|
One | 因子值为1 | |
Zero | 因子值为0 | |
SrcColor | 因子为当前像素RGBA通道值 | 当与rgb值混合时,使用SrcColor中的rgb通道作为因子值,当用于混合与a值时,则使用SrcColor的a通道作为因子值 |
SrcAlpha | 因子值为当前像素的A通道 | |
DstColor | 因子为缓存像素RGBA通道值, | 当与rgb值混合时,使用DstColor的rgb通道作为因子值,当用于混合a值时,则使用DstColor的a通道作为因子值 |
DstAlpha | 因子值为缓存像素的A通道 | |
OneMinusSrcColor | 因子为 1 - 当前像素RGB通道 | |
OneMinusSrcAlpha | 因子为 1 - 当前像素的A通道 | |
OneMinusDstColor | 因子为 1 - 缓存像素的RGB通道 | |
OneMinusDstAlpha | 因子为 1- 缓存像素的A通道 |
BlendOp 的作用是决定Blend 混合的 当前像素与缓存像素如何处理。如果不写就默认是Add
指令 | 说明 | 实例 |
---|---|---|
Add | 混合后的当前颜色 + 缓存颜色 | |
Sub | 混合后的当前颜色 - 缓存颜色 | |
RevSub | 缓存颜色 - 混合后的当前颜色 | |
Min | min(当前颜色,缓存颜色) | 他们之中较小的那个 |
Max | max (当前颜色,缓存颜色) | 他们之中较大的那个 |
【准备工作】
首先创建两个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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。