Opengl es 剔除不带几何体着色器的实例化网格

Opengl es 剔除不带几何体着色器的实例化网格,opengl-es,glsl,vertex-shader,frustum,culling,Opengl Es,Glsl,Vertex Shader,Frustum,Culling,剔除实例网格的有效方法是什么 (f.e.2000棵树,每棵树约有17个三角形)而不使用几何体着色器? 不幸的是,我的软件只支持OpenGL ES 3.0,因此必须在顶点着色器或其他地方进行消隐。 另一个解决方案是在每个帧中重新安排实例缓冲区。如果不能有效地进行GPU剔除,那么它是没有意义的;毕竟,这就是在GPU上进行筛选的全部意义 高效的GPU剔除需要以下几点: 从着色器有条件地将数据写入GPU内存的一种方法,格式可控 一种基于完全存储在GPU内存中的数据执行渲染命令的方法,无需CPU/GPU同

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

如果不能有效地进行GPU剔除,那么它是没有意义的;毕竟,这就是在GPU上进行筛选的全部意义

高效的GPU剔除需要以下几点:

  • 从着色器有条件地将数据写入GPU内存的一种方法,格式可控
  • 一种基于完全存储在GPU内存中的数据执行渲染命令的方法,无需CPU/GPU同步
  • OpenGLES3.0缺少执行这两种操作的机制。几何体着色器和变换反馈是执行#1的较旧方法,但也可以使用计算着色器和SSBO/图像加载/存储来执行。当然,ES 3.0既没有功能集,也没有功能集;你需要ES3.1才能做到这一点

    ES 3.0也没有间接渲染功能,可用于使用GPU生成的数据进行实际渲染,而无需从CPU读回任何数据。因此,即使您有办法执行#1,您也必须在CPU上读取数据,以便能够在渲染命令中使用它


    因此,除非CPU消隐比执行完整的GPU/CPU同步更昂贵(几乎肯定不是),否则最好只在CPU上执行消隐。

    由于网格非常小,您不需要消隐来达到超精确,因此为了降低测试2000个边界卷的CPU成本,您可能希望将它们粗略地存储到空间卷中,并根据平截头体测试每个箱子的容积。如果整个垃圾箱都没有射出,则无需测试其中的单个树木。