1

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

  • 在 CPU 中计算出哪些顶点是可见的,然后创建一个 VBO 来仅绘制构成每一帧中可见图块的三角形?

或者

  • 在整个平铺网格中保留一个静态 VBO,然后仅依靠显卡(在我的情况下为 RPi)来剪掉屏幕外的三角形?

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

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

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

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

谢谢!

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

4

1 回答 1

0

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

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

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

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

于 2019-11-17T20:18:04.860 回答