好吧,今天和大家分享一下3D遊戲中美術資源的最佳化。才想起來,我也是小白一隻啊!但大蝦都是由菜鳥而來的(這邏輯好奇怪),不懂就多問、多想、多查詢吧,我也是憑著這種信念,才有了這一篇文章。

之前製作遊戲模型的時候,不會考慮太多效能最佳化的問題,程式組需要怎麼樣的素材,素材的標準是怎樣的,我們美術組按著資料來製作就可以。一般來說,獨立模型貼圖的尺寸是512或者1024,都是一張貼圖對應一個材質球,給一個模型使用。但這做法是我幾年前所瞭解到的,時至今日,這標準是否被淘汰了,我自己也不知道。我只能說一下,我現在所瞭解到的和體驗到的,一些關於材質、貼圖最佳化的事情。

3D美術資源最佳化——材質貼圖篇

自行測試

我們第三款的手機遊戲還在策劃當中,但主題和型別基本確定了,是一款城市建設結合經營類的遊戲。對於美術有兩大挑戰,一是工作量大,二是對效能的把握。因為遊戲中會有大量的建築和物品,幾乎是現實中存在的,遊戲中就可能會出現,但這是不可避免的。所以對效能的把握,必須很講究。我很早就開始效能測試的工作,如果在遊戲正式製作前,不找到合適的方式,那後果將是毀滅性的。

一開始我就想到了共用材質球,但出發點不是最佳化效能,而是偷懶。我設定了20多個純色的材質球,一明一暗的搭配,譬如我設定了一個紅色的材質球,就會在這個紅色的基調上,再增加一個稍微暗紅色的材質球……建築的牆體就用這些純色的材質來賦予,也會稍微有明暗、層次的效果。至於建築上的門、窗等其他物件, 也是共用一個材質球,它使用的是一張1024的大貼圖,上面集合了各種門窗的貼圖。我想著一款遊戲下來,材質球不超過35個,最佳化效能是大可不必再考慮材質球方面了。

我把建築模型匯入到Unity中,擺設了一個建築群,大約有650棟建築,再除錯了一個攝像機動畫,測試檔案就完成了。我運行了一遍,Batches數值達到3400多,Calls數值達到1300多!我驚訝了,原本對這些數值不敏感,但@銘顯告訴我越低越好,Batches值最好不要超1000。不管了,先匯入到手機上執行看看怎麼樣。果然不出所料,動畫很卡。雖然我當時考慮最多的是,會不會是建築數量太多呢?但還是找了找最佳化方面的知識。無非都是要控制模型面數、共用材質球等等。這些都在考慮之內了。

3D美術資源最佳化——材質貼圖篇

材質合拼

後來@銘顯給了我一個新概念——材質合拼,他說將多個材質球合拼到一個材質球,可以達到最佳化的效果。但材質球是怎麼樣合拼的?我功力不夠啊!難道是用滑鼠拖著這個材質球往那個材質球上拽嗎?這時我想到了多維材質,但多維材質使用起來也不方便啊……如何將那麼多色塊集中在一個材質球,而又不是多維材質呢?貼圖!還是貼圖!我將所有的色塊都集中在一個貼圖上,載入到一個材質球上使用就可以了。之前設定的20多個純色材質球,瞬間變回1個。雖然使用起來需要展UV,沒有之前那麼方便,但由於是色塊,沒有涉及紋理,所以展UV不用太講究,大大咧咧地將UV拖到想要的色塊就行。後來我再做進一步的調整,把色塊和門窗等等物件的貼圖都集中在一張4096的貼圖上,這樣材質球就更少了。但為什麼是4096呢?@銘顯告訴我,超過4096的話,Unity可能會不顯示。

調整後的測試資料很樂觀, Calls數值只在30左右跳動。在手機上執行的話,前期載入的時候會卡頓,但載入完後動畫非常流暢,

這算是測試成功了吧?

3D美術資源最佳化——材質貼圖篇

又陷入迷惑

