# GPU实例化

# 功能介绍

小游戏框架绘制场景的过程中,每有一个MeshRenderer,便会为其中每一个 SubMesh 生成一次DrawCall。在场景中物体过多的情况下,渲染开销会变得很大。

如果场景中有许多材质相同并且模型相同的小物体,可以考虑开启GPU实例化来加速渲染。

# 使用限制

想要让开启了GPU实例化的物体能真正地被放入同一个 DrawCall 里,需要确保:

  1. GPU实例化的物体使用的材质是相同的;
  2. GPU实例化的物体使用的模型是相同的;

# 使用方法

# 一、打开实例化开关

在想要 GPU 实例化的物体使用的材质上,勾选useInstance

*注意:如果 MeshRenderer 上勾选了dynamicBatch,会造成材质上的useInstance无效。

# 二、控制物体的渲染顺序

需要手动确保GPU实例化的物体,是在一个批次渲染的,批次内不能有其他物体插入。

场景内物体的渲染顺序是靠材质上的renderQueue来控制的,相同renderQueue的物体会放在一个批次绘制。所以想让 GPU 实例化的物体在一个批次渲染,需要手动修改他们的材质(应该都是同一个),把renderQueue设置为不同于场景中任何其他物体的值。

# 三、确保着色器支持 GPU 实例化

小游戏框架内置的*效果(Effect)*都默认不支持 GPU 实例化,想要开启 GPU 实例化,需要自己编写着色器。

点击这里学习如何编写自定义着色器:

// 开启 Instancing 的时候,可以在顶点着色器里通过以下内建函数进行transform
float3 ObjectToWorldDirInstancing(in FEffect3DVertexInput In, float3 dir);
float3 ObjectToWorldNormalInstancing(in FEffect3DVertexInput In, float3 normal);
float4 ObjectToWorldPositionInstancing(in FEffect3DVertexInput In, float4 point1);