應很多讀者的要求,本文小姐姐將以一個用戶的展廳VR場景為例,詳細講解Unity3d的VR開發在美工階段的模型預處理、UV2拆分、貼圖優化、光影烘焙、后處理與特效制作以及最終作品優化的基本方法和流程,其中涉及Build-in RP(Build-in Rendering Pipeline-內置渲染管道)、URP(Universal Rendering Pipeline-通用渲染管道)、HDRP(High Definition Rendering Pipeline- 高清渲染管道)和PBR(Physically Based Rendering-基於物理渲染)材質的應用,希望本文對使用unity3d進行VR開發但沒經驗及致力於虛擬展廳制作童鞋們理清思路有所幫助。
這里特別說明一下,小姐姐在CSDN里發表了很多Unity3d相關的文章,每天有五六百人因為技術障礙,搜索到小姐姐的文章閱讀來解決實際項目中的問題,撰寫技術文獻實屬不易,小姐姐在這里沒有任何報酬,您的點贊或關注是小姐姐筆耕不輟的最大動力!如果在閱讀過程中有什么疑問,可V聯小姐姐,我將盡全力解答您的提問。
我們先來看看本案例在內置渲染管道下的效果截圖:




















上面這些圖片是一個用戶跟隨小姐姐的視頻教程臨摹幾周后獨自完成的實際項目的截圖,相信一些童鞋看到這些圖片一定很眼饞,因為很多童鞋沒有項目實戰經驗,單憑對Unity3d的一點點了解,硬着頭皮靠自己摸索着推進項目,障礙一個接一個,搞得精疲力盡,可最后完成的卻作品黯然失色。大家都知道,Unity3d的美工是作品的顏值和賣相,如果美工不過關,即使作品功能再強大,別人是不給你機會的,更別說讓用戶認可了,下面小姐姐將帶着大家一起來完成這個項目的美工部分。
需要說明的是,由於一些建模師不熟悉unity3d的美工制作,常常被美工要求反復修改模型,另一方面,由於不合理的模型構建方法,給后續的光影烘焙和場景優化帶來很多問題,因此,要做好Unity的美工,就得從建模階段入手,做好一些模型的預處理。
1. 場景結構簡介
本案例的3dmax模型如下圖所示,這個場景的原始模型是另一用戶的提供的,由於這個用戶對Unity3d的美工的掌握和很多童鞋一樣只停留在概念階段,沒有經驗,基本也是一邊摸索一邊推進,結果發現困難重重,盡管他的機器很高端,但是制作的U3d場景蒼白暗淡,沒有美感,而且非常卡頓,最后做不下去了,向小姐姐求援。當小姐姐打開Unity工程的時候,發現材質、貼圖、燈光非常多,很多模型穿插,重面、破面也很多,無奈之下,小姐姐只好放棄他的Unity工程,從3dmax場景開始,重新修改模型,下面的就是小姐姐重新修改后的場景截圖。









