目录
一、模版检测
1. 概念
① 比较 Comp
② 更新 Pass
2. 示例分析 - 3D卡牌
二、深度检测
1. 概念
① 比较:深度测试 Z-Test
② 更新:深度写入 Z-Write
2. 示例分析
一、模版检测
核心:当前模版缓冲区中的值 [stencilBufferValue] 和 准备渲染的物体的模版参考值(我们设的) [referenceValue] 的比较,默认情况下 只有通过比较才会渲染像素,否则抛弃。
1. 概念
① 比较 Comp
这个比较可以用 大于等于小于不等于这些方式,或者直接了当地不管三七二十一,设为 永远通过 或者 永远不通过。
② 更新 Pass
而模板测试结束时,可以分别选择在 通过或者没通过 的情况下,对当前缓冲区的值做不同的更新操作,比如默认情况就是,在通过时 替换 (replace) 缓冲区的值为物体的参考值。
2. 示例分析 - 3D卡牌
这样的3d卡牌的效果原因是,只有在这个卡面之内的区域后面的物体才能被看到,其余会被剔除。
而如果用模版测试来做的话,本质上有点类似于一个 “与”运算,在这里我画了一个下图,首先我给卡面所在的缓冲区区域给定永远都是1,然后再给小兔子的参考值也为1,此时我设定 只有物体参考值等于缓冲区的模版值时才能正常显示,那么就只有两者 相交同时为1 的区域会被显示了。
- 因此卡面的模版测试为:让该区域缓冲区永远为1(这里的_ID假设是1)
Stencil{Ref [_ID]Comp AlwaysPass replace
}
- 后面物体的模版测试为:我也设为1(_ID假设也是1),只有与缓冲区相同时我再通过测试
Stencil{Ref [_ID]Comp equal
}
这样就能实现3D卡牌的效果了,但是有几个细节需要注意:
① 渲染队列:设置卡面的渲染队列为 "Geometry+1",后面物体的渲染队列为 "Geometry+2",要先渲染卡面再渲染后面的物体,才能按我们想要的顺序进行模版比较。
② 深度写入:卡面要取消深度写入,因为他是挡在前面的,后面的物体需要透过它显示。


二、深度检测
1. 概念
① 比较:深度测试 Z-Test
深度检测是在模版测试之后进行的测试,这是一个处理物体互相遮挡关系的过程,默认情况下,只有深度值小等于缓冲区中深度值的像素才能被渲染。
这里需要区分两个概念:深度值 与 渲染队列
深度值越大表示越远,而渲染队列(直观层面上)是值越小表示越远。
② 更新:深度写入 Z-Write
在 Z-Test 之后,还要进行 Z-Write 。他们俩同时决定数据是否会被写入 深度缓冲区 以及 颜色缓冲区。
当深度测试都不通过的时候,不管深度写入是否开启,都不会写入两个缓冲区。
而深度测试通过时,如果Z-Write开启,则两个都写入;否则只写入颜色缓冲区。
2. 示例分析
简单分析一下,这个兔兔被前面遮挡的物体拆成了两个部分来渲染,一个是没遮挡部分 - 正常渲染(Normal),另一个是遮挡部分 - 做视觉处理(Xray),需要两个pass来实现。
正常部分 全按默认值设 或者 不设 就好: ZTest LEqual ZWrite on
Xray部分 则相反,当它在更深的时候渲染,并且不写入深度: ZTest Greater ZWrite off