# GPU实例化
# 功能介绍
小游戏框架绘制场景的过程中,每有一个MeshRenderer,便会为其中每一个SubMesh生成一次DrawCall。在场景中物体过多的情况下,渲染开销会变得很大。
如果场景中有许多材质相同并且模型相同的小物体,可以考虑开启GPU实例化来加速渲染。
# 使用限制
想要让开启了GPU实例化的物体能真正地被放入同一个DrawCall里,需要确保:
- GPU实例化的物体使用的材质是相同的;
- 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);