在实时渲染中要实现透明效果, 通常会在渲染模型时控制它的透明通道( Alpha Channel)。 当开启透明混合后, 当一个物体被渲染到屏幕上时, 每个片元除了颜色值和深度值之外, 它还有另一个属性—透明度。 当透明度为 1 时, 表示该像素是完全不透明的, 而当其为 0 时, 则表示该像素完全不会显示。
在 Unity 中, 我们通常使用两种方法来实现透明效果:
第一种是使用透明度测试( Alpha Test), 这种方法其实无法得到真正的半透明效果;
另一种是透明度混合(Alpha Blendhig)。
对于不透明物体,不考虑它们的渲染顺序也能得到正确的排序效果,这是由于强大的深度缓冲的存在。深度缓冲的基本思想是:根据深度缓存中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在于深度缓冲中的值进行比较(如果开启了深度测试,默认判断是小于等于),如果它的值距离摄像机更远,那么说明这个片元不应该被渲染到屏幕上(有物体挡住了它);否则,这个片元应该覆盖掉此时颜色缓冲中的像素值,并把它的深度值更新到深度缓冲中(如果开启了深度写入)。
透明度测试和透明度混合的基本原理如下:
透明度测试:只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方式来处理它,即进行深度测试、深度写入等。也就是说,透明度测试是不需要关闭深度写入的,它和其他不透明物体最大的不同就是它会根据透明度来舍弃一些片元。虽然简单,但是它产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
透明度混合:这种方法可以得到真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是,透明度混合需要关闭深度写入,这使得我们要非常小心物体的渲染顺序。
需要注意的是,透明度混合只关闭了深度写入,但