如何在 OpenGL 中集成间接绘制、实例化渲染和 GPU 遮挡剔除

问题描述

我正在开发一种使用绘制间接和实例化渲染来渲染场景几何体的渲染引擎。一些对象是从实例化的基本形状(例如立方体或球体)程序生成的,其他对象是实例化并在整个场景中使用的网格对象。现在,实例化的几何图形是使用对 glDrawElementsInstanced 的单独绘制调用绘制的(现在有效但总体上不太好),并且使用对 glMultiDrawElementsIndirect 的单个调用绘制单个对象(在统一的 VBO 中)。由于我在渲染管道中使用照明和纹理(无绑定),并且场景很复杂,总共有数十万个网格,因此我需要实现 GPU 遮挡和视锥体剔除。两者都需要:减轻片段着色器和顶点着色器的负载

对我来说,主要问题是找到一种合理的方法来对实例化几何体执行这些 GPU 剔除操作。当涉及仅渲染一次的对象(使用间接绘制)时,所有剔除内容都通过示例得到了很好的说明,但它们似乎都没有解决实例化网格的剔除问题。这样做似乎没有真正的障碍,而是如何以最佳方式解决这个问题。

我建议如下:

  1. 仅对实例化和非实例化几何体使用一次绘制间接调用。 (没有真正的理由将它们分开,因为 glMultidrawElementsIndirect 提供了实例化)
  2. 将网格的实例数据保存在两个单独的缓冲区 (SSBO) 中。一个拥有所有场景对象的所有实例数据,另一个 具有可见实例的实例数据。绘制间接命令是在计算着色器中编写的(在剔除之后),并根据某种可见性索引调整了实例计数和基本实例(我在这里是否正确)?

问题是:这种重复的实例数据(到 2 个单独的缓冲区中)是否合理,或者是否有更有效的方法来做到这一点?

.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)