【问题标题】:OpenGL - Not Draw Completely Occluded Polygons?OpenGL - 不绘制完全遮挡的多边形?
【发布时间】:2011-10-02 10:52:45
【问题描述】:

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

现在我的问题:

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

【问题讨论】:

  • 欢迎来到 SO,我希望你已经阅读了FAQ

标签: performance opengl polygon invisible


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2017-06-17
      • 2018-09-29
      • 2011-08-08
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      相关资源
      最近更新 更多