當小姐姐打開用戶提供的原始3dmax場景時,發現貼圖有215張,材質有264個,而且很多頂點沒有焊合。據這個用戶講,他們團隊的模型師主要做影視動畫的建模,難怪會有200多個貼圖和材質,因為動畫最終提交給用戶的只是視頻(圖片序列),場景渲染的機器配置一般都比較高,建模時不需要過多考慮模型的面數和貼圖與材質的數量,而VR和AR提交的是實時運行的3D場景,播放環境可能是電腦,也可能是手機,或者是網頁或者3D眼鏡等,這些環境下的播放設備不可能像開發者的機器一樣配置很高,所以Unity對模型的要求非常苛刻,在建模階段,必須做好場景的優化和預處理,否則會給后續的美工制作埋下災難性的隱患。
由上圖可見,這是一個展廳場景,其中有大量的史料圖片,按照現代展廳的風格,這些圖片都會用背噴燈片做成燈箱,這個可作為后面布設燈光的依據。
2. 建模階段的預處理
小姐姐在《 Unity3d辦公場景燈光布設與光影烘焙及后處理》一文中詳細講解了建模階段的預處理,其中包括建模方法的優化; 模型拓撲布線優化預處理;重疊、隱藏面優化清理;材質、貼圖的優化預處理; 基於燈光的模型預處理;碰撞物優化預處理和拆分UV2的預處理,大家可移步此文去閱讀,這里僅對其中的材質和貼圖優化預處理、遮擋剔除和視錐剔除優化預處理、基於燈光的模型預處理、碰撞物預處理進行討論。
⑴. 材質和貼圖優化預處理
前面小姐姐提到過,用戶提供的原始模型貼圖和材質多達200多個,如此多的貼圖和材質,勢必會增加機器開銷,導致作品實時運行卡頓,尤其是在移動端和3D眼鏡中瀏覽,這肯定是無法接受的,因此必須消減貼圖和材質的數量。
從前面的模型截圖可以看到,貼圖最多的是那些展牌,原始模型之所以材質數量太多,是因為建模師把每張貼圖都做成了單獨的材質,所以小姐姐考慮將所有的貼圖分組合並,具體操作如下圖步驟所示,之所以用拼音命名,是因為這些群組的名稱會被傳遞到Unity中,為防止一些插件不支持中文,所以建議最好用拼音或英文。


按照上述操作之后,就將所有剛才選擇的那些展牌的貼圖在max中烘焙成了一張4096x4096的貼圖,如下圖所示,需要說明的是,上面將目標通道設為3,是因為UV1被之前的物體貼圖占用,UV2要給光影圖用,默認是1,如果不改為3,在烘焙前會先展UV,並存放在通道1上,這樣之前的貼圖就會錯亂,烘焙后的這張圖也是錯亂的,所以必須改為3。

下面我們要將剛才烘焙的這張貼圖讓上面這些展牌共用,接下來按下圖所示創建一個新的標准材質:

默認情況下新創建的材質的貼圖是在UV1通道上,如下圖所示:

接下來我們將剛才烘焙這些展牌時展開的UV3移動到UV1上,如下圖所示:



接下來點擊下圖所示的圖標,讓每個展牌的UV1各自獨立,圖中綠色殼材質線框即刻消失。

通過上面的圖解步驟,我們將上述的展牌的材質和貼圖就都合並成了一個,之前各自的材質即被空置,可以安全清除,這種方法也稱之為多物體共享一個材質和貼圖。
另外我們注意到,展牌的貼圖比之前的暗了很多,這是因為這張合並了的貼圖是通過max的烘焙所得,其中多少會有燈光的因素,所以應該將這張貼用ps打開,將其中的圖片用每個展牌貼圖合並之前的原始貼圖重新逐個替換一遍,保存之后,這張貼圖的顏色就正常了。
很多童鞋可能不習慣上面這種貼圖方法,只習慣一個物體的不同部分貼同一貼圖的不同部分(一般會將上述的展牌先合並為一個物體,這樣做不是不可以,但是對於后續的遮擋剔除和視錐剔除非常不利),對於不同物體貼同一貼圖的不同部分有點不太適應,但這是完全可以的,之所以這樣做,正是為了滿足后續Unity的遮擋剔除和視錐剔除之需。這里插句題外話,很多讀者因為制作實際項目遇到技術障礙,急得團團轉,搜索到我的文章,向小姐姐求助,把小姐姐當作最后一根救命稻草。還有一些讀者學Unity幾年了,花了很多時間和精力,始終搞不定Unity的美工制作,於是搜索網上免費資料自己拼湊教程,結果還是沒能如願以償。小姐姐的文章,只能讓大家理清思路,要真正掌握Unity的美工制作流程,必須學練結合,還需要前人的言傳,有些東西畢竟還是沒法用圖文來表達的,有興趣的童鞋可以關注小姐姐的《Unity模型預處理布光烘焙后處理特效美工場景優化實戰視頻教程》,在聽講的同時,通過多案例臨摹和感悟,可能脫開教程,將所學的技術應用於實際項目,需要的話可去某寶關注或V小姐姐,好了,言歸正傳。
上面這種方法是在每個展牌各自都貼好了材質和貼圖之后為消減材質和貼圖的數量的被動之舉。我們也可以在開始建模的時候,用手工展UV1的方法來做,也就是先規划好展牌的分類,確定哪些展牌的貼圖應該合並在一起,然后用ps將這些展牌需要用的貼圖拼在一張大的圖片中,假設下圖是我們事先拼好的一張大圖:

