Unity3D教程宝典之Shader篇:第十二讲 Alpha测试
引言:本讲和下一讲主要讲Alpha即透明通道有关的内容。RGBA,其中最终在屏幕上显示的只有RGB即 红绿蓝组成的颜色,Alpha并没有任何颜色显示。A只是辅助颜色运算特别是多图层运算而已。例如在单图层的情况下(1,1,1,0.8)输出的是(1,1,1)*0.8即 浅灰色(0.8,0.8,0.8),和(0.8,0.8,0.8)是等价的.但是假如不再是单图层而背景为绿色(0,1,0,1)的时候,(0.8,0.8,0.8)就不知道怎么去运算了,而(1,1,1,0.8)知道。看不懂这段引言?没关系,往下看,当学完第五讲和第六讲后再回来看就自然能深刻理解了。
什么是通道:
通道是8位的灰度图像,能够显示256种灰度,用来表示颜色的RGBA值。R=Red红色,G=Green绿色,B=blue蓝色,A=alhpa透明值, 其中RGB为原色通道,A为透明通道。
在通道中,以白色代替透明表示要处理的部分(选择区域);以黑色表示不需处理的部分(非选择区域)
所有通道取值范围是 [0,255], 但是在Shader里取值范围是[0,1], 0和1分辨对应0和255
什么是Alpha通道:
定义:一般图形卡具有32位总线,附加的8位信号就被用来保存不可见的透明度信号以方便处理用,这就是Alpha通道。白色的alpha象素用以定义不透明的彩色象素,而黑色的alpha象素用以定义透明象素,黑白之间的灰阶用来定义半透明象素。
简而言之:Alpha通道取值同样为[0,255] 以及Shader[0,1], 值越小最透明,值最大越不透明。在Shader里即0为透明,什么都没有,编辑器显示为黑色。1则不透明,全部都显示,编辑器其显示为白色如下图。
什么是Alpha Test:
Alpha Test ,中文就是透明度测试。简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。 AlphaTest语句通常位于Pass{}中的起始位置。
语法:
第一种: AlphaTest Off: 不测试,全渲染
第二种:Alpha 比较符 目标alpha值
其中目标alpha值取值范围是 0至1, 也可以用参数 ,如 AlphaTest [varName]。
比较符:(目标alpha值下面记作x)
Always 全渲染(任意x值)
Never 全不渲染
Greater 点的alpha值大于x时渲染
GEuqal 点的alpha值大于等于x时渲染
Less 点的alpha值小于x时渲染
LEqual 点的alpha值小于等于x时渲染
Equal 点的alpha值等于x时渲染
NotEqual 点的alpha值不等于x时渲染
例:
AlphaTest never 0 全不渲染(这个0可以是任意值,但必须填)
AlphaTest always 0 全渲染(这个0可以是任意值,但必须填)
AlphaTest off 全渲染
AlphaTest Greater 0.4 当alpha大于0.4渲染, 缺点是边缘过于锋利并且显示不完整,alpha小于0.4的部分被忽略掉了
Alpha Blend 边缘柔和,但是中心也太柔和,没有实体的感觉
AlphaTest Greater 0.4 / AlphaTest LEqual 0.4 两个部分,大于0.4不混合,小于0.4混合。效果是既有实体感觉,边缘也柔和。