今天学习了简单的透明Shader的实现,真的是比想象中简单很多,但是有很多需要注意的点,特别是渲染顺序!
1. 渲染顺序
首先我们要知道,对于透明物体,他只开启了深度测试而没有开启深度写入
我们来考虑这样一种情况,物体A是透明的,物体B是不透明的。物体A在物体B前面,刚好遮住了B。
(1)如果我们先渲染物体B,B将会写入颜色缓冲与深度缓冲中。然后渲染物体A,我们发现物体A是透明物体,它将会进行深度测试,发现A比B离摄像机更近,因此我们将A的信息与颜色缓冲中的信息(即B的信息)进行混合,得到了正确的结果
(2)如果我们先渲染物体A,A发现颜色缓冲与深度缓冲是空的,于是它直接写入颜色缓冲。然后渲染B,B发现深度缓冲是空的,于是它不去考虑颜色缓冲有没有信息,直接用自己的信息覆盖了原来的颜色缓冲中的信息。这样视觉显示上B就在A前面了,得到错误的结果
据此,我们确定不透明物体必须先于透明物体渲染
我们来考虑另一种情况,物体A和B都是透明的,物体A在物体B前面,遮住了物体B。
(1)如果先渲染物体B,物体B的信息会写入颜色缓冲。然后渲染物体A,A会与颜色缓冲中的信息进行混合,得到相应的效果
(2)如果先渲染物体A,然后渲染物体B,我们就得到了刚好相反的结果...
据此,我们确定透明物体必须按由远至近的顺序渲染
2.透明度测试
在UnityShader中有以下几个渲染队列:
Background:这是最先渲染的队列,通常用于渲染背景信息
Geometry:一般不透明物体都在这个队列中
AlphaTest:需要透明度测试的物体使用这个队列
Transparent:进行透明度混合的物体使用这个队列
Overlay:该队列用于实现一些叠加效果
接下来我们来实现透明度测试,透明度测试是指,只要一个片元的透明度不满足条件,就舍弃这个片元。也就是说一个片元要么全部保留,要么全部舍弃,我们这样就得到完全透明与不透明两种极端的片元类型。
Shader "Custom