1.渲染顺序
对于开发具有透明效果的Shader而言,渲染顺序十分重要,为了解决渲染顺序的问题,Unity提供了渲染队列:
名称 | 描述 |
Background | 这个渲染队列会在任何其他队列之前被渲染,我们通常使用该队列来渲染那些需要绘制在背景上的物体 |
Geometry | 默认的渲染队列,大多数物体都是用这个队列,不透明物体使用这个队列 |
AlphaTest | 需要透明度测试的物体使用这个队列,在所有不透明物体渲染之后再渲染他们会更高效 |
Transparent | 这个队列中的物体会在所有Geometry和AlphaTest物体渲染后,再按从后往前的顺序进行渲染,任何使用了透明度混合(例如关闭了深度写入的Shader)的物体都应该使用该队列 |
OverLay | 该队列用于实现一些叠加效果,任何需要在最后渲染的物体都应该使用该队列。 |
2.透明度测试
只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会在进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方式来处理它。
3.透明度混合
它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色,但是,透明度混合需要关闭深度写入,这时的我们要非常小心物体的渲染顺序。
Blend语义:
语义 | 描述 |
Blend Off | 关闭混合 |
Blend SrcFactor DstFactor | 开启混合,并设置混合因子,源颜色(该片元产生的颜色)会乘于SrcFactor,而目标颜色(已经存在于颜色缓存的颜色)会乘以DstFactor,然后把两者相加后再存入颜色缓冲中 |
Blend SrcFactor DstFactor,SrcFactorA DstFactorA | 和上面几乎一样,只是使用不同的因子来混合透明通道 |
BlendOp BlendOperation | 并非是把源颜色和目标颜色简单地加减后混合,而是使用BlendOperation来对他们进行其他操作 |
混合因子:
参数 | 描述 |
One | 因子为 1 |
Zero | 因子为 0 |
SrcColor | 因子为源颜色值,当用于混合RGB通道的混合等式时,使用SrcColor的RGB分量作为混合因子;当用于混合A的混合等式时,使用SrcColor的A分量作为混合因子 |
SrcAlpha | 因子为源颜色的透明度值(A通道) |
DstColor | 因子为目标颜色值。当用于混合RGB通道的混合等式时,使用DstColor的RGB分量作为混合因子;当用于混合A的混合等式时,使用DstColor的A分量作为混合因子 |
DstAlpha | 因子为目标颜色的透明度值(A通道) |
OneMinusSrcColor | 因子为(1-源颜色)。当用于混合RGB通道的混合等式时,使用结果的的RGB分量作为混合因子;当用于混合A的混合等式时,使用结果的A分量作为混合因子 |
OneMinusSrcAlpha | 因子为(1-源颜色的透明度值) |
OneMinusDstColor | 因子为(1-目标颜色)。当用于混合RGB通道的混合等式时,使用结果的的RGB分量作为混合因子;当用于混合A的混合等式时,使用结果的A分量作为混合因子 |
OneMinusDstAlpha | 因子为(1-目标颜色的透明度值) |
BlendOperation:
操作 | 描述 |
Add | 将混合后的源颜色和目标颜色相加。默认的混合操作。使用的混合等式是: |
Sub | 将混合后的源颜色减去混合后的目标颜色。使用的混合等式是: |
RevSub | 将混合后的目标颜色减去混合后的源颜色。使用的混合等式是: |
Min | 使用源颜色和目标颜色中较小的值,是逐分量比较的,使用的混合等式为: |
Max | |