OpenGL - 无法完全绘制被遮挡的多边形?

4
假设我们有一组多边形,可以改变相机视角并在3D环境中平移相机。从某些视角看,其中一些多边形会被其他多边形完全遮挡。对于每个绘制的帧,我们知道这些多边形的确切坐标,并且可以按照“到相机距离递增”或“到相机距离递减”的顺序进行迭代。
现在我的问题是:
有没有有效的方法来预渲染确定一个多边形是否被其他多边形完全遮挡,以便我们可以在绘制过程中简单跳过它以提高性能?

欢迎来到SO,希望你已经阅读了FAQ - Christian Rau
2个回答

5
你所需要的技术被称为遮挡剔除,是一项相当复杂的任务。
能够按照摄像机距离递增的顺序(从前往后)迭代它们会给您带来一些优势。只需以这种方式渲染它们即可受益于现今图形硬件的早期z测试功能,多边形只需经过顶点处理和光栅化,而不需要进行片元着色。这也可以通过在所谓的深度预通道中呈现多边形(以任意顺序)而无需对多边形进行排序来实现,在此期间禁用颜色写入并仅呈现多边形的深度值。现在,在下一个渲染传递(真正的传递)中,您也可以受益于早期z拒绝。
您还可以使用现今GPU的硬件遮挡查询,如本GPU Gems文章中所解释的那样。

但正如Hannesh所说,如果遮挡剔除的开销值得,它总是应该加权的。我假设在你的情况下从前往后排序不是无意义的。也许深度预通可以作为一个可行的替代方案,不需要排序。虽然你可以像链接中描述的那样使用遮挡查询,但在这种情况下,它的效果不如从前往后排序。


4
你所想的是称为遮挡剔除的技术。现代图形卡有一些函数可以告诉你这个信息,但你必须先渲染好被遮挡的场景。另一种方法是在CPU上完成这个过程。
然而,无论如何我都不建议你尝试做这个。图形卡擅长以大块静态数据进行渲染。如果你修改这些数据以去除隐藏的表面,无论你的遮挡算法有多快,性能都会受到影响。而且,图形卡很聪明,如果它们意识到一个多边形完全被覆盖,就会提前将其抛弃。
如果你还没有这样做,将你的多边形放入一个静态顶点缓冲区中。顶点缓冲区是快速渲染大量多边形的好方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接