为什么在光栅化之前没有对几何进行深度testing?

光栅化期间,也就是在片段级别,似乎只有深度被用来丢弃数据。

几何阶段,我只看到顶点的剔除和裁剪。 是不是可以使用顶点数据(深度?)来判断一个三角形是否在另一个三角形之后?如果是的话,是否丢弃? 以后在扫描转换中不会保存所有的工作吗?

在顶点级别进行深度testing效果不佳。

三角形是曲面。 三角形的所有三个顶点都可以被场景中的其他三角形遮挡,并且该三角形的中间部分仍然可见 。 确定三角形是否完全落后的唯一方法是沿三角形表面插入位置或深度,并确定在该插值的每一步中,三角形是否仍然被遮挡。

这正是每片段深度testing已经在做的事情。

因此,尽管你可以在每个顶点基础上做一些“巧妙的技巧”来试图在每个片段testing之前testing一个三角形是否完全被其他人所完全遮挡,但是除非你完全按照这个原则去做,否则它们将永远不会是完全准确的试图避免:沿着三角形的表面,作为光栅化分辨率,在那里testing三角形。

您可以确定三角形是否在另一个三角形的后面。 但是,如果你想要在三角形水平上进行扑杀,那么这不是你需要做的操作。 您将不得不确定三角形是否位于三角形的森林之后:您必须确定三角形是否位于场景中的任何一个三角形之后。

三角形剔除是昂贵的。 通过片段剔除片段要便宜得多。 最终,三角形的数量将开始累积起来,碎片消除将会便宜得多。

这也会比你想象的更早发生,因为我们不能只testing单个的三角形。 我们必须一起testing它们。 如果在四边形(两个三角形)后面有一个三角形,则可能是您的testing三角形没有被构成四边形的三角形单独遮挡。 这意味着您现在需要复杂的几何testing来查看三角形是否以这种方式覆盖。

最后,testing三角形将比仅进行片段testing要贵得多。

这可能是有趣的:

仅位置着色管线

Cull Pipe使用这些关键结果来计算所有三角形的可见性信息,而不管它们是否被剔除。 另一方面, 重放管消耗可见性信息以跳过被剔除的三角形,并且仅遮蔽最终传递到光栅化阶段的可见三角形

https://patents.justia.com/patent/20160086299

这似乎解决了你正在问的问题。