有位朋友Camel,在國內某知名遊戲公司任職美術主管,和他聊起這個話題,他說我這種做法和他們的不一樣,他們是一個模型對應一個材質球,使用一張512的貼圖。但具體為什麼要這樣操作,他也不懂,他是純美術大牛,對引擎技術也是一片空白。我瞬間凌亂了,還抱著一絲希望問他:你們開發的是手遊嗎?

——是啊,就是手遊。

——靠!我還以為是PC端呢!

人性往往都是這樣的,會仰望權威,對我而言,Camel和他的公司都是權威。當自己的行為和權威不一致時,又開始懷疑人生了……為了去掉心中的霧團,我整理了兩張圖片(如下),一張是共用材質的示例,另外一張是一個模型對應一個材質的示例,委託他諮詢一下技術總監,這兩種做法,我該如何選擇。

3D美術資源最佳化——材質貼圖篇

(圖一:多個模型共用一個材質球,使用一張大貼圖)

3D美術資源最佳化——材質貼圖篇

(圖二:一個模型對應一個材質球,使用一張小貼圖)

非常感謝Camel和他們的技術總監,給了我很明確的答覆。

他們建議我一個模型使用一張512的貼圖,因為貼圖太大會消耗GPU;一些可以重複利用的模型,比如,門窗、屋頂等等,可以共用一張貼圖

,這和我先前的做法是一樣的。我又按照這種標準測試了一遍,Batches值和Calls值都不低。因為有了第一次的測試,所以這結果也在意料當中的。

那我究竟應該選擇哪種方式呢?一個是知名大公司使用的方法;一個是資料看起來很樂觀的方法……

再次求證

正當非常困惑和懊惱的時候,我想起了另外一位朋友阿蓮也在遊戲公司任職美術師,我馬上和她聯絡上,人啊!就是現實的動物,正所謂無事不登三寶殿,我都懶得跟她寒暄了,直接告訴她我所面臨的問題。

她說:“我不懂啊!”

——這……這……這叫什麼話~

——“不過我可以幫你問一下技術”

“那趕快啊!還愣著幹嘛?”這句是我的心裡活動,沒有說出口。

很快,她答覆我說,

Unity場景可以看情況共用一張或者兩張4096的大貼圖;角色最好就獨立使用512貼圖,因為角色有可能出現在不同的場景,每次都為了這角色,呼叫一張4096的貼圖太浪費資源了……

這意味著什麼?這意味著4096的貼圖是可以使用的,就是說,我最初的方法還是行得通的!所以,

我第二次的測試算是成功的吧!

3D美術資源最佳化——材質貼圖篇

很多事情,實現的方式多種多樣,製作同一個3d模型,有人喜歡用Max,有人喜歡用Maya,無所謂好壞,用習慣就好。很感謝我這兩位朋友Camel和阿蓮,還有給他們技透的總監^_^,讓我學習到不同形式的最佳化方式。雖然我很大可能是使用第二種方法,但不能說第一種就是錯的,文章一開始,我就說前幾年瞭解到的製作方法,其實就是第一種。而且,我沒有和Camel說明白,我製作的是什麼樣的專案,

專案不一樣,往往要求就不一樣

。假如用第二種方法來製作次世代遊戲,估計就不現實了,因為次世代模型有紋理貼圖,法線貼圖,高光貼圖等等,每種貼圖集合成大圖,再分別對一次UV,結果是累死,各種貼圖還未必對得上位置……

有些知識和經驗就是這樣在曲曲折折中獲得的,雖然傷神,但印象深刻。以上就是我開始新專案時,糾結怎麼樣使用貼圖材質的一些事情,當然啦,3D美術資源的最佳化不僅僅是貼圖,還有很多更為重要的方面,我籠統地歸納一下,有不對或欠缺,請看官補充:

01. 注意模型的面數02. 儘可能地將多個模型Attach在一起03. 共用材質球,將多張貼圖拼成一張貼圖04. 貼圖儘量使用16位而不是32位

……

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

關於UME Game更多的資訊、開發日誌、創業故事、技術分享……請關注我們的官方號>>>>>

>>>新浪微博:@UME-Game

>>>知乎專欄:UME Game

>>>微信公眾號: ume-game