其實本篇是大地形繪製中一個特殊的案例,之所以說其是特殊的,是因爲我們的草,使用的是GPUInstance方式進行繪製。
也就是說同一種類型的草,使用DrawMesh的時候,會傳遞繪製的個數。
具體使用的函數如下:
GrassInstanceInfo info = item.Value;
Graphics.DrawMeshInstancedIndirect(
info.mesh,
0,
info.mat,
info.mesh.bounds,
info.argBuffer, //繪製的參數
info.argOffset, //繪製的submesh和個數
info.mpb,
ShadowCastingMode.Off,
false,
0,
null,
LightProbeUsage.BlendProbes,
null);
這樣做的好處是,同一種類型的草,只會有一個drawcall。
ok,那麼下面的一個思想是,如何將大地形上的草,進行劃分。
對於每個草,對其處理的步驟:
1、判斷其所在的blockID
2、每塊地形,將草歸類,key是mesh和材質相同,這樣如上圖左下角的塊中有兩種類型的草,所以如下:
(黑色圈)=》grass_mesh_1 =>2個=》這兩個合併,都是一起繪製出來的,所以aabb包圍盒當做一個
(藍色圈)=》grass_mesh_2 =>2個=》這兩個合併,都是一起繪製出來的,所以aabb包圍盒當做一個
3、將沒類的草,插入到塊的節點上,以備剔除操作
4、如果在視錐體內,則進行繪製,繪製函數如下:DrawMesh(grass_mesh_x, count個)