4

假设我们有一组多边形,可以改变相机的视角并且可以在 3D 环境中平移相机。从某些视角看,这些多边形中的一些被其他多边形中的一个或几个完全遮挡。对于每个绘制的帧,我们知道每个多边形的确切坐标,并且可以以“增加与相机的距离”或“减少与相机的距离”的顺序遍历它们。

现在我的问题:

什么是预渲染确定多边形是否被其他多边形完全遮挡的有效方法,以便我们可以在绘图过程中简单地跳过它以提高性能?

4

2 回答 2

5

您正在寻找的技术称为遮挡剔除,是一项相当复杂的任务。

能够以增加相机距离的顺序(从前到后)迭代它们会给您带来一些优势。仅以这种方式渲染它们就可以让您受益于当今图形硬件的早期 z 测试功能,并且多边形只需经过顶点处理和光栅化,而无需进行片段着色。这也可以在不对多边形进行排序的情况下实现,而是在所谓的深度预通道中渲染它们(以任意顺序),您可以禁用颜色写入并仅渲染多边形的深度值。现在在下一个渲染通道(真正的)中,您还可以从早期的 z 拒绝中受益。

您还可以使用当今 GPU 的硬件遮挡查询,如GPU Gems 文章中所述

但就像 Hannesh 所说,如果遮挡剔除的开销值得,则应该始终对其进行加权。我认为在您的情况下,从前到后的排序不会凭空出现。也许深度预通是一种不需要排序的可行替代方案。虽然您可以以不需要任何排序的方式使用遮挡查询(如链接中所述),但在这种情况下,它不如从前到后的排序有效。

于 2011-10-02T11:35:12.900 回答
4

您正在考虑的称为Occlusion culling。现代显卡具有您可以调用的功能,可以准确地告诉您这一点。不过,您必须先渲染遮挡场景。另一种方法是在 CPU 上执行此操作。

但是,无论如何,我都不建议您做您想做的事情。显卡可以快速渲染大块的静态数据。如果您正在修改该数据以删除隐藏的表面,那么无论您的遮挡算法有多快,您都会降低性能。显卡很聪明,如果他们意识到一个多边形被完全覆盖,他们会提前把它扔出管道。

如果您还没有这样做,请将多边形放入静态顶点缓冲区。顶点缓冲区是快速渲染大量多边形的好方法。

于 2011-10-02T11:30:33.937 回答