我有几千个四边形要绘制,其中一些可能完全落在视口之外。我可以编写代码来检测哪些四边形完全落在视口之外,并要求 OpenGL 只绘制至少部分可见的四边形。或者,我可以简单地让 OpenGL 绘制所有四边形,无论它们是否与视口相交。
我没有足够的 OpenGL 经验来知道其中一个是否明显更好(或者 OpenGL 是否提供了一些我可以使用的快速视口交叉测试)。视口之外的绘制是否接近于无操作,或者它们是否足够昂贵以至于我应该尽量避免它们?
我有几千个四边形要绘制,其中一些可能完全落在视口之外。我可以编写代码来检测哪些四边形完全落在视口之外,并要求 OpenGL 只绘制至少部分可见的四边形。或者,我可以简单地让 OpenGL 绘制所有四边形,无论它们是否与视口相交。
我没有足够的 OpenGL 经验来知道其中一个是否明显更好(或者 OpenGL 是否提供了一些我可以使用的快速视口交叉测试)。视口之外的绘制是否接近于无操作,或者它们是否足够昂贵以至于我应该尽量避免它们?
这取决于你的情况。
绘制最好分批进行,最好是结构上是静态的批次(即:每个批次都是完整绘制的)。所以你不应该在四级水平上剔除。但是对大组的四边形进行一些剔除并不是不受欢迎的。
您将失去的主要性能是顶点变换(又名:您的顶点着色器)。顶点着色器必须在您提供的每个顶点上运行,不管其他什么。但是,硬件会丢弃视口之外的三角形,因此您不会吸收任何填充率或其他性能。
但是,这并不意味着您的顶点 T&L 便宜就可以。渲染不可见的大块三角形可能会使光栅化器停滞不前,因为所有三角形都被剔除。也就是说,如果您绘制了很多因离开屏幕而被剔除的东西,那么您可能在实际可见的三角形上使用的填充率可能会丢失。
因此,不顾一切地向 GPU 投掷几何图形并不是一个好主意。
在任何情况下,如果您正在执行 2D 渲染,那么对离散的四边形组进行粗略剔除确实是您所需要的。您可以将瓷砖地图分成屏幕大小的部分,并根据相机的位置最多绘制 4 个。