【Unity Shader】 深度测试

介绍

在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。

1. 深度

深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!
深度值(Z值)越大,则离摄像机越远。
【Unity Shader】 深度测试_第1张图片

2. 深度缓存

深度值是存贮在深度缓存里面的,我们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡一般都可支持16位的Z Buffer,一些高级的显卡已经可以支持32位的Z Buffer,但一般用24位Z Buffer就已经足够了。
【Unity Shader】 深度测试_第2张图片

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 不通过 × ×

【Unity Shader】 深度测试_第3张图片

3. Offset 用于深度相同时做微调
Offset Factor, Units

允许您通过两个参数factor 和 units指定深度偏移。
Factor 缩放Z在多边形中相对于 X 或 Y 的最大斜率,值越小越靠近相机。
units 缩放最小可分辨的深度缓冲值。
这允许你强制一个多边形被画在另一个多边形上,尽管它们实际上处于同一位置。

参考:

ShaderLab: Culling & Depth Testing
ShaderLab: Culling & Depth Testing(中文)
深度测试

你可能感兴趣的:(Unity,Shader初学,unity,shader)