首页 > 解决方案 > 在 OpenGL ES 2 2D 中剔除屏幕外对象

问题描述

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

或者

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

编辑 我决定多次调用 glDrawElements(),绘制我知道会与视口重叠的索引缓冲区的子范围。在我正在处理的规模上,即使在 Pi 零上,绘制整个元素数组的速度似乎也没有任何区别。

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

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

谢谢!

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

标签: opengl-es-2.0vertex-shaderclipvertex-buffer-objects

解决方案


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

检查一个块的可见性是微不足道的和便宜的,以及找到/选择那些必须绘制的少数。浪费/剪裁的区域足够小,不必担心。您不必发疯并修剪屏幕外的每个顶点。

每个块都有自己的 VBO,并且当它完全超出屏幕时会被弱缓存,因此如果您快速返回到地图的这一部分,则不必重建/重新加载绘制该块所需的资源。

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


推荐阅读