GPU instancing介绍

从Unity5.4开始,多了一个叫做GPU instancing的功能。这个功能是做什么用的呢?下面做一个小例子来说明一下:
还是之前做 MaterialPropertyBlock的例子,在屏幕上面做了很多的cube,然后随机给颜色,使用MaterialPropertyBlock的方式设置颜色值。
GPU instancing介绍_第1张图片
可以看到,正常情况下,在改变完颜色之后,Batches有75个,而SetPass calls有75个。

下面换成GPU instancing的做法,同样的效果,可以看看数据:
GPU instancing介绍_第2张图片
和之前完全一样的视觉效果,但Batches和SetPass calls都变成只有11了。

这是怎么做到的呢?
首先 ,我们必须是使用MaterialPropertyBlock来设置材质的属性,因为如果用传统的设置颜色,会把材质生成多个实例,这样就没有办法合并了。使用MaterialPropertyBlock由于从始至终只有一个material,所以它们才可以合并。
然后,需要特殊的shader来配合工作。在Unity5.4和5.5版本,都可以看到在创建shader的时候,多了一个选项Standard Surface Shader(Instanced)。这个shader类型就是支持GPU Instancing的。到了Unity5.6这个选项已经消失了,因为默认创建的Standard Surface Shader已经支持GPU Instancing了。
GPU instancing介绍_第3张图片
当然了,我们不可能每个地方都用 Standard Surface Shader这种消耗特别大的shader,所以我们也可以手动的修改自己写的shader,官方的文档里面也有说明:

pragma multi_compile_instancing Use this to instruct Unity to generate instancing variants. It is not necessary for surface Shaders.

UNITY_VERTEX_INPUT_INSTANCE_ID Use this in the vertex Shader input/output structure to define an instance ID. See SV_InstanceID for more information.
UNITY_INSTANCING_CBUFFER_START(name) /UNITY_INSTANCING_CBUFFER_END Every per-instance property must be defined in a specially named constant buffer. Use this pair of macros to wrap the properties you want to be made unique to each instance.
UNITY_DEFINE_INSTANCED_PROP(float4, _Color) Use this to define a per-instance Shader property with a type and a name. In this example, the _Color property is unique.
UNITY_SETUP_INSTANCE_ID(v); Use this to make the instance ID accessible to Shader functions. It must be used at the very beginning of a vertex Shader, and is optional for fragment Shaders.
UNITY_TRANSFER_INSTANCE_ID(v, o); Use this to copy the instance ID from the input structure to the output structure in the vertex Shader. This is only necessary if you need to access per-instance data in the fragment Shader.
UNITY_ACCESS_INSTANCED_PROP(color) Use this to access a per-instance Shader property. It uses an instance ID to index into the instance data array.
举例说,我们可以在shader里面添加:
UNITY_INSTANCING_CBUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color) // Make _Color an instanced property (i.e. an array)
UNITY_INSTANCING_CBUFFER_END
让它支持GPU Instancing。

在Unity5.4和5.5版本,只要你的Shader支持,自动就会开启GPU Instance。到了Unity5.6,在材质选项里面会多了一个勾选:
GPU instancing介绍_第4张图片
这是一个开关。假如你不勾选,就算你的shader是支持的,GPU Instance功能也不会生效。

你可能感兴趣的:(unity相关)