如图
1、只开启Early-z,Early-Z从前往后(先A再B)写入深度值,先写入A的深度值,然后B发现自己的深度更大,会抛弃这些(粉红色)片段。到后面执行片段着色器的时候,B中被A所遮盖的那片粉红色区域就不会执行片段着色器了。
2、只开启AlphaTest,执行片段着色器的时候,假设A不会通过AlphaTest,自然不会往深度缓冲中写入深度值,所以再渲染B的时候,B发现深度缓冲还没人来过,就更新深度缓冲,并把自己的颜色写入颜色缓冲。
3、但是,如果同时开启了Early-Z和AlphaTest:首先执行Early-Z,会把A的深度写入深度缓冲。在片段着色器中,如果A的AlphaTest没通过,会把片段A丢弃,理应不会写入深度值(但是实际上Early-Z的时候已经写入了),然后对B:因为Early-z的时候B深度测试没通过,把粉红色部分的片段剔除了,自然这部分不会执行片段着色器。本来A被剔除了,就应该显示B,但是现在A和B都没了。
4、所以如果开启了Alphatest,就会关闭Early-z,A如果Alphatest通过,就会在深度缓冲中写入深度值,B再来的时候,发现自己的深度值比深度缓冲中的大,就不会写入颜色值和深度值。