假设我们有一组多边形,可以更改摄像机视角,并可以在3D环境中平移摄像机。从某些视角,这些多边形中的一些被一个或多个其他多边形完全遮挡。对于每个绘制的帧,我们知道每个多边形的精确坐标,并可以在“增加到相机的距离”或“减少到相机的距离”顺序中迭代它们。
现在我的问题:
预渲染的有效方法是确定多边形是否被其他人完全遮挡,以便我们可以在绘图过程中跳过它以提高性能?
答案 0 :(得分:5)
您正在寻找的技术称为Occlusion Culling,这是一项相当复杂的任务。
能够以增加相机距离顺序(从前到后)迭代它们会给你带来一些好处。只需以这种方式渲染它们就可以从nowaday图形硬件的早期z测试功能中获益,而多边形只需要经过顶点处理和光栅化,但不需要进行片段着色。这也可以在不对多边形进行排序的情况下实现,而是在所谓的深度预处理中以任意顺序渲染它们,在此处禁用颜色写入并仅渲染多边形的深度值。现在在下一个渲染过程中(真实的那个),你也可以从早期的z-rejection中获益。
您也可以使用nowaday的GPU的硬件遮挡查询,如this GPU Gems article中所述。
但是像Hannesh所说,如果遮挡剔除的开销值得,它应该总是加权。我认为你的案例中的前后排序并不是偶然的。也许深度预通过是一种可行的替代方案,无需排序。虽然您可以以不需要任何排序的方式使用遮挡查询(如链接中所述),但在这种情况下,它不如前后排序那样有效。
答案 1 :(得分:4)
您正在考虑的是Occlusion culling。现代显卡具有您可以调用的功能,可以准确地告诉您。你必须首先渲染遮挡场景。另一种方法是在CPU上执行此操作。
然而,我不建议你做任何你想做的事情。显卡可以快速渲染大块的静态数据。如果要修改数据以删除隐藏曲面,无论遮挡算法有多快,都会破坏性能。而且图形卡很聪明,如果他们意识到多边形被完全覆盖,他们会尽早将它扔出管道。
如果您还没有这样做,请将多边形放入静态vertex buffer。顶点缓冲区是快速渲染大量多边形的好方法。