然后如下圖所示將其指定給一個新建的材質的Diffuse:

接下來將這個新建的材質賦給需要貼這張圖中小圖片的對應物體,如下圖所示:






通過上述的圖示步驟,可將多張拼合在一起的大圖中的小圖,正確地貼到對應的物體上。接下來再選擇另一個需要貼這張大圖中小圖的物體, 用同樣的方法將對應的小圖貼到其上,這種方法就叫手工展UV1,也稱為手工拆分UV1,此法一樣可以實現合並材質和貼圖的目標,與前一種方法不同的是,此法無需通過烘焙合並貼圖,所以貼圖不會變暗。
以上討論了多個物體在不合並的情況下將其材質和貼圖合並的兩種方法。
接下來將場景中較小的展牌全部分離成單個的物體,如下圖所示,然后群組,並命名為“xiao_deng_xiang”,用上述的步驟同法泡制,將材質和貼圖合並為一個。

最后將場景中所有的文字展牌全部分離成單個的物體,如下圖所示,然后群組,並命名為“wen_zi_deng_xiang”,也用上述的步驟同法泡制,將材質和貼圖合並為一個。

通過上述的操作,場景中的所有展牌就被合並成了三個材質和三張貼圖,整個場景中的材質由264個驟減為50個,貼圖由原來的的215張驟減為50幾張,大幅度降低了機器負載,如果不做這樣的材質、貼圖優化預處理,導入Unity之后,會非常卡頓。
這里特別強調一點,unity3d有自己的材質系統,不兼容建模軟件中高級渲染器的材質,因此只需用標准材質貼基本的紋理即可。
⑵. 遮擋剔除和視錐剔除優化預處理
Unity3d場景既要控制貼圖、材質的數量,也要控制物體的數量和場景中模型的總面數,為此,一些童鞋常常將很多物體在建模軟件中合並(Attach),這樣一來,物體的數量減少了,但是模型面數卻沒法消減。Unity3d引入了遮擋剔除和視錐剔除技術來優化相機視圖中模型的面數,如果為了減少物體數量而將很多物體合並,反倒不利於Unity3d的遮擋剔除和視錐剔除,例如前面的展牌,如果將所有展牌物體全部合並,相機無論如何移動和旋轉,相機會認為這些展牌的面數始終在視野之內,無法將真正處於視野以外的模型面剔除,從而導致運行卡頓。這里說明一點,模型面數對機器造成的負載相對物體的數量來說,要大得多,因此控制模型的面數比控制物體數量要重要的多。
基於上述的概念,對於場景中眾多的物體,小姐姐傾向於對其分類群組,不建議隨意合並,以方便在unity進行視錐剔除和遮擋剔除優化。
⑶. 基於燈光的模型預處理


⑷. 碰撞物預處理
為加速Unity的相機渲染,可以依據場景的輪廓,構建如下圖所示的簡版模型作為場景的替身,來接受Unity中碰撞物或稱障礙物(Colliders)的實時檢測,以防止相機自由下落或穿牆而過。這個簡版模型相對帶有復雜貼圖和光影圖的眾多場景模型的來說,計算量會小很多,因此會大幅度加速相機的實時渲染,這個簡版模型必須在建模軟件中預先構建好,而且應與場景模型重合,右下圖左上角可見,該模型只有300多個面,遠遠小於場景的總面數(18萬+),這個模型無需貼圖,也無需烘焙和渲染,僅用於碰撞檢測。


