2011-10-02 37 views
4

假设我们有一组多边形,可以改变摄像机视角,并且可以在3D环境中转换摄像机。从某些视角来看,这些多边形中的一些完全由其他多边形中的一个或多个遮挡。对于每个绘制的框架,我们都知道每个多边形的确切坐标,并且可以在“增加相机距离”或“减少相机距离”顺序中遍历它们。OpenGL - 未画出完全遮挡的多边形?

现在我的问题:

什么是预渲染判断是否多边形被别人完全闭塞,这样我们就可以直接跳过它在拉伸过程中,以提高性能的一个有效方法是什么?

+0

欢迎来到SO,我希望您已阅读[FAQ](http://stackoverflow.com/faq) –

回答

5

你正在寻找的技术被称为Occlusion Culling,是一个相当复杂的任务。

能够通过增加相机距离顺序(从前到后)遍历它们,这为您提供了一些优势。只需以这种方式渲染它们,您就可以从nowaday的图形硬件的早期z测试功能中获益,并且多边形只需经过顶点处理和光栅化处理,但无需进行片段着色。这也可以在不对多边形进行排序的情况下实现,但是可以在所谓的深度准备中(以任意顺序)渲染它们,其中您禁用颜色写入并仅渲染多边形的深度值。现在在下一个渲染阶段(真正的渲染阶段),您还可以从早期的Z-拒绝中获益。

您也可以使用nowaday GPU的硬件遮挡查询,如this GPU Gems article中所述。

但是就像Hannesh所说的那样,如果遮挡剔除的开销是值得的,它应该总是加权的。我认为在你的案例中,从前到后的排序并不是无处不在。也许深度预测是一个可行的选择,不需要排序。而您可以以不需要任何排序的方式使用遮挡查询(如链接中所述),在这种情况下,它不如前后排序那样有效。

4

你在想什么叫做Occlusion culling。现代显卡具有可以调用的功能,可以完全告诉您这一点。尽管你必须首先渲染遮挡场景。另一种方法是在CPU上执行此操作。

但是,我不会建议你在任何情况下都要做什么。图形卡在以大块渲染静态数据时很快。如果您正在修改该数据以移除隐藏表面,则无论您的遮挡算法速度多快,都会导致性能下降。而图形卡是一个聪明的,如果他们意识到一个多边形完全覆盖,他们会尽早把它扔出管道。

如果您尚未这样做,请将您的多边形放入一个静态的vertex buffer。顶点缓冲区是快速渲染大量多边形的好方法。