HISM解析与优化

HISM生成

HISM原理

HISM全名为Hierarchical Instanced Static Mesh,通过按LOD组织为树形结构,每个节点为一个Cluster,每个Cluster由一或多个Mesh组成

Cluster LOD

每个Cluster的包围盒都为其下所有StaticMesh的包围盒之和,判断可见性时逐级判断即可加速搜索。类结构如下:

HISM_Structure

  • FStaticMeshInstanceData:存储CPU端实例化数据
  • FStaticMeshInstanceBuffer: 使用CPU实例化数据构建InstanceBuffer与SRV

渲染流程分为顶点流与ManualVerexFetch两种:

  • 顶点流:通过绑定InstanceBuffer的方式,在Shader端直接取到当前Instance数据
  • ManualVertexFetch: 通过绑定SRV的方式,使用InstanceId存取数据

HISM与ISM使用相同的VertexFactory,该VertexFactory负责绑定顶点流与SRV以及实例化参数

弊端:

基于Cluster作为Drawcall单元,当Cluster内部部分物体被遮挡时,Instance的连续性将被打断而必须拆分Drawcall

HISM构建

Landscape Grass

HISM重布局

为了解决Cluster中部分StaticMesh被遮挡而导致Instance数据在InstanceBuffer不连续,而被迫使用多个Drawcall的情况。我们有以下两种方式:

  • 重排InstanceBuffer
  • 增加一个索引Buffer,使用该Buffer重映射InstanceId

因此我们将类图修改为如下形式:

优缺点

  • 优点:减少Drawcall且通常都会命中缓存
  • 缺点:额外的内存占用,创建Uniformbuffer会给RHI线程带来不小开销

Ref

UHierarchicalInstancedStaticMesh(HISM)原理分析

Color and Radiometry debug-example

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×