【发布时间】:2019-07-16 15:07:45
【问题描述】:
什么是剔除实例化网格的有效方法
(例如 2000 棵树,每棵树大约有 17 个三角形)而不使用几何着色器?
不幸的是,我的软件仅支持 OpenGL ES 3.0,因此必须在顶点着色器或其他地方进行剔除。
另一种解决方案是在每一帧中重新排列实例缓冲区。
【问题讨论】:
标签: opengl-es glsl vertex-shader frustum culling
什么是剔除实例化网格的有效方法
(例如 2000 棵树,每棵树大约有 17 个三角形)而不使用几何着色器?
不幸的是,我的软件仅支持 OpenGL ES 3.0,因此必须在顶点着色器或其他地方进行剔除。
另一种解决方案是在每一帧中重新排列实例缓冲区。
【问题讨论】:
标签: opengl-es glsl vertex-shader frustum culling
如果不能有效地进行 GPU 剔除,则它是毫无意义的;毕竟,这就是将剔除放在 GPU 上的全部意义所在。
高效的 GPU 剔除需要以下条件:
OpenGL ES 3.0 缺少执行上述任何一项的机制。几何着色器和变换反馈是执行 #1 的较旧方法,但也可以通过计算着色器和 SSBO/图像加载/存储来完成。当然,ES 3.0 没有任何一套功能;你需要 ES 3.1。
ES 3.0 也没有间接渲染功能,可用于使用 GPU 生成的数据进行实际渲染,而无需从 CPU 读取任何数据。所以即使你有办法做到#1,你也必须在 CPU 上读回数据才能在渲染命令中使用它。
因此,除非 CPU 剔除比进行完整的 GPU/CPU 同步更昂贵(几乎可以肯定不是),否则最好只在 CPU 上进行剔除。
【讨论】: