微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何优化动态几何的渲染?

如何解决如何优化动态几何的渲染?

据我所知,批处理和实例化用于减少静态网格的绘制调用量。但是动态网格呢?我该如何优化它们的绘制调用量?实例化和批处理 造成很大的开销,因为你需要每帧用 cpu 重新计算位置。或者最好用单独的绘制调用绘制动态网格?

解决方法

需要牢记一些性能注意事项:

  1. 每个 glDraw..() 都会带来一些开销,因此您希望尽量减少这些开销。这就是实例化如此具有性能优势的原因之一。 (更好的缓存行为是另一个。)
  2. 主机到设备的数据传输 (glBufferData()) 甚至比绘制调用还要慢。因此,我们尝试将数据(顶点缓冲区、索引缓冲区、纹理)保留在 GPU 上,而不是每帧都传输。

就您而言,有几种方法可以获得高性能的动态网格。

  • 假的。您真的需要动态网格吗——特别是必须生成新网格数据的网格?或者,您能否通过着色器中的变换实现相同的目的?

  • 在 GPU 上生成网格。这可以在计算着色器(以获得最佳性能)或几何和/或曲面细分着色器中完成。这有其自身的开销,但是,由于一切都发生在 GPU 上,因此您不会受到更昂贵的 glDraw...() 或主机 GPU 副本的影响。

  • 请注意,几何着色器相对较慢,但它们仍然比将新的顶点 + 索引缓冲区从 CPU 复制到 GPU 快。 *
  • 如果您的“动态”网格具有有限数量的状态,只需将它们全部保留在 GPU 上并根据需要在它们之间切换。

  • 如果这是另一个 API,例如 Vulkan,您可能会在单独的线程中生成网格并将其传输到 GPU,同时绘制其他内容。这是一个非常复杂的话题,与显式图形 API 相关的所有内容也是如此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。