很多童鞋完成的作品跑起來很卡,大部分情況是直接將場景中所有物體設為了碰撞物,實時運行時,每幀都要檢測相機與所有物體的碰撞情況,機器負載非常巨大,如果改用上面的簡版物體作為碰撞物,作品跑起來立即就流暢多了,因此在建模軟件中的碰撞物預處理是非常必要的。
⑸. 拆分UV2
前面和大家討論過拆分UV1,UV1是物體的紋理貼圖坐標,我們使用拆分UV1,合並了多個不同物體的材質和貼圖,UV2是物體光影圖的貼圖坐標,拆分UV2,是為unity中烘焙物體的光影圖拆分貼圖坐標,小姐姐在別的文章中多次強調,Unity3d的UV2拆分功能有缺陷,烘焙簡單的場景還行,對於實際的工程,一烘焙就出現黑斑、亮斑、硬邊、鬼影等缺陷,這些都是UV2的拆分缺陷引起的,要消除這些問題,得經歷無數次的參數修改和烘焙測試,耗時費力,所以小姐姐建議在建模軟件中拆分UV2,因為建模軟件中拆分的UV2在Unity中烘焙一般沒什么問題,這個工作需要在模型導出前來完成,所以拆分UV2也屬於模型的預處理,下面我們就來拆分這個案例模型的UV2。
拆分UV2之前,得根據后期光影烘焙的需要,對整個場景進行一個規划,也就是先確定哪些物體需要烘焙,哪些不需要烘焙,不需要烘焙的物體就不需要拆分UV2了,需要烘焙的物體還得根據物體的重要性和面的大小進行權衡,並本着節省光影圖的原則,盡量將更多的物體拆分在一個UV2里面。需要注意的是,拆分在一個UV2里的物體,與前面拆分在一個UV1里的物體沒有任何關系,各管各的事。不同的多個物體可以共享一個紋理,不同的多個物體也可以共享一個光影圖,這些都是因為不同的多個物體共享了一個UV1或UV2產生的,具體將哪些物體拆分在一個UV2里面,這需要一些實戰經驗,如果有條件,可跟着我的視頻教程去臨摹案例來感悟和積累經驗。另外,作為建模師,對后期的光影烘焙和場景優化等美工各階段必須有足夠的了解,否則構建的模型不是需要反復修改,就是相互扯皮。
因為這個場景中的牆體是最大也是最重要的,所以先來拆分牆體,但是如果把所有的牆體拆分在一個UV2里,光影圖的分辨率需要設到4096X4096才可能看上去不虛,可是光影圖太大,烘焙太費時、同時后期的實時運行負載太大,所以把牆體分為南牆和北牆分別拆分,這樣南牆和北牆就可以分別用2048X2048的分辨率來拆分了,一張4096x4096的光影圖相當於4張2048x2048的光影圖,兩張2048x2048的光影圖比一張4096x4096的光影圖的負載小一半。
如下圖所示,選中南牆(將牆體上的展牌(燈箱)和地台及3D文字等物體排除)所有物體,然后群組,並命名為“nan_qiang_2048”,請大家養成用英文或拼音命名的習慣,以防Unity中的某個插件不支持中文出問題,拼音用低划線隔開是為了好識別,因為有的人一看到字母就以為是英文,直接就懵了,模型是要轉給美工的和程序的,得讓他們好識別。2048是表示這個群組拆分UV2的分辨率,在群組名稱里標識,也是為了傳遞到Unity中給美工烘焙時設定光影圖的分辨率時參考。


按下圖所示步驟拆分“nan_qiang_2048”群組的UV2:

拆分的UV2如下圖所示,注意,雖然這些物體的UV2拆分在一個UV里了,但是這些物體並沒有也不需要合並成一個物體,理由前面已經說過了。

