【问题标题】:culling instanced meshes without geometry shader剔除没有几何着色器的实例化网格
【发布时间】:2019-07-16 15:07:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 上进行剔除。

    【讨论】:

    • 鉴于网格非常小,您不需要剔除就可以非常准确,因此为了降低测试 2000 个边界体的 CPU 成本,您可能希望将它们粗略地分箱成空间体,并测试每个分箱对视锥体的体积。如果整个箱子都没有拍摄,则无需测试其中的单个树木。
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多