工具介绍
使用 Unity3D、计算着色器和 Graphics.DrawMeshInstancedIndirect 绘制大量实例的示例,其中包含 Frustum & Occlusion 回收和 LOD。
使用计算着色器进行间接渲染
- 在 Metal (Mac) 和 D3D11 上进行测试。 - 使用随机序列放置实例。 - 使用 Graphics.DrawMeshInstancedIndirect 绘制物体。 - 使用 Bitonic 排序进行 GPU 排序。 - 计算着色器: 视锥和阴影投射剔除。 - 计算着色器: 使用分层 Z 缓冲进行遮挡剔除。 - 计算着色器: 细节(屏幕大小)剔除。 - 计算着色器: 使用相对于摄像机的距离来计算 LOD 对象。 - 简单阴影模式: 仅为每种实例类型使用一个阴影网格,以减少 setpass 调用。
项目设置
- "Example" 游戏对象上的 "_Example.cs" 脚本:
- 创建实例数据并将其发送到间接渲染器类中。
- "MainCamera" 游戏对象上的 "IndirectRenderer.cs":
- 这是项目中的主要类。它初始化所有缓冲区和计算着色器,然后在 Unity 调用 PreCull() 函数时调度计算着色器并绘制对象。
TODO
- 添加最后一帧深度的重投影到 Hi-Z(参见下面的“GPU 驱动渲染管线”)
- 改进实例排序:
- 在我的 Macbook pro(2014 年中期)中,排序大约占用 GPU 时间的 50%
- GPU 排序必须支持不在二次方数组中的实例数
- 为 CPU 排序找到性能更好的方法
- 使用计算着色器创建 Hi-Z 纹理
- 尝试使用光栅遮挡而不是 Hi-Z(参见下面的“NVidia Siggraph 2014”和“GitHub - nvpro-samples”)
The Unreasonable Effectiveness of Quasirandom Sequences
Kostas Anagnostou - GPU Driven Rendering Experiments