美術資源標準(模型篇)

美術資源標準(模型篇)

來自專欄 Unity技術美術26 人贊了文章

前言

上篇講了文件夾結構,這篇呢我們來聊一聊3D模型的相關內容。

我們先來梳理下模型進入遊戲的整個工作流程,然後再依次分析有哪些標準與規則。

  1. 美術在DCC(Digital Content Creation,數字內容創作,遊戲行業中是指美術製作數字內容所使用的軟體工具)軟體中進行模型創作。
  2. 製作完成後,從DCC軟體中導出FBX格式。
  3. 導入Unity引擎並設置導入的相關選項。
  4. 生成預設供程序使用。

從以上流程我們可以看出,遊戲最終使用的是模型的Prefab(不用Prefab,直接上模型行不行?答 :可以,但是你一定會後悔的!),所以先與程序討論確定Prefab是以什麼樣的內容給到程序的,比如層級結構、文件命名、組件都需要添加哪些等等,不過這塊標準與模型本身的關係不是特別大,更多的是TA與程序間的標準確認,Prefab所引用的原始資源才是TA的重點關注對象,這其中又大多與性能優化息息相關,接下來詳細說明這一塊內容。


單位統一

在項目之初首先要定的就是模型單位,如果單位沒有統一,那麼在引擎中的比例就會不一致,這會給項目帶來很多後續的煩惱。

以常用的Max為例,按下圖中進行設置:

確定後我們會發現在狀態欄顯示Grid=0.1m,意思就是表示視圖中的1個格子是0.1米的長度。

隨後我們創建一個Cube,長寬高都為一米,然後導出為FBX,注意在導出彈窗中單位設置為自動,這樣可以保證縮放係數是1,與當前Max中設置的一樣。

然後將FBX再導入Unity中,先不做任何設置直接將其拖放到場景中,然後我們在Unity中同樣創建一個Cube,縮放都為1。此時你會發現兩個Cube大小是一樣的,這樣就保證了我們在Max中的單位與Unity中是相對一致的,為什麼說是相對呢?

因為在Unity中其實是沒有實際單位的,如果我們設置遊戲內1米=1個單位的話,這恰恰與Unity內的物理系統所期望的正確結果保持統一,所以想要單位統一的話,只需按上面的進行設置即可。


方向

單位說完,我們再來說下方向,方向不統一的話會導致Prefab上的旋轉值很混亂,這就會給程序帶來諸多不便,所以不管如何我們有必要統一一下。

方向其實就是坐標軸,在定方向前我們先來了解下兩個概念:

1.左手坐標系

左手的大拇指表示X軸正方向,食指表示Y軸的正方向,中指表示Z軸的正方向。

2.右手坐標系

右手的大拇指表示X軸正方向,食指表示Y軸的正方向,中指表示Z軸的正方向。

所以我們可以很容易的看出Max是右手坐標系,而Unity是左手坐標系,左手坐標系與右手坐標系是不能完美轉換的,總是會有一個軸是反過來的。

所以還是先回到Unity中定下我們想要的是什麼樣的結果,首先我們在Unity中看到Y軸是朝上的,這就意味著如果是個人的模型的話,那麼頭頂上方的方嚮應該就是Y軸,如果不是Y軸那麼人物就會出現方向錯誤。其次,哪個方向才是前方呢?Z軸正方向是前方,這點在Unity的官方文檔中有說明,所以我們只需要定好這兩個軸向就行了。

然後我們回到Max中,以一個茶壺為例,壺嘴表示前方,按以下步驟進行操作:

  1. 先將坐軸系設置為Local,我們只需關心模型的自身坐標軸。
  2. 在層級修改面板,點擊Affect Pivot Only,旋轉茶壺的坐標軸,將其調整為Y軸朝上,Z軸朝壺嘴方向。
  3. 退出修改,塌陷幾何體,並導出。

4.導入Unity,直接將模型拖入場景並將其Roation全部歸為0.

5.完成,這樣方向既保證了正確性,Transform組件中的Roation也都是默認的0.


頂點數與面數

這點與優化息息相關,可能在有些同學眼裡覺得只要控制好面數就行了,其實不然,頂點數也很關鍵,面數的規則反而簡單,只要達到性能優化標準的同時滿足美術效果就好了。

在渲染一個模型的時候,Shader層面會有兩塊計算量,一個是頂點著色器,一個片斷著色器,頂點數越多,頂點著色器消耗就越大。

所我們重點來說下頂點數,首先在Max中創建一個Cube(長寬高段數都為1)並導入Unity中,然後與Unity中默認的Cube(Unity中創建的默認Cube)對比:

Max:頂點數8,面數12.

Unity:頂點數24,面數12.

面數是一致的,為什麼頂點數卻多了這麼多呢?在回答這個問題之前,我們先來做幾個小測試。

