【问题标题】:Culling off-screen objects in OpenGL ES 2 2D在 OpenGL ES 2 2D 中剔除屏幕外对象
【发布时间】:2019-10-29 15:23:05
【问题描述】:

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

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

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

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

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

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

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

谢谢!

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

【问题讨论】:

  • 这种剔除绝对应该在 CPU 上完成。绘制通常只有一小部分可见的大型整体模型可能会影响性能。

标签: opengl-es-2.0 vertex-shader clip vertex-buffer-objects


【解决方案1】:

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

检查一个块的可见性既简单又便宜,以及查找/选择必须绘制的少数块。浪费/剪裁的区域足够小,不必担心。您不必疯狂地修剪屏幕外的每个顶点。

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

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

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多