我有几千个四边形要绘制,其中一些可能完全落在视口(viewport)之外。我可以编写代码来检测哪些四边形完全落在视口(viewport)之外,并要求 OpenGL 只绘制那些至少部分可见的四边形。或者,我可以简单地让 OpenGL 绘制所有四边形,而不管它们是否与视口(viewport)相交。

我没有足够的 OpenGL 经验来知道其中一个是否明显更好(或者 OpenGL 是否提供了一些我可以使用的快速视口(viewport)交叉测试)。视口(viewport)外的绘制是否接近于无操作,或者它们是否足够昂贵以至于我应该尽量避免它们?

最佳答案

这取决于你的情况。

绘制最好分批进行,最好是结构静态的批次(即:每个批次都是整体绘制的)。所以你不应该在四层级进行剔除。但是对大量四边形进行一些剔除并不是不受欢迎的。

您将失去的主要性能是顶点变换(又名:您的顶点着色器)。顶点着色器必须在您提供的每个顶点上运行,而不管其他任何东西。但是,硬件会丢弃在视口(viewport)之外的三角形,因此您不会吸收任何填充率或其他性能。

但是,这并不意味着您的顶点 T&L 便宜就可以。渲染不可见的大块三角形很可能会拖延光栅化器,因为所有三角形都被剔除。也就是说,如果你绘制了很多被屏幕外剔除的东西,你可能在实际可见三角形上使用的填充率可能会丢失。

因此,随意地将几何图形扔向 GPU 并不是一个好主意。

在任何情况下,如果您在进行 2D 渲染,那么粗略剔除离散的四边形组确实是您所需要的。您可以将瓷砖 map 划分为屏幕大小的部分,并根据相机的位置最多绘制其中的 4 个部分。

关于performance - 在 OpenGL 视口(viewport)外绘图是否昂贵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13223416/

10-10 18:28
查看更多