在Max中創建一個面片(Plane),只在長度上分為兩段,如下圖中所示,然後不做任何修改,直接導入Unity中,結果如下:

Max:頂點數6, 面數4.

Unity:頂點數6, 面數4.

這時發現面片在Max中與在Unity中的頂點數與面數都是一致的,好,那麼接下來,我們回到max中,為剛才的面片添加Unwarp UVW修改器並將兩個面的UV切開使其呈現下圖中所示的效果,然後導入Unity中,得到如下數據:

Max:頂點數6, 面數4.

Unity:頂點數8, 面數4.

這時我們發現Unity中比Max中多了2個頂點,面數還是一致的,導致這個結果的原因就是因為我們將模型的UV切開了,由原來的6個UV點變成了8個UV點,而這恰恰與在Unity中顯示的頂點數是一致的。

我們現在再做另外一個測試,回到一開始的這個面片,不切開UV保持默認,但是我們把中間的線拉起來如下圖所示的樣子,並同時給兩邊的兩個面分別不同的光滑組,然後導出到Unity中,結果如下:

Max:頂點數6, 面數4.

Unity:頂點數8, 面數4.

難道光滑組不一樣也會增加頂點數嗎?確實會,但也不全是,此時我們在Max中將上面拉起來的線放平(就是整個面片上的兩個面都在同一平面),但是兩個面的光滑組同樣還是不一樣,這時我們再導入Unity,結果如下:

Max:頂點數6, 面數4.

Unity:頂點數6, 面數4.

現在卻又變成一樣了,為什麼呢?

通過以上幾個小測試我們可以得出以下幾個結論:

  1. 模型的UV頂點數增加會直接導致引擎中頂點數增加,這是因為同一個頂點被切成多個UV點時,在引擎中是會被認為是多個頂點的。
  2. 不同光滑組的面會導致它們的共用頂點屬性信息不能共享,所以在引擎中也是會被認為成多個頂點的,但如果這些面雖然光滑組不一樣,但是它們又實實在在的是在一個平面上的,只是被強制設置成光滑組不一致而已,這時引擎會自動優化,從而不會產生額外的頂點數。
  3. 如果某1個頂點,它既是多個UV點,也是兩個不同光滑組的共用頂點,那麼它在引擎中會是2個頂點,而不是4個。
  4. Max與Unity顯示的頂點數原理不一樣,請以引擎為準。

好了,現在我們回到一開始的問題,為什麼Cube在Unity中會有24個頂點呢?我相信你應該明白了吧,因為Cube有8個頂點,每個頂點會在UV中被分成3份,所以在引擎中就是8x3=24個頂點。


頂點屬性

每個頂點上可以存儲多個屬性信息以便在引擎中可以去使用它做一些事情,我們先不管用它做什麼,從模型上來講,屬性信息越少就代表著模型的容量越小,同時它所佔用的內存也就越小。所以我們要明確模型應該帶有什麼屬性,不需要的都要清除掉,保證美術資源只含有必須要的內容。

首先我們來看下在Unity中模型上可以認到屬性有哪些:

  • 頂點數、面數、UV1

頂點數與面數是模型的基本,所以沒什麼好說的,UV1也是不可缺少的屬性,否則我們也沒有辦法讓模型呈現我們的貼圖。

  • UV2

如果是需要烘焙的模型,是必須要有UV2的,可以在Unity中自動生成,也可以在DCC軟體中自行製作,如果不需要的話就要清除。

  • UV3
  • UV4

通常情況UV3和UV4都是用不到的屬性,大多情況下要清除。

  • 頂點色

用法較多,可通過頂點色實現很多功能,有需要用則保留,沒有則清除。

  • 法線
  • 切線

法線與切線可在DCC中生成也可以在引擎中自動生成,根據需要進行設定。

需要注意的事,有些屬性信息在引擎中是不能清除掉的(只能通過插件的形式去修改本地FBX文件的內容來實現),比如UV和頂點色,所以如果要清除只能通過回到DCC中清除完後再導回來,這也是前期定好標準的好處之一,必免了今後做優化時美術更改的痛苦。

以下列出在Max中清除屬性的方法:

通過Tools/Channel Info...打開通道屬性面板.

選中需要清除的屬性,點擊此面板上方的Clear即可,操作前記得先將模型轉換成Editable Poly,之前有發現過Editable Mesh下清除無效的情況,這裡不清楚是為什麼。。。

以下給出同一個模型清除前後的對比:

只清除掉了頂點色與2套UV,內存佔用上就少了100KB,不要小看這100KB,在量級上去以後這些優化也能省下不少的內存,特別是在移動端,內存寸土寸金啊。


最後

歡迎大家關注更多乾貨的公眾號:Unity技術美術 (ID:gh_8b69cca044dc)

推薦閱讀:

TAG:Unity遊戲引擎 | 3D建模 | 性能優化 |