performance - OpenGL - 不绘制完全遮挡的多边形?

标签 performance opengl polygon invisible

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

现在我的问题:

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

最佳答案

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

能够以增加的相机距离顺序(从前到后)迭代它们为您提供了一些优势。以这种方式渲染它们可以让您从当今图形硬件的早期 z-testing 功能中受益,多边形只需经过顶点处理和光栅化,而无需进行片段着色。这也可以在不排序多边形的情况下实现,而是在所谓的深度预传递中渲染它们(以任意顺序),在其中禁用颜色写入并仅渲染多边形的深度值。现在在下一个渲染 channel (真实的)中,您还可以从早期的 z-rejection 中获益。

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

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

关于performance - OpenGL - 不绘制完全遮挡的多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625926/

相关文章:

algorithm - 什么时候大 O 或 Omega 或 theta 可以成为集合的元素?

c++ - Mac OS X 的 OpenGL 红皮书

c++ - 将 VAO+IBO 与 GLSL 着色器结合使用

c++ - 如何在glVertexPointer/glColorPointer/glNormalPointer中使用自己的类

matlab - 用某种颜色填充多边形

algorithm - 按条件进行多边形平滑

google-maps-api-3 - 谷歌地图仅在多边形中搜索

c# - 为这个问题选择正确的数据结构 : circular linked list, 列表、数组或其他

performance - DirectX9 - 高效绘制 Sprite

performance - 我将性能计数器的值发送到 Graphite 的方法非常慢。瓶颈是什么?以及如何改进?