看到這里,相信童鞋們會用同樣的方法來拆分北牆了,具體過程這里就不贅述了。接下來將選擇所有的展牌,並命名為“deng_xiang_128”,有的人說展牌這么大,這么多,分辨率怎么才設128呢,因為這些展牌后續要在Unity里用發光材質作為光源來照亮場景,而自發光的物體是不接受陰影的,也就是自發光物體上是不會有光影圖的,同時自發光物體的光照需要烘焙才會有效果,要烘焙得設分辨率,舍得太大又毫無意義,所以這里就設為128。


按下圖所示的參數拆分后的結果如下,需要注意的是,拆分完一個群組隱藏一個,一方面對於選擇物體方便,另一方面不至於丟掉哪個物體。

以此類推,將其他物體根據需要分別群組並拆分UV2,具體過程就不再贅述,有關拆分UV2的方法就討論到這里。最后強調一點,要分批次烘焙,就得在建模軟件中將物體群組拆分UV2,之所以分批次烘焙,一方面是因為整個場景烘焙太費時,一旦某個群組里的物體有問題或者需要修改,只需修改后導入unity重新烘焙這個群組就可以了,已經烘焙好的沒有問題的物體是不受影響的,如果不分批次烘焙,每修改一次物體,就得把整個場景烘焙一遍,另一方面,分批次推進烘焙,不至於等的讓人心急。
3. 模型導出
模型的導出在別的文章里面已經討論過了,在這里再次討論,是因為需要告訴大家,如果要分批次烘焙,就得將上面的群組一個一個導出成FBX文件,如下圖所示:


因為整個場景導出的FBX文件導入Unity后,其下的物體一旦有問題,是不能刪除的,如下圖所示,只有單獨的FBX文件是可以刪除的,所以為了能讓有問題的物體所在的群組能單獨刪除,就得將建模軟件中的群組分批次一個一個導出成FBX文件,這樣導入Unity后,即使烘焙了,刪除某個有問題的FBX文件,別的已經烘焙好的物體是不會受任何影響的,將有問題的物體在建模軟件中修改后,重新導入Unity中,只需烘焙這一個群組就可以了,不知道大家明白我的意思不。


模型導出需要注意的問題就說到這里。
4. 模型導入Unity
模型導入Unity在別的文章中也討論過了,這里需要討論的是當把分批次導出建模軟件的物體群組FBX加載到場景時,有兩種方式,一種是直接拖至層級面板,一種是直接拖至場景中,這是兩種不同的方試,拖至層級面板,所有物體群組會按建模軟件中的坐標原點對齊,這樣每個物體都按建模軟件中的相對位置定位,而直接拖至場景中,鼠標在哪,物體群組就會放在哪,這樣整個場景就會散亂。

5. 燈光布設
下圖為所有模型導入Unity后搭建的場景,由圖可見,沒有任何層次,很多做程序的人和初學者,對美工沒概念,做的場景就這樣直接發布了,這顯然是不行的,現代社會,任何產品都有美學的要求,對於Unity作品亦不例外,所以必須進行美工處理,美工的第一道工序就是場景布光。

和動畫、電影、電視場景一樣,Unity場景也需要采用經典的三點布光法(主光、輔光、背光)來照明,同時應根據場景的特點和實際情況來布設燈光。對於現代展廳,和舞廳、K廳一樣,一般都是密閉空間,主要靠人工燈采光和營造氣氛,無需自然光的參與,所以首先關閉默認的平行光和環境光,如下圖所示:

在這個場景中,有幾個比較大的落地展牌燈箱,我們在這些位置布設面光源,用這些燈光的綜合作用作為主光源來照亮整個場景並產生陰影,當然也可以直接將這些燈箱設為發光材質來照明,但是考慮到面的發光材質的光照沒有面光源效果好,所以我們還是用面光源來照明,如下圖所示:
