Unity的Mesh合并(0)

前言

unity引擎中渲染代價的指標(biāo)是場景中網(wǎng)格(Mesh)的數(shù)量,對顯卡來說渲染一個100面的物體和渲染一個1500面的物體幾乎是等價的,于是當(dāng)多個物體的材質(zhì)(Shader)相同時,可以把他們的網(wǎng)格合并起來,然后共用一個材料(Material)來降低渲染的成本,達成優(yōu)化游戲體驗的效果。

這里我們把對材料的共用模糊化了,其實這也是一個復(fù)雜的過程,后文中會詳細描述其原理和算法。



什么樣的物體可以合并?

場景中有那么多物體,在進行合并之前,我們需要先確定哪些物體是可以合并在一起的?

1.shader相同的物體才可以合并

物體屬性面板

觀察物體的屬性面板,我們發(fā)現(xiàn)物體可能有不同的材料,這些材料會有不同的shader。shader是也是使用編程語言編寫的由gpu處理的,不同的shader渲染出的效果是不一樣的。因為我們合并起來的物體的網(wǎng)格是一個合并的網(wǎng)格,使用的是合并的材料,每個材料只能有一個shader屬性,這也就限制了我們要合并的物體的材料的shader必須要相同。


合并的物體


合并物體的網(wǎng)格
合并物體的材料

2.要合并的物體需要處于一定范圍內(nèi)

多個物體合并了之后,成為一個物體,若這個物體的mesh分布在場景中的各個地方,無疑是對資源的一個浪費。極端地來說,若我們將一萬個物體合并成了一個,攝像機所看到了這一萬個之中的一個,其他九千九百九十九個雖然對玩家不可見,但因為是同一個物體,所以也渲染了出來,這樣的資源浪費是無必要的。

于是我們在合并之前會將場景劃分為多個正方體,每個正方體內(nèi)的物體才能互相合并在一起,以此避免合并出來物體的mesh分散的情況。

3.物體的光照貼圖需要相同(lightmapindex屬性相同)




一個很General的算法


變量的數(shù)據(jù)結(jié)構(gòu)及意義

在此處先將mesh合并整個過程的大體算法描述出來,細節(jié)部分在后篇展開解釋。

當(dāng)然在描述算法前,先說明算法中用到的變量的數(shù)據(jù)結(jié)構(gòu)及其意義:

List<MeshFilter> AllMeshFiltersInScene : 場景中所有meshfilter的鏈表

List<MeshRender>?AllMeshRenderersInScene?: 場景中所有meshrenderer的鏈表

List<GameObject> AllGameobjectsInScene?: 場景中所有Gameobject的鏈表

Dictionary<Shader, Dictionary<Texture2d, List<int>> ShaderToTextures? : 場景中所有的Shader到其貼圖的映射(在合并之前,所有貼圖都是貼在材料之上的,這些材料有自己的Shader,就視為這個貼圖的Shader。只有Shader相同的貼圖才能打包到一個圖集中,他們的mesh才能合并在一起)

List<List<Gameobjcet>> CubesOfGameobjects : 場景中的正方體數(shù)組,里面存著這個正方體里的物體

Dictionary<Gameobject, int> GameObjectToIndex : 建立物體到其索引的映射


算法

1.FindAllMeshesInScene : 找到場景中所有MeshFilter組件,存在AllMeshFiltersInScene,據(jù)其還可以獲得帶這個組件的物體存在AllGameobjectsInScene?以及這個物體的其他有用組件如MeshRenderer存在AllMeshRenderersInScene

2.PackAllTexturesInScene && DividingTextures: 將場景內(nèi)所有的貼圖打包成若干個圖集(圖集,即是貼圖的集合;如前所述,Mesh合并之后多個物體成為一個物體,這個物體使用的是一個合并的Mesh,合并的材料,這個合并的材料當(dāng)然就有一個合并的貼圖集合,即為圖集)

3.DoCombine : 遍歷場景內(nèi)的每個正方體,對其內(nèi)的物體進行合并條件判斷后,分組進行合并

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址 http://www.fx114.net/qa-75-172454.aspx 使用Profiler工具...
    IongX閱讀 6,254評論 1 11
  • 111. [動畫系統(tǒng)]如何將其他類型的動畫轉(zhuǎn)換成關(guān)鍵幀動畫? 動畫->點緩存->關(guān)鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 13,531評論 3 88
  • 有一次,我問老艾,你怎么描述咱們的夫妻相處模式?他沉思半晌來了一句擲地有聲的總結(jié):咱倆像是 a team。 我恍惚...
    弘曉隨喜閱讀 387評論 0 2
  • 今天讀村上的跑步,里面有句話,持之以恒,不亂節(jié)奏。學(xué)英語的一大障礙就是很難長期的保持相同的節(jié)奏。但那些不認識的詞,...
    魚翅后花園閱讀 255評論 0 0
  • 雨霽出晴日, 清風(fēng)云漾天。 閑看古人賦, 黃葉落書前。
    飛飛_b4dc閱讀 304評論 2 7

友情鏈接更多精彩內(nèi)容