GPU Instancing
用于对多个对象(网格一样,材质一样,但是材质属性不一样)合批,单个合批最大上限为511个对象。 硬件要支持:OpenGL3.0以上支持。 C#代码: GameObject tree = Instantiate(prefab, pos, transform)
shader 实现
#pragma multi_compile_instancing
添加此指令后会使材质面板上曝露Instaning开关,同时会生成相应的Instancing变体
UNITY_VERTEX_INPUT_INSTANCE_ID
在顶点着色器的输入(appdata)和输出(v2f,可选项)中添加,声明一个InstanceID
UNITY_INSTANCING_BUFFER_START(arrayName)
UNITY_INSTANCING_BUFFER_END(arrayName)
将每个你需要实例化的属性都封装在这个常量寄存器中
UNITY_DEFINE_INSTANCED_PROP(type, name)
在上面的START和END间把需要的每条属性加进来
UNITY_SETUP_INSTANCE_ID(v);
需放在顶点着色器/片断着色器(可选)中最开始的地方,这样才能访问到全局的unity_InstanceID
UNITY_TRANSFER_INSTANCE_ID(v, o);
当需要将实例化ID传到片断着色器时,在顶点着色器中添加
UNITY_ACCESS_INSTANCED_PROP(arrayName, propName)
在片断着色器中访问具体的实例化变量
在C#中使用材质属性块设置材质属性
MaterialPropertyBlock prop = new MaterialPropertyBlock();
prop.SetColor("_Color", newCol); // 这里修改的属性,一定要在shader中用instance声明好,不然会打断instance的批次.
tree.GetComponentInChildren().SetPropertyBlock(prop);
|