大白话版 UnityShader学习(3)-透明效果
根据冯乐乐大小姐的书以及相关资料来进行学习,总结学习经验,分享心得。
透明效果的定义以及相关内容
什么是透明效果,就是光可以完全通过或者部分透过的物体上所发生的状态,称之为透明(个人理解),那么放到Unity里进行解释的话,则无非是RGBA4个通道里,A通道也就是Alpha通道的使用。在过去几年前的手机游戏图像技术发展中,由于开发环境,开发周期以及游戏优化等原因,透明效果其实并不多见。当时大部分的手机游戏表现这种状态的形式是,通过UI图标,原画等形式来简单呈现出这种效果,比较出名的游戏便是仙剑奇侠传1,超级玛丽,忍者神龟等等的2D画面。
随着技术的发展和3D游戏的兴起,半透明似乎成为了一个3D游戏的一个基础表现,当然不只是游戏,很多平台,软件的后台里会默认的写进这种效果来强化你的视觉,以此便于制作人的创作。
言归正传,UnityShader里对这种效果也给出了支持,几个重点:
(1). 计算机对于透明和非透明的物体区分很是简单,A通道为0时,则像素为不显示;A通道为1时,则像素为完全不透明;介于之间的状态则为半透明,那么在我们操作表现上很简单
Properties
{
_AlphaScale("图片a通道的范围",Range(0,1.0)) = 0.5 //区间为0~1
}
(2). 那么Unity Shader对于实现透明效果的第一种方法便是,透明度测试(Alpha Test),他是Unity默认提供的一种表现方法,Shader里是深度写入,测试俩个字一出现,那么便会想到判断,这种情况会怎么样,那种情况又会怎么样,显然在Shader里这种测试是很纯粹的:要么这个片元满足条件,留下;反之,扔掉。判断的内容一般是小于某个阈值的时候(比如x<= 0.00001),那么这种测试结果会带来一个什么样的效果呢?如果2个物体先后放在摄像头前面,那么测试后要么只能看见后面的,要么只能看见前面的,这种结果没有融合,倒似乎有点像互斥,所以这并不是我们所想要的状态。
(3). 第二种方法,透明度混合(Alpha Blend),这种办法相对于第一种变得灵活起来,在重叠的时候,会根据透明度的比例,对片元进行二次着色,这样来模拟出现实的透明效果,当然这里面会涉及到更多的表现形式,比如透明折射,透明自发光的散射等等。在技术层面上讲,我们关闭了Unity里自带的深度写入,但是并不是我们不需要这个功能了,只是关闭写入,判断依旧是需要的,因为没有深度之分,则透明度混合也没有了意义。也就是说,对于透明度混合来说 ,深度缓冲是只读的。
渲染顺序也十分重要
冯姐姐在书中对此写的十分详细,总结几点
(1). 顺序先后十分重要,没有了Shader深度写入的功能,那么它可能会无法渲染出你想要的效果,如场景中有俩个物体,A,B。大概的距离为摄像机—>A—>B,那么问题来了,如果说我们先渲染B,再渲染A的话,B 首先会正常的写入颜色缓冲,之后再和A混合,这样的话,结果是正确的。
(2).反之,如果先渲染A的话,当然A肯定是先写入缓冲,随后B再次渲染的话,就会发现,B似乎在A的前面,这样的话就不正确了。那么这边便提出了渲染的物体越近,就越往后渲染观点。
(3).为解决渲染顺序,unity提供了渲染队列。Queue标签决定模型使用哪个队列
名称 | 队列索引 | 描述 |
---|---|---|
Background | 1000 | 最早渲染的队列,用于渲染背景 |
Geometry | 2000 | 默认渲染队列,不透明物体使用这个 |
AlphaTest | 2450 | 透明度测试 |
Transparent | 3000 | 使用透明度混合或关闭深度写入的shader |
Overlay | 4000 | 使用一些叠加效果,最后渲染的物体都使用该队列 |