在 OpenGL ES 2 2D 中剔除屏幕外对象

Culling off-screen objects in OpenGL ES 2 2D

我正在玩 OpenGL ES 2.0。如果我正在使用一个简单的 2D 投影,如果我有一个大的 2D 顶点网格,这些网格几乎是静态的(想想地图图块),其中在任何时候都只有一小部分是可见的,这会更好吗? ..

或者两者的某种组合(比如重叠的预计算网格集)?在后一个选项变得不可行之前,网格必须有多大?

编辑 我决定多次调用 glDrawElements(),绘制我知道会与视口重叠的索引缓冲区的子范围。在我工作的规模上,它似乎对绘制整个元素数组的速度没有任何影响,即使在 Pi Zero 上也是如此。

但是,如果涉及网格的任何旋转,这种方法将需要更多计算来确定需要渲染的元素范围 - 有效地栅格化我自己的四边形。我很想知道这是否是一种合理的方法。

我想还有一些其他的选择,比如将位面分解成子区域的更奇特的结构。不过,仍然不确定这些是否真的有必要。

谢谢!

请注意:我不想讨论在片段着色器中绘制图块,我更感兴趣的是使用顶点着色器的正确方法,而不是实际解决问题所描述的问题。

如果这是一个规则的网格,我会把它分成大块,这样屏幕宽度(较大的一侧)将适合 2-3 个这样的块。如果是常规网格,它们不需要重叠。

检查一个块的可见性是微不足道且成本低廉的,finding/selecting 那些必须绘制的部分也是如此。而且 wasted/clipped 区域小到不用担心。您不必发疯 trim 屏幕外的每个顶点。

每个块都有自己的 VBO,当它完全超出屏幕时,它会被弱缓存,所以如果你快速 [=21],你就不需要 rebuild/reload 绘制该块所需的资源=]到地图的这一部分。

分成块可以最大限度地减少内存需求并加快关卡加载速度。您花时间只加载用户将立即看到的屏幕部分。这也允许相当大的地图,因为你可以预取你要去的区域。