众所周知,片段着色器中的写入深度通常会禁用现代GPU所依赖的“早期Z”测试/写入优化,以实现牢固性。尽管如此,当着色器写入任意深度时,API仍然允许它,并且GPU仍提供对正确可见性的支持。

问题是:当今的游戏引擎中是否存在任何需要编写的最先进的实时效果?片段着色器中的Z?

#1 楼

在片段着色器中涉及光线跟踪的任何技术都可能希望编写Z,以便深度缓冲区包含光线跟踪表面的准确表示。例如:远场射线行进,在许多影棚和模拟场景产品中都可以看到。在这里,只有一个全屏的四边形被栅格化,并且所有的几何图形都是由片段着色器生成的。如果要将深度缓冲区用于延迟照明或后期效果,或将具有普通三角形几何形状的合成距离场使用并获得正确的遮挡,则必须编写Z。
体素射线行进类似于上面。即使体素是半透明的(如烟云等),在体素密度足够高以致变得不透明时写Z也可能有用。例如,这对于以后的运动模糊/景深计算很有用。

视差遮挡贴图技术,其中,通过对高度场进行射线行进,使平坦表面具有深度外观。

可能还有其他类似的情况,其中表面的形状是由片段着色器而不是由栅格化的三角形定义的。

顺便说一下,更新的API和GPU包括对保守深度输出模式的支持,在该模式下,仅将着色器写入的Z等于几何Z,但不能小于Z。这使得早期Z /分层Z优化仍然可以基于几何Z起作用:如果栅格化的几何因在某物后面而被剔除,那么您知道着色器编写的Z也将被剔除。这可以很好地适应上述情况,因为您可以为距离场/体素/高度场对象栅格化一些边界几何体;那么实际深度将等于边界几何的深度。