GPU实例化的详细步骤

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<MeshRenderer>().SetPropertyBlock(prop);

版权声明:本文为men_tou原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。