Frame Buffer 是用来存储帧位图的数据存储区域。这里在介绍另外一个缓存,叫深度缓存 (Depth Buffer), 也叫作 Z-Buffer。从名字上来看这是一个存储深度(数据)的存储区。
下面我们带着两个问题来解释这个深度缓存。
- 存储的深度数据是什么
- 有什么用处
深度是什么
要描述一个物体的位置,需要借助参照物。我们这里扩展一下, 要用数值来表述一个物体的某种属性,要有这个数值参照的原点。既然深度值是数值,那它的参照原点是什么呢? 答案是观察者的视角,换句话说就是 Camera。
Vertex Shader 之后有一个插值过程,生成像素。这个像素的 X 和 Y 坐标为屏幕坐标, Z 坐标轴数值就是深度,存储在深度缓存里面。
有什么用处
首先让我们来思考一个问题
假设有两个物体都经过渲染后的像素在屏幕坐标系中是同一个点,那哪个像素应该渲染?
我想现在你应该会想到,当然是渲染里观察者更近的一个像素啦。这个一般来说是对的,但是也不全对。 因为远近是用深度数值来表示,但是渲染的逻辑在 Shaderlab 里面可以用 ZTest 设置,它的语法是
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
ZTest 默认的值是 LEqual, 也就是渲染在物体在这个深度值同位置或者之前的物体,不渲染之后的物体。
你也许会想,那如果连个像素的深度值一样怎么办? 深度值一样的情况也叫做 深度冲突 (Z-fighting)。解决方法是给其中某一个物体设置偏移量。 Shaderlab 中语法是:
Offset Factor, Units
Offset 根据一个插值公式来计算出新的深度值。有兴趣的可以 参考这里
我们也可以打开和关闭深度写入功能,在 Shaderlab 中用 ZWrite 来控制,它的语法是:
ZWrite On | Off
在 Unity 图像渲染中顺序中的位置
图片来自 Unity 官方手册 http://docs.unity3d.com/Manual/SL-CullAndDepth.html
本文转自:博客园 - Rocky Lai 的技术博客,转载此文目的在于传递更多信息,版权归原作者所有。