介绍
在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。
1. 深度
深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!
深度值(Z值)越大,则离摄像机越远。
2. 深度缓存
深度值是存贮在深度缓存里面的,我们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡一般都可支持16位的Z Buffer,一些高级的显卡已经可以支持32位的Z Buffer,但一般用24位Z Buffer就已经足够了。
3. 深度测试
将要渲染的物体的Z值对比G-Buffer中的值
语法
1. ZWrite On/Off
是否将要渲染的物体的深度写入深度缓冲区
仅控制深度测试的开关,具体要不要将Z写入深度缓冲要看ZTest
2. ZTest
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
- Less:将要渲染的像素的深度要小于G-buffer里面的深度值才写
- Greater:将要渲染的像素的Z值大于G-buffer中的深度值才写
- Always: 总是写入
ZWrite | Ztest | 更新G-buffer的Z | 更新G-buffer的RGBA |
---|---|---|---|
On | 通过 | √ | √ |
On | 不通过 | × | × |
Off | 通过 | × | √ |
Off | 不通过 | × | × |
3. Offset 用于深度相同时做微调
Offset Factor, Units
允许您通过两个参数factor 和 units指定深度偏移。
Factor 缩放Z在多边形中相对于 X 或 Y 的最大斜率,值越小越靠近相机。
units 缩放最小可分辨的深度缓冲值。
这允许你强制一个多边形被画在另一个多边形上,尽管它们实际上处于同一位置。
参考:
ShaderLab: Culling & Depth Testing
ShaderLab: Culling & Depth Testing(中文)
深度测试