在没有几何着色器的情况下剔除实例化网格

culling instanced meshes without geometry shader

剔除实例化网格的有效方法是什么 (f.e。2000 棵树,每棵树大约有 17 个三角形)不使用几何着色器 ?
不幸的是,我的软件仅支持 OpenGL ES 3.0,因此必须剔除顶点着色器或其他地方。 另一种解决方案是在每一帧中重新排列实例缓冲区。

GPU 剔除如果不能有效地完成就毫无意义;毕竟,这就是将剔除放在 GPU 上的全部意义所在。

高效的 GPU 剔除需要满足以下条件:

  1. 一种有条件地将数据从着色器写入 GPU 内存的方法,并且格式可控。
  2. 一种根据完全存储在 GPU 内存中的数据执行渲染命令的方法,无需 CPU/GPU 同步。

OpenGL ES 3.0 缺少执行这些操作的机制。几何着色器和变换反馈是执行#1 的较旧方法,但也可以使用计算着色器和 SSBOs/image load/store 来完成。当然,ES 3.0 没有这两套功能;为此,您需要 ES 3.1。

ES 3.0 也没有间接渲染功能,可用于实际渲染 GPU-generated 数据,而不需要来自 CPU 的任何 read-back 数据。因此,即使您有办法执行 #1,您也必须在 CPU 上读回数据才能在渲染命令中使用它。

因此,除非 CPU 剔除比完全 GPU/CPU 同步更昂贵(几乎可以肯定不是),否则最好只对 CPU .