Unity GPU Instancing
GPU Instancing開啟條件
首先Shader必須兼容與Instancing。
材質(zhì)開啟?
Enable GPU Instancing
SRP Batcher的優(yōu)先級高于GPU Instancing,對于Game Objects,如果SRP Batcher能被使用(Shader兼容SRP Batcher,節(jié)點(diǎn)本身也兼容等),則就會使用SRP Batcher,即便材質(zhì)開啟了Enable GPU Instancing也沒用
如果SPR Batcher的條件被破壞,例如使用了MaterialPropertyBlock,且開啟了Enable GPU Instancing,則GPU Instancing則會啟用
GPU Instancing的性能
GPU Instancing對于頂點(diǎn)數(shù)比較少的模型不一定能提高性能,因?yàn)轫旤c(diǎn)數(shù)少時(shí)GPU不能充分的分配資源去繪制多個(gè)實(shí)例,這個(gè)頂點(diǎn)數(shù)的閾值根據(jù)不同顯卡是不一樣的,但一般來說少于256個(gè)頂點(diǎn)是不合適的。
如果有很多頂點(diǎn)少的物體需要繪制,可以將他們合并到一個(gè)mesh中進(jìn)行繪制
自定義Shader兼容GPU Instancing

首先,定義PerMaterial Uniform block時(shí),要使用INSTANCING相關(guān)的宏UNITY_INSTANCING_BUFFER_START,UNITY_INSTANCING_BUFFER_END和UNITY_DEFINE_INSTANCED_PROP。這些宏的作用是將Uniform block定義成數(shù)組。需要注意的是,只有當(dāng)同一個(gè)材質(zhì)下面的不同Instance存在逐Instance不同的屬性時(shí),才需要將UnityPerMaterial的CBuffer改成使用這些宏,否則是不需要的,因?yàn)檫@些宏只是為了將屬性定義成數(shù)組,然后可以使用Instance索引去得到數(shù)組里面不同Instance各自的屬性。另外,由于CBuffer的名字不能沖突,所以也不能僅僅將不同的屬性單獨(dú)拿出來使用這些宏包裹,如果需要拿出來就得全部拿出來,也就是將SRPBatcher使用的CBuffer的宏替換成這些宏
VS和FS的輸入都要使用結(jié)構(gòu)體作為參數(shù),且結(jié)構(gòu)體中需要使用宏UNITY_VERTEX_INPUT_INSTANCE_ID定義逐物體的instance id
在VS和FS中,都要使用宏UNITY_SETUP_INSTANCE_ID來設(shè)置instance id變量,這個(gè)宏的作用是使用一個(gè)base instance id和input中的instance id組合出一個(gè)instance id變量來作為數(shù)組索引獲取相應(yīng)的屬性值
如果需要在FS中獲取屬性,則VS中需要使用宏UNITY_TRANSFER_INSTANCE_ID從input向output傳遞instance id。然后在FS中使用宏UNITY_ACCESS_INSTANCED_PROP獲取屬性。當(dāng)然如果是在VS中獲取所有屬性進(jìn)行計(jì)算,則不需要傳遞,直接在VS中使用宏UNITY_ACCESS_INSTANCED_PROP獲取屬性
另外,必須要添加#pragma multi_compile_instancing
