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

时间:2019-07-16 15:07:45

标签: opengl-es glsl vertex-shader frustum culling

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

1 个答案:

答案 0 :(得分:1)

如果无法高效地执行GPU剔除,则毫无意义;毕竟,首先要在GPU上进行剔除。

高效的GPU选择需要以下条件:

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

OpenGL ES 3.0缺乏执行这两种功能的机制。几何着色器和变换反馈是执行#1的较早方法,但也可以使用计算着色器和SSBO /图像加载/存储来完成。当然,ES 3.0既没有功能集,也没有功能集。为此,您需要ES 3.1。

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

因此,除非CPU淘汰比完全GPU / CPU同步要昂贵(几乎肯定没有),否则最好只在CPU上进行淘汰。