RenderQueue

默认情况下,Unity会基于对象距离摄像机的远近来排序你的对象。因此,当一个对象离摄像机越近,它就会优先绘制在其他更远的对象上面。对于大多数情况这是有效并合适的,但是在一些特殊情况下,你可能想要自己控制对象的绘制顺序。而使用Tags{}块我们就可以得到这样的控制。

Unity提供给我们一些默认的渲染队列,每一个对应一个唯一的值,来指导Unity绘制对象到屏幕上。这些内置的渲染队列被称为Background, Geometry, AlphaTest, Transparent, Overlay。这些队列不是随便创建的,它们是为了让我们更容易地编写Shader并处理实时渲染的。下面的表格描述了这些渲染队列的用法:

示例:

Tags { "Queue"="Geometry" }
    Tags { "Queue"="Geometry-20" }

同时需在SubShader中显示声明ZWrite Off,通知Unity我们会重写物体的渲染深度排序。

Properties

Value

渲染队列描述

Background

1000

This render queue is rendered before any others.

这个队列通常被最先渲染(比如 天空盒)。

Geometry

2000

Opaque geometry uses this queue.

这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。

AlphaTest

2450

Alpha tested geometry uses this queue.

需要开启透明度测试的物体。Unity5以后从Geometry队列中拆出来,因为在所有不透明物体渲染完之后再渲染会比较高效。

GeometryLast


Last render queue that is considered “opaque”.

所有Geometry和AlphaTest队列的物体渲染完后

Transparent

3000

This render queue is rendered after Geometry and AlphaTest, in back-to-front order.

所有Geometry和AlphaTest队列的物体渲染完后,再按照从后往前的顺序进行渲染,任何使用了透明度混合的物体都应该使用该队列(例如玻璃和粒子效果)

Overlay

4000

This render queue is meant for overlay effects.

该队列用于实现一些叠加效果,适合最后渲染的物体(如镜头光晕)。

深度缓冲

深度缓冲(depth buffer | z-buffer)决定哪些物体渲染在前面,哪些物体渲染在后面。基本思想:根据深度缓冲中的值来决定该片元距离摄像机的距离(开启深度测试的前提下),当渲染这个片元时,把它的深度值和已经存在在深度缓冲中的值进行比较(开启深度写入的前提下),如果它的值距离摄像机更远,说明这个片元不用渲染(有物体挡住了它),否则,这个片元应该覆盖掉颜色缓冲中的像素值,并把它的深度值写入深度缓冲中(开启深度写入的前提下)。

关于深度缓冲更详细的分析:

而要实现透明效果,第一种办法开启透明度测试(Alpha Test),但是这种无法得到真正的半透明混合;另一种是透明度混合(Alpha Blend)

后面再来详解这两种实现的区别。