先看看本案例的部分效果截圖:
本文小姐姐以一個辦公場地為例,和童鞋們再次討論Unity3d室內場景的燈光布設、光影烘焙和后處理,希望對初學者有所幫助,本例的3dmax場景如下兩圖所示,其中第二張圖為從后面觀察的截圖。這個場景的模型面數原本為90多萬,面線縱橫交錯,彷如蜘蛛網,為了優化場景和方便圖解,小姐姐用3dmax最優化低面數精簡單面建模方法重構了這個場景,由下圖左上角的統計信息可見,面數縮減到了21.5萬。無論使用Unity3d,還是UE4,或者CE等其他引擎,3d模型都必須用盡可能少的面數來構建,否則后期的光影烘焙和實時運行會遇到災難性的卡頓,這是小姐姐反復強調的話題了,相信一些童鞋已經感同身受,但是還有一些童鞋硬着頭皮往前沖,繼續沿用效果圖和動畫的建模方法構建場景,最后一定會因模型面數太高絆倒在光影烘焙和作品實時運行這個坎上。因此對於VR和游戲場景,模型師一定要采用最優化低面數精簡的單面建模方法來構建,無論使用3dmax、maya、C4D、Blender、Sketchup、Modo,還是其他3D建模軟件,都應力求降低模型面數。
由上面兩圖可見,小姐姐重構的場景,拓撲布線簡潔平整,看上去很舒服,而且編輯操作流暢無卡頓。
1. 場景結構解析
為了便於童鞋們對本例后續的理解,小姐姐先對這個場景的構造作一詳解。由上面兩圖可以看到,這個場景是一個辦公場所,從下到上分別由-1層(地下室)、1層、2層三部分組成,為方便觀察,小姐姐將這三層拉開如下圖所示。有童鞋可能會認為這三層都無屋頂,其實不然,因為小姐姐是用單面建模構造的場景,這個場景主要表現室內,所以屋頂的正面朝下,從上面看到的是屋頂的背面,所以看上去似乎是鏤空的,這是單面建模的特點,面的背面都是鏤空的,而當我們從室內觀察的時候,屋頂是可見的,如下面第二張圖所示。
三層之間是通過樓梯間貫通的,如下圖所示,為了讓大家看清關系,小姐姐將樓梯間水平向外移動了,並且樓梯間有玻璃幕牆,用來采光。
這個場景乍一看很復雜,仔細的童鞋會發現1、2層大致是左右對稱的,如下圖所示,這樣以來,對於1、2層,我們只需搞清下面第二張圖紅線部分即可。
下面我們就先來看二層右半部分,室內陳設如下兩圖所示,其中有沙發、茶幾、裝飾品、掛畫、飲水機、資料櫃、椅子、接待台、轉角辦公桌椅、集中辦公桌椅、打印機、復印機、台式電腦、筆記本電腦、貨架、飲水杯、台燈、洗臉盆、馬桶、書櫃、玻璃隔斷等。
二層右半部分的功能分區如下圖所示,樓梯間右半部分有接待區、大辦公區、兩個小辦公區、會客室、走廊、衛生間等。
通過以上的圖解,相信大家對二層右半部分的結構就搞清楚了,與此同時,整個二層結構(如下圖所示)也就都明白了。
二層結構搞清楚之后,我們再來看一層(如下圖所示),由下圖可見,一層與二層相比只是家具布局不同,建築結構完全相同。
接下來我們再看看-1層,如下圖所示,這一層比較簡單,一目了然,沒有窗戶,采光主要依賴於屋頂的格柵燈。
樓梯間與地下室、一層、二層的聯結關系如下三圖所示,從圖中大家可以看到這三層的牆體都有踢腳線和陰角線。
通過以上的圖解,大家應該對這個場景的結構有了詳細的了解,同時大家也可以看到最優化低面數精簡單面建模方法構造的場景邊面簡潔平整,編輯操作清晰流暢,可大幅度降低模型面數的優勢。
2. 模型階段預處理
小姐姐在別的文章中反復強調,用於VR和游戲的模型,無論你是用3dmax、maya、C4D、Sketchup、Rhino、lightwave、softimage、
blender還是modo等其它軟件建模,都必須采用最優化的低面數精簡單面建模方法構造場景來大幅降低模型面數,以保證Unity3d中場景烘焙的速度和質量及最終作品的實時運行流暢,同時在模型構建完成后,還應針對模型、材質、貼圖、燈光、視錐剔除、遮擋剔除、LOD、和碰撞物進行優化預處理,以免場景導入Unity3d后才發現需要返回建模軟件進行前置處理而白白浪費時間。
VR和游戲開發是一項多人協同的作業,建模師雖然不參與美工和程序,但也必須了解這兩個階段對模型階段要求,除了采用最優化的低面數精簡單面建模方法構造場景外,建模師還應了解一些優化預處理的知識點,下面小姐姐對這方面的知識點作一詳解。
⑴. 建模方法的優化
很多剛剛接觸Unity3d的童鞋,一直沿用以前做效果圖和動畫的建模方法,也就是習慣用建模軟件提供的標准幾何體堆砌場景,或者用二維線拉伸、旋轉、放樣等構件場景物體,並不間斷地使用一些布爾運算開洞,這樣的建模方法構造的物體面數非常多,模型自交嚴重,很多面都是無用的,Unity3d甚至UE4、Cryegine、寒霜等所有引擎,都強烈建議使用最優化的低面數精簡單面建模方法來構建場景,簡單地說,就使用最少的面數來構建場景,因為模型面數是造成卡機的最大禍首,有的童鞋很偏執,就是不改陋習,非要用自己習慣的方法建模,那沒問題,往前走幾步,必然卡頓在超高的模型面數上。建模方法不同,構建的同一物體的面數千差萬別,因為游戲和VR引擎的場景是實施運行的,不像效果圖和動畫一樣,最終只渲染成靜幀圖片或圖片序列,從建模開始,就不注意控制模型面數,會導致后續的很多處理很難推進。最優化低面數精簡單面建模,就是用簡單的poly,通過切分面線,然后推拉構造物體,有效避免了模型自交,還可大幅度降低模型面數,所以建議大家使用小姐姐推薦的方法來構建場景,上面大家看到的案例場景,就是小姐姐自己構建的,面線平整簡潔,面數很低。給小姐姐的《Unity模型預處理布光烘焙后處理特效美工場景優化實戰視頻教程》一些支持,小姐姐會贈送最優化低面數精簡單面建模視頻教程,本案例的所有max模型、貼圖、Unity3d場景、源代碼、插件及更多案例都包含在其中,動手臨摹多套案例,才能真正擺脫教程,做出高顏值有賣相的unity作品,否則就如同看菜譜學烹飪,一看就會,一做就廢。
⑵. 模型拓撲布線優化預處理
在前面的圖示中,大家一定看到如下圖所示的物體,我們不妨將它單獨移出來,一定有人會問,小姐姐為什么要這樣建模呢?這就是所謂的拓撲布線問題,也就是物體上的邊線布設問題。一般情況下,物體(poly)的布線應根據物體的造型、材質、貼圖、形變以及拆分UV2的需要來布設,同時這些邊線的布設決定着模型面數的多少,不合理的布線會使模型的面數急劇上升。
有了解單面建模的童鞋存在很多疑問,覺得單面建模就是盡可能減少模型面數,一些模型的某些面上明明不需要邊線,卻發現某些面反而布設了邊線,這正是物體的布線要根據物體的造型、材質、貼圖、形變以及拆分UV2的需要來布設的原因。下面我們先來說說根據物體造型需要的布線(也就是可編輯多邊形的邊面切分或分割),因為上圖那個位置有個窗戶,我們需要在那個位置開個窗洞,一般情況下,按照最優化低面數精簡單面建模的方法,先構造一個和窗戶牆等大的幾何體(如下第一張圖所示),然后將需要開洞的面的上下和左右邊分別布兩條線(也就是連接兩條線或者分割兩條線),形成如下第二張圖所示的網格面。
接下來選擇中心的面(如下第一張圖紅色部分所示)刪除,形成下面第二張圖所示的洞口,同理,在背面也開一個這樣的洞口,然后將兩個洞口的邊緣線橋接,形成第三張圖所示的窗戶洞。
一些用過單面建模的童鞋認為這個窗洞就開好了,但是,小姐姐認為,這里還需要對布線作進一步優化。原因是上面的方法將窗戶牆的前面分割成了8個面(如下圖所示),不僅如此,背面也被分割成了8個面,同時,還給每條外邊線各增加了兩個節點,把每個外邊線分割成了三段,導入Unity后,頂面會因前后面各增加的兩個節點,自動連接節點生成如下第二張圖的6個三角面,底面和兩個側面也會各生成6個三角面,這個窗戶牆會變成64個面,unity3d的模型面是按三角面處理的,也就是3dmax中的四邊面到了u3d中,會自動連接每個四邊面的對角線轉換成三角面的,上面的64個面,就是64個三角面,64個面是怎么來的呢,前后牆面各8個四邊面,就是16,窗洞4個四邊側面,加起來就是20個四邊面,自動轉換成三角面就是40個,窗戶牆頂面、底面、左右側面各自會自動變成6個三角面,這樣又有24個三角面,40個三角面+24三角面,總共64個三角面。
如果對布線進行一些優化,即將下圖中2、3節點與節點1焊合(或叫合並),5、6節點與節點4焊合,7、8節點與節點6焊合,10、11節點與節點9焊合,形成如下第二張圖所示的布線,窗戶牆的前面就只被分割成了4個四邊面,同時也不會分割相鄰面的邊,這樣以來,整個窗戶牆(前后各4個四邊面,頂底和左右兩側4個四邊面、窗戶洞4個四邊面)總共16個四邊面,導入u3d自動轉換成32個三角面,這與前面的布線方法相差一半,有的童鞋說,相差一半關系不大,1和2相差一半,沒什么區別,大家可別忘了,一個場景50萬面和100萬面,200萬面和400萬面區別可就大了。
如果不優化拓撲布線,這樣的物體被大量復制,模型面數會急劇成倍上升,小姐姐這個例子比較簡單,如果造型復雜,不優化拓撲布線,可不就是2倍的關系了,這也就是這個場景中小姐姐使用這種布線的原因。
下面用圖示比較一下同一個物體在3dmax中不同布線之后四邊面和頂點區別以及導入Unity3d之后轉換為三角面和頂點的情況,如下面兩圖所示。
從上面的圖示可見,不同的拓撲布線,模型的面數和頂點數是不一樣的,有童鞋會問,為什么要強調模型的頂點數呢?因為模型的面是由線構成的,線是由頂點構成的,與其說模型的面數太多造成的卡頓,不如說是由頂點太多造成的,有童鞋肯定不服,那我們就在自己熟悉的建模軟件中通過修改段數構造一個上千萬個面的茶壺,然后將所有面全部刪除,只留下頂點,我們會發現,即使沒有模型面,頂點太多一樣很卡的,也就是說真正的卡機其實就是由頂點引起的,所以在建模的時候,既要控制面數,也要控制頂點數,小姐姐用斜向布線就是讓多個三角面或四邊面共享頂點,以控制頂點的數量,下圖所示的物體,如果用實體建模,頂點和面數會過千,小姐姐只用了幾十個面和頂點。
有的童鞋對小姐姐推薦的最優化低面數精簡單面建模不以為然,也不服氣,來,小姐姐給你一些圖震撼一下,請看下面的圖。
上面這些低面數模型就是用最優化低面數精簡單面建模並配合后面要講的拆分UV1構建的超低面數模型,如果你是建模師,或者兼做建模,如果不掌握最優化低面數精簡單面建模,估計你做不了VR和游戲的模型,不是被后續的美工罵死,就是被老板開掉,如果自己做,場景卡頓會把自己氣死。
當然有的童鞋會說,就不用前面所說的單面建模,前面的窗戶牆可以用幾個box來堆,這樣也可以,問題是幾個box堆出來的牆體,表面積要比單面建模構建的物體表面積大很多,拆分UV2時,牆體的UV區塊只能縮小才能容納得下,這樣會降低烘焙質量。所以強烈建議采用最優化低面數精簡單面建模方法來構建模型,並應對所構建的模型的拓撲布線進行優化預處理,以進一步降低模型面數,根據物體造型需要的布線就說到這。
接下來說說根據材質需要的拓撲布線,當一個物體的不同面需要賦不同材質是,則需要在材質的交界處布線,這個大家容易理解。
當一個物體的材質相同,而不同面需要貼不同的貼圖時,也需要在貼圖的交界處布線來分割面。
對於根據物體的形變要求的布線,多見於曲面物體、異形物體、角色建模,在物體的轉彎或轉角處布線,這個也容易理解。
根據拆分UV2的要求的布線(如下圖所示),這個大家可能不太容易理解,小姐姐用一個大家生活中熟知例子來解釋,我們在炒菜時,經常要將菜切斷,如果不切斷,菜會架空炒鍋,使炒鍋很多空間白白浪費,理解了這個道理,那么就容易理解根據拆分UV2的要求布線的道理了,也就是當物體一些面的長寬比比較大時,需要在這些面適當布線,將這個面分割成長寬比較小的多個面,因為長寬比太大時,這些面被展平到UV空間中時,為了容納較長的邊,另一邊會變得很窄,也就是這些面在UV空間中呈現細長的形態,不僅自身寬度不足表現這些面的光影,還會使所有UV區塊密集在UV空間的一角,就像不切菜架空炒鍋一樣的道理,不利於UV區塊的均勻排列,使很多UV空間被白白浪費浪費,最后降低了烘焙質量。
上述的內牆布線既是拆分UV2的需要,也是建模時復制相同物體的需要,布線時能夠同時滿足多方面的需求是最好的選擇,正如一箭雙雕之說。這種布線會增加模型面數,但其數量是有限的。為了提高后續的烘焙質量,增加百十個面,不足為奇。
⑶. 重疊、隱藏面優化清理
無論使用實體建模,還是使用最優化低面數精簡單面建模,不可避免地會出現重疊和隱藏的模型面,下圖所示為重疊面,這樣的面在這個案例場景中很多,這里不可能一一標注出來,但是根據圖示,相信大家可以判斷還有哪些模型面屬於重疊面。這些面在實時運行時是不可見的,如果不刪除,會使場景的模型面數居高不下,有的童鞋認為有的重疊面很小,可以不用理會,這是錯誤的觀念,所有3d軟件對面的識別,無視其大小,所以這些面在建模過程中,應隨手刪除,尤其是在復制相同的物體之前就應該刪除,如果等到整個場景布局完了再刪除,工作量可就很可怕了!另外這些面如果不刪除,在后面要講的拆分UV1時,手工拆分的工作量會非常大,同時在拆分UV2時,這些無用的面被展平,會擠占很多UV空間,使真正有效的UV區塊縮小,會降低烘焙質量和延長烘焙時間。所以刪除重疊面是不容忽視的降低模型面數和提高烘焙質量及加速烘焙的重要因素,這也是很多童鞋場景面數降不下來、烘焙質量差和烘焙緩慢的秘密所在。
下圖所示為隱藏面,這些面不同於重疊面,雖然和別的模型面不重疊,但是在Unity3d作品實時運行時,從相機的高度看過去,這些面就像隱藏了一樣,根本看不到,這些面的存在,也不僅增加了場景的模型面數,也會為后面要講的拆分UV1增加工作量,同時這些面在拆分UV2時被展平,也會擠占了很多UV空間,使有效的模型面的展平UV區塊縮小,不僅降低了烘焙質量,也延緩了烘焙進程,所以這些面應在建模時及時刪除,也強烈建議在復制相同物體之前就刪除這些面,當然,有的模型在復制前,由於擺放位置因素,一些背面沒有靠牆或背靠別的物體,但是在復制后的另一位置,背面會靠牆或靠近別的物體,形成隱藏面,這些只有等復制后再刪除。刪除隱藏面也是很多童鞋場景面數降不下來、烘焙質量低、烘焙時間超長的的另一重要秘密。
還有一種隱藏面,是在通過復制一些物體構造另一些物體時,由於疏忽,未及時清除無用的面形成的,如下圖中面,是在通過復制有端面的牆體構造連續牆體時形成的,這種面如果不刪除,烘焙后牆體會產生黑縫,如下第二張圖所示,這種隱藏面的大量存在,不僅會增加很多模型面數,而且影響拆分UV2的速度,同時會降低烘焙會質量。
⑷. 材質、貼圖的優化預處理
Unity3d場景中的材質越多,負載越大,材質的貼圖越多、尺寸越大,負載也越大,因此應控制材質、貼圖的數量及貼圖的大小。Unity3d只支持各種3d建模軟件的標准材質和由標准材質生成的多層次及材質,不支持各種3D建模軟件的高級材質和Vary、MentalRay、FinalRender 、Brazil 等第三方渲染器的材質,所以用於Unity3d的模型,只需在各種3d建模軟件中用標准材質簡單貼圖區分出不同的材質即可,Unity3d有自己材質系統,絕不亞於第三方渲染器的效果。
下面我們來看看這個案例場景的材質和貼圖情況,下圖中紅線框標識的是場景中的材質的示例球,由圖可見,整個場景只用了兩個材質。
我們先來看看第一個材質(如下圖所示),這個材質使用的是3dmax的標准材質,只在固有色通道上貼了一張512x512的貼圖,而且這張貼圖比較特殊,以往大家所有的貼圖都是單一的紋理,而這張貼圖包含多個紋理和色塊。
上面那張貼圖中的部分紋理和色塊對應場景中物體的貼圖如下圖所示,看到這張貼圖,很多童鞋百思不得其解,平時都是用一張單一紋理通過重復貼圖來貼材質,這個貼圖里面這么多紋理,怎么貼到物體上的呢?的確,這種貼圖是不能直接貼到物體上,更不能使用重復貼圖,而是需要通過拆分UV來貼的,也就是俗稱的展UV,前面的其他例子中小姐姐講過拆分UV2,而這里的拆分UV是拆分UV1,UV2控制的是光影貼圖,UV1控制的是紋理貼圖,下面小姐姐用幾個例子來演示一下如何通過拆分UV1來給物體貼圖,需要說明的是,物體的貼圖是通過材質貼附到物體上的,貼圖不能直接貼到物體上。
按照下圖中的提示制作一個鍵盤物體(紅色物),然后將前面的第一個材質賦給這個物體,如下第二張圖所示,很顯然,材質的貼圖是不正確的,下面我們就通過拆分UV1(也稱展平UV1或展UV1)來為為鍵盤正確貼圖。
選中鍵盤物體,為其添加一個Unwrap UVW(展平UVW)編輯修改器,如下圖所示,然后點擊圖中的“打開UV編輯器”按鈕。
在彈出的UV編輯器(如下圖所示)中我們看到一個白線框,這個白線框是控制鍵盤物體貼圖對應UVW坐標,其形態也是一個box,這個白線框是box的俯視,頂面和底面重疊在一起,四條邊對應的是鍵盤的四個側面,因為貼圖是平面的,側面這樣放置是沒辦法貼的,所以得設法將側面展平,並將重疊的底面和頂面拉開。
要展平鍵盤物體的UV1,按下面圖示步驟操作,會自動展平所有面的UV。
自動展平后UV呈現為網格狀的面(如下圖所示),根據其形態我們大致可以斷定這些網格面對應鍵盤物體的哪些面,當這些面呈現網格狀時代表處於選中狀態,具體這些網格面對應鍵盤物體的哪個面,用鼠標點擊任意一個,場景中鍵盤物體的對應面會以紅色高亮顯示。
當用鼠標點擊這個UV編輯器中最下面的UV面時,場景中鍵盤物體的上面以紅色高亮顯示,說明這個UV面對應的是鍵盤物體的上面(如下圖所示)。
我們也可以反過來用鼠標點擊選擇場景中鍵盤物體上的面,UV編輯器中的與此物體面對應UV面也會以紅色高亮顯示,例如,當我們選擇鍵盤的左側面時,UV編輯器中第二個UV面以紅色高亮顯示,說明這個UV面與鍵盤左側面對應(如下圖所示)。
掌握了查找物體面和UV面的對應關系之后,現在我們按照下圖的提示把材質貼圖顯示出來。
接下來用鼠標框選前面展平的所有UV面,拖到黑線框外面,黑線框是截圖的范圍,如下圖所示。
接下來鼠標點選鍵盤上面對應的UV,將其拖動到鍵盤圖案的大致位置,如下圖所示。
然后將UV改成節點模式,使用移動、縮放工具,調整鍵盤物體上面UV的四個頂點到與貼圖中鍵盤圖案四個頂點大致重合,此時場景中鍵盤物體的上面應該正確顯示鍵盤貼圖,可是並無變化,還是錯亂的,這是什么問原因呢?這就是網上很多二貨經常提到的問題,也就是改變材質貼圖的UV,物體上的貼圖不變。
我們先來看下圖中標識的材質面板中貼圖的通道,通道值為1,也就是說這個材質上的貼圖在通道1上。再看下圖右下角展平UVW編輯器的UV控制通道。通道值為2,也就是說,這個展平UV修改器控制的貼圖通道是通道2,問題找到了吧?這不就是牛腿綁到馬胯上了嘛,要是有人還沒看懂的話,我就在解釋一下,也就是說UV編輯器中的UV控制的是通道2上的貼圖,而鍵盤物體的材質貼圖在貼圖通道1上,鍵盤物體的貼圖通道2上沒東西,自然材質貼圖是不會變化的。
接下來按下圖的提示,將展平UV修改器的通道值改為1。
嗒嗒嗒嗒,改為1后,鍵盤貼圖正確顯示了,如下圖所示。
接下來用節點模式把貼圖范圍之外剩下的UV調整為大致的正方形,然后把這些UV重疊在一起,如下面第二張圖所示。
然后將所有UV的四個頂點調整到對應重合,如下圖所示。
用面模式框選重疊在一起的所有UV,用縮放和移動工具將其調整到1行2列的色塊內(如下圖所示),因為這個色塊的顏色與鍵盤的顏色接近。
放大UV編輯視圖,將重疊在一起的UV調整到色塊以內,不能和相鄰的色塊相交,此時我們可以看到,鍵盤的剩余面都貼上了這個色塊的紋理,如下圖所示。
最后將鍵盤的展平UVW修改器塌陷,鍵盤的最終貼圖如下圖所示,至此,通過拆分UV1為鍵盤貼多紋理貼圖的過程就結束了。
接下來我們看看這個案例的的第二個材質,如下圖所示,很顯然,這個材質是用於掛畫的,貼圖中包含所有掛畫的紋理及畫框的紋理色塊。這個材質和第一個材質一樣,都是用的是3dmax的標准材質,也都是在固有色通道上貼了一張多紋理貼圖。
這個場景中的材質和貼圖方案,巧妙地減少了貼圖尺寸、貼圖數量和材質數量,大幅度地降低3d場景的內存消耗負擔,同時可加速Unity3d作品的實時運行。這種材質和貼圖策略,是在建模之前就精心規划好的,而非信手拈來。大家可以想想,如果把兩個材質貼圖中的色塊和紋理都搞成單獨的材質,與這種材質方案相比,孰優孰劣不言而喻,因此這種材質和貼圖策略值得大家借鑒。但是要應用這種材質貼圖方案,得事先精心規划,並且得掌握拆分UV的技術。
小姐姐之所以在這里插入拆分UV1的知識點,主要是為了讓大家了解這個案例中的材質及一張多紋理貼圖是如何貼到模型上的,希望大家理解。拆分UV1、UV2統稱為拆分UV,其實還有UV3…,UV8,總共8個通道,UV1是控制紋理貼圖的,UV2是控制光影圖的,還可以有控制高度圖、顏色圖、高光圖、法線圖的通道,拆分法線貼圖,就是傳說中的高模轉低模,總之,拆分UV是非常復雜的知識點,Maya、C4D、Modo等3d軟件都有這樣的概念。如果不了解拆分UV1,就沒辦法使用多紋理貼圖來優化材質,不了解拆分UV2,烘焙的光影圖一定是模糊和布滿臟斑等缺陷的。
⑸. 基於燈光的模型預處理
網上有經常有人問Unity3d光影烘焙之后,牆角、陰角、踢腳線的地方出現漏光或漏陰影的問題,那這到底是怎么形成的呢?我們還是用這個方案的模型來解釋,為了降低模型面數,所有VR和游戲引擎強烈建議使用最優化低面數精簡單面建模方法來構建場景,而且都是從展示相機的角度去考慮哪些模型面需要構建,哪些可以不用建,例如,下面的場景只是展示室內,沒有展示室外的需求,很多人用單面建模構建的這個場景,只建室內相機能看見的模型面,此時屋頂背面、內牆背面、地板背面
都是鏤空的,如下圖所示。
如果僅用點光源、面光源在室內布光,或用面光源從窗口向室內打光,這沒任何問題,因為室內是密閉的,可是常常為了增加GI效果,會開啟天光,什么是天光?天光是從無限大一個球體表面所有點沿球半徑方向向球心照射的光,因為屋頂背面、內牆背面、地板背面都是鏤空的,擋不住天光,使得天光穿牆而過,普照室內場景,烘焙后產生了錯亂的漏光或漏陰影,而且室內光影沒有任何層次,使用平行光亦是如此。因此在將模型導入Unity3d之前,應將單面建模鏤空的模型背面用簡單的模型面封閉起來,以阻止光線從不正確的洞口進入,應該讓光線從窗口和其他透光孔進入室內,然后經過多次反彈,產生的光影才有層次,這就是很多人烘焙的場景沒有層次的根源。對於這個案例的二層,構建一個簡單的外牆,露出窗口,擋住鏤空的內牆背面,以防光線穿牆而過,如下圖所示。
構建簡單的2層屋頂外面,就像鞋盒的蓋子一樣,蓋住鏤空的二層屋頂背面,以防天光和平行光從屋頂射入,切記要有一定的高度,以防與二層屋頂內表面重合,烘焙后出現花斑。
同理,為一層構建簡單的外牆,如下圖所示。
構建如下圖所示的模型面,用來擋住二層地板背面和一層屋頂的背面漏光,斷開的地方是玻璃幕牆,這里應該正確進光。
同理,為-1層構建簡單的外牆,這一層沒有窗戶,如下圖所示。
構建如下圖所示的模型面,用來擋住-層地板背面和-1層屋頂的背面漏光。
最后構建如下圖所示的模型面,用來擋住-1層地板背面的漏光。
通過構造以上的簡單模型面,將來自室外的光線全部堵住,只允許室外光線(天光、平行光和置於室外的其他燈光)從正常的洞口(窗口、天窗、門口、幕牆等實際透光口)進入,以產生有層次的光影效果,這些模型面越簡單越好,外形都是什么都可以,只要能把光線擋住即可,也不用為其設定專門的材質和貼圖,烘焙的時候分辨率可以設得很低,即使有烘焙臟斑、黑斑、甚至全黑都無所謂,因為從室內根本就看不見,如果是靜態燈光下的烘焙,甚至可以在烘焙完之后將其刪除,它的存在僅僅是在烘焙的時候能擋住非正常進入的光線而已。另外,大家從上面的圖示可以看到,門窗和玻璃幕牆似乎沒有玻璃,其實不然,這些玻璃正面是朝里的,或者說法線是朝里的,從里面看是有玻璃的,朝里的玻璃可以擋住室內投向室外的光,擋不住從室外入射的光,我們恰恰要的就是這個,請大家不要畫蛇添足,再加一個朝外的玻璃,如果加上朝外的玻璃,把室外光徹底就封死了,陽光和天光是不能入射的,如果真的要加朝外的玻璃,烘焙的時候將其隱藏,烘焙之后再顯示出來。有的童鞋會說,為什么不用玻璃材質讓朝外的玻璃透光,這是可以的,但問題就復雜了,所以按小姐姐說的做是沒錯的。
另外,室內的格柵燈,在Unity中可以直接將其設為發光材質,來模擬真實格柵燈的光照,如果將門玻、窗玻、幕牆玻設為發光的面光源來模擬大氣中粒子反射到室內的光線,這些玻璃烘焙之后再改為玻璃,光感和質感不好,所以我們可不將這些玻璃設為發光材質,而是在這些玻璃的背面構建一些與玻璃等大的面物體,並退后一些距離,然后設為發光材質,向室內投射面光源的光照來照射室內,絕對不能把這些面放在玻璃前面,否則會擋住玻璃的受光,如下圖所示,粉紅色的物體不用烘焙,且可在烘焙完之后刪除。
以上就是基於燈光的模型預處理,這些工作必須在導入unity3d之前完成。
⑹. 碰撞物優化預處理
無論您使用Unity3d開發VR,還是游戲,都會用到漫游相機,因為漫游相機是有重力因素的,為了防止相機自由落體或穿牆、穿物而過,場景中的物體(尤其是地面)必須設置碰撞物(也稱障礙物),具體設置如下圖所示,但是對於規模比較大的場景,每個物體都設置障礙物屬性,實時運行時的渲染運算負擔必然加劇,很可能造成卡頓。很多童鞋反映,自己的作品相機跑起來時快時慢,尤其在物體密集處,相機跟黏住了一樣,阻力非常大,在物體松散處,相機突然又運行快了,這種現象就是障礙物的實時運算造成的。
那上述問題如何解決呢?按照小姐姐的經驗,可在自己熟悉的3d建模軟件中,重新構建一個與原場景完全重合的低面數簡單模型(或者叫場景的簡化版本),如下圖所示,這個模型無需賦材質和貼圖,導入Unity3d后作為場景的替身,來接受障礙物識別運算,這樣,由於這個替身無材質無貼圖,,而且面數非常低,同時無需烘焙和實時渲染,所以可巧妙地解決因對原始場景龐大復雜的碰撞運算造成的卡頓,簡單地說,就是用一個無材質無貼圖不渲染的簡單幾何體取代材質和貼圖復雜且須實時渲染的眾多物體來檢測障礙物,實時運行立即就流暢很多,具體構造見下圖中提示。
模型導入Unity3d后,不要對復雜的場景物體勾選前面圖中的“產生障礙物”選項(如果場景復雜,勾選這一項之后,得耗時10幾分),而是對簡單的"替身"物體勾選“產生障礙物”選項,由於無材質無貼圖,而且模型簡單,幾秒鍾運算就結束了。
一個新的問題又來了,我們剛才在上面說過,設置“產生障礙物”得選中assets面板中的FBX文件,如下圖所示,而當我們選中FBX文件下的任一模型時,無“產生障礙物”的選項,如下第二張圖所示,由此可見設置障礙物是針對FBX文件的,如果將替身物體與場景模型一起從建模軟件導出,導入Unity3d后,無法對替身物體單獨設置“產生障礙物”,所以應將替身物體與場景其他模型分開,單獨導出成FBX文件,如果你習慣的建模軟件有“導出選擇的"功能,直接選擇替身物體,用這個功能導出FBX文件,然后反選,將剩下的場景物體導出成另一個FBX文件,這樣,導入Unity3d后,替身物體就可以單獨設置“產生障礙物”了,如果建模軟件物“導出選擇的”功能,就復制一個模型文件,得到兩個場景,一個保留場景模型,一個保留替身物體,這樣就可以分別導出FBX文件了。
”
前面提到替身物體無需渲染,聰明的童鞋會想到替身物體與場景模型完全重合,一定會閃面,沒錯,肯定會閃面的,所以小姐姐才提到無需渲染的設置,所謂的無需渲染,就是不讓這個物體實時顯示,下圖中替身物體和場景物體完全重合,鼠標一動就閃面,為了讓大家看到替身,按下面第二張圖提示關閉場景物體,場景中就顯示出了被掩蓋的替身物體。
接下來選中替身物體,然后按下圖提示取消“mesh Renderer”(實時渲染),就禁止了替身物體的實時渲染,也就是不在場景中顯示,但是會計算障礙物,然后將場景物體顯示出來,這樣就不再會因替身物體與場景物體重合而閃面了。
最后別忘了按下圖提示設置替身物體為障礙物,還需要說明一下,因為替身物體取消了實時渲染,無材質無貼圖,也不會產生陰影和接受光照,更不會被烘焙,所以不用在建模軟件中為其拆分UV1,UV2。
因為這個案例是室內場景,沒有室外展示的需求,也就是說相機會被圈在室內,所以替身物體只需構建出牆壁、屋頂、地板、門、樓梯和室內物體即可,需要強調的是,牆壁、屋頂、地板的法線必須朝里,但如果是室外場景或兼有室外場景,還需構造室外部分,了解了上面替身物體的構造,相信大家也就會構造室外的替身了,替身可以合並為一個物體,也可以是多個物體,所有替身應力求精簡。
到這里,還需向小白強調一點,建模軟件同一個場景中分批導出的多個FBX文件,要將它們從assets面板加載到Unity3d場景中,應該用鼠標將他們從assets面板逐一或一起直接拖入層級(Hierarchy)面板,如下面第一張圖所示,這樣這些FBX文件中的所有模型會按建模軟件中的位置對齊,或者說是保留建模軟件中各自的相對位置,這樣操作,Unity3d會將FBX文件的坐標原點與Unity的坐標原點重合對齊,因為建模軟件同一場景分批導出的FBX文件,具有相同的坐標原點,所以拖入層級面板,所有FBX文件的模型會自動按建模軟件中的相對位置放置。但如果是直接將FBX文件拖入Unity3d的場景視圖,如下面第二張圖所示,Unity3d就會忽略坐標因素,鼠標拖在哪,就將FBX模型放在哪,這樣就很難將模型按3d軟件中的位置對齊,這種方式適用於從外部導入一個和其他FBX無關的模型放置,主要靠目測調整位置。這是兩種不同的加載模型方式,希望大家好好想想兩者的區別。
⑺. 拆分UV2
由於Unity3d拆分UV2的功能有致命缺陷,所以強烈建議大家使用自己熟悉的3d建模軟件拆分(展平)光影貼圖的貼圖坐標,即拆分UV2,這一工作應在模型導入Unity3d之前完成,拆分的UV1、UV2都會保存在各類建模軟件導出的FBX模型中,導入Unity3d后會被自動識別的。VR和游戲引擎的烘焙,其本質是將所有面所接受的光影渲染到與其對應的展平UV區塊上,多個UV區排列成一個光照UV,將光照按照光照UV的排列渲染之后,生成一個光照貼圖,最后將光照貼圖按照光照UV的關系回貼到對應的模型面上。之所以稱之為烘焙,是因為物體上的光影就像烤面包時火的蹤跡被烘焙到面包上一樣,長在了物體上而得名,如果還不理解,我們可以設想為夏天穿背心和涼鞋,太陽的光照被保留在了皮膚上一樣。拆分UV2就是將場景中所有或部分模型面,全部攤平(也就是展平),類似於前面所講的拆分UV1,只不過拆分UV2,展平是為了渲染光照,而不是像UV1一樣展平是為了貼材質貼圖。拆分UV2之前,前面所有的預處理工作必須完成,因為一旦改變模型,拆分好的UV2就失效了,必須重新拆分,所以拆分UV2前,得把所有的前置預處理都做好,因為拆分UV2,不是一鍵就能搞定的,得花些時間,一個UV2拆分幾個小時也是有的事,甚至有的人的機器配置太差,拆分幾天也是可能的,按照小姐姐視頻教程中的方法,幾分鍾即可完成一個UV2的拆分。
因為拆分UV2是在建模軟件中的最后一道工序了,此時我們需要對整個場景進行一下整理編組,一方面是為場景導入Unity3d后易於管理模型,另一方面是為了便於拆分UV2,因為UV2可以按照編組拆分,如果一個物體一個物體拆分,不僅過於零碎,而且工作量太大,所以還是打組后拆分。
我們先將整個場景顯示出來(如下圖所示),如果你的機器太low,只要關系清楚,也可不全部顯示出來,而是一部分一部分顯示出來操作。
首先我們選中4個橙色的物體和三層的外牆皮選中編成一組,並用拼音命名為“zheng_guang_ban”,就是遮光板,前面我們說過,這些物體主要是在Unity3d中烘焙時用來擋光的,雖然最終的作品是看不到這些面的,但是要想讓這些物體有遮光性,就必須被烘焙,要烘焙就得有光照UV,也就是得拆分UV2,因為他們並不重要,所以可以烘焙的很小,分辨率設為512或256,甚至設為128,反正只是為擋光,烘焙質量好壞都無所謂,最后將分辨率的值加在編組名之后,以便在Unity中識別,這里小姐姐就設置這個組的分辨率為256x256。需要說明一下,橙色的遮光板為三個獨立的物體(poly),三層的外牆皮均為一個編組,編組的時候允許組嵌套,這不會影響拆分UV2,編組是為選擇和管理方便,拆分的時候會忽視組的存在,對單獨的物體逐一拆分。編組完畢,隱藏這個組。
接下來選中場景中綠色的物體,如下圖所示,這個物體和三層樓的內部及所有室內物件完全重合,是用來在Unity3d中作場景的替身的,無材質無貼圖,無需烘焙,所以也無需拆分,雖然它是單獨的物體,你也可以是多個物體,我們也打個組吧,編組命名為“ti_shen”,這里說一下,小姐姐命名用下划線將拼音隔開,是為了大家拼讀,有的人不知道是英語不好,還是英文不好,見了字母就發蒙,所以建議這樣命名,以便后續美工或程序識別。這個編組不用拆分和烘焙,所以編組名后面就不加分辨率的數值了,編組完隱藏這個組。
接下來選中1,2層內窗玻、門內玻、幕牆內玻后面紅色的面,如下圖所示,當時我們構造這些面,是想導入Unity3d后為其設置發光材質,用來模擬大氣粒子從這些洞口反射到室內的光照,有些童鞋會說,Unity3d有面光源,為什么要多此一舉呢?這是因為在建模軟件中物體的定位很容易,如果用unity3d的面光源來模擬,需要給每個洞口放置面光源,一個一個擺放,數量太多,加上unity3d的模型面是按三角面處理的,線太多,視覺干擾嚴重,面光源定位不方便,所以小姐姐直接在建模軟件中構造這些面來代替Unity3d的面光源。
我們將這些面編組,並命名“win_light”,因為這些面最終是不可見的,僅僅只是用來發光,就像Unity3d的其他光源一樣,無需烘焙,所以也無需拆分UV2,所以在編組名稱中我們就不用標識分辨率了,烘焙完可以將這些面刪除。我們在編組名稱后添加UV分辨率,一方面是為了識別哪些編組需要拆分UV2,另一方面確定這個編組拆分多大的分辨率,當然更重要的是進入Unity3d之后,根據這個標識設定烘焙時光照貼圖的分辨率,也就是作備注的作用,分辨率的大小,這個得通過反復實踐來總結經驗,就像燒菜時的每個調味應該添加多少一樣,得動手實踐才能准確把握。
到這里有的童鞋一定會問,為什么不把屋頂的格柵燈也加進來,它不是也是要發光的嗎,是的,但是格柵燈的發光面既要發光,而且還要可見,小姐姐想直接用格柵燈的面來發光,所以需要拆分UV2和烘焙,小姐姐沒把它們加入這個編組,是想通過這個場景中的兩個材質之一的通道在Unity3d的材質中玩出發光體,后面大家注意仔細看。
接下來我們選中樓梯間的所有物體,如下圖所示,編組為“lou_ti_jian_2014”,設定拆分UV2的分辨率為1024,小姐姐之所以用拼音或英文命名,是為了防止亂碼,雖然Unity現在支持中文了,但是一些地方不夠徹底,所以還是建議用拼音會英文命名,用下划線分隔,是為了后續的美工和程序便於識別。編組完隱藏這個組。
下面我們選中二層的所有物體編個大組,如下圖所示,編組為“2_ceng”,不設定分辨率,編這個組是為了讓二層的所有物體在Unity3d中好管理,把所有物體打包在一起。
接下來打開剛編的“2_ceng”組,選中其中的所有內牆、門、窗、隔斷、插座,編組為"2_ceng_nei_qiang_2048",這些物體表面積最大,所以設定分辨率為2048。
然后選中“2_ceng”組里的所有家具,編組為"2_ceng_jia_ju_2048",如下圖所示,這些物體表面積也很大,所以設定分辨率為2048。這里的分辨率只是個表示,拆分UV2的時候會用到。
接下來選中“2_ceng”組里的所有窗簾,編組為"2_ceng_chuang_lian_1024",如下圖所示,這些物體表面積不是很大,所以設定分辨率為1024。
然后選中“2_ceng”組里的所有壁畫,編組為"2_ceng_bi_hua_512",如下圖所示,這些物體表面積比較小,所以設定分辨率為512。
繼續選中“2_ceng”組里的所有地板,編組為"2_ceng_di_ban_1024",如下圖所示,這些物體表面積稍大,所以設定分辨率為1024。有的童鞋會問,你這地板為什么要一塊一塊拼,咋不做成一個面,用重復材質貼圖重復帖呢,沒錯,可以這樣做,但是這個案例是給大家演示用最少的材質和貼圖優化場景,地板紋理和別的紋理共用了一張貼圖,沒法重復,只能重復模型,而且地板的重復數量有限,所以不會對場景造成太大的壓力,可以通過展平UV1,將所有地板的UV1重疊在一起,套合在貼圖的地板紋理上,這是另一種貼圖方式。
再選中“2_ceng”組里的所吊頂和格柵燈的邊框,編組為"2_ceng_diao_ding_1024",如下圖所示,這些物體和地板情況相當,所以也設定分辨率為1024。
最后選中“2_ceng”組里的所吊格柵燈的燈片,編組為"2_ceng_ge_shan_deng_1024",如下圖所示,這些物體的表面積較小,所以也設定分辨率為512。
到這里“2_ceng”組里的所有物體就整理編組完了,然后關閉“2_ceng”編組,如下圖所示。之所以嵌套編組,是為了縮短Unity3d中層級面板的樹形管理結構,否則導入Unity3d后,物體很多,層級面板拉上來拉下去,半邊找不到要找的物體,所以才按關系分級編組管理。
同理,將1層和-1層里的所有物體分別編大組為“1_Ceng”和“-1_ceng”,然后分別將這兩個大組里的物體和2層一樣再編組。
所有的整編工作結束,我們就可以拆分UV2了,小姐姐之所以把編組和拆分分開,是為了讓大家把關系看清楚。
下面下來拆分遮光板的編組,選中“zhe_guang_ban_256”編組,然后隔離(當然也可以不隔離),設置目標通道設為2,因為通道2是光照貼圖通道,設置分辨率為256x256,拆分的結果如下第二張圖中所示,因為這個組中的物體只是為擋光,分辨率低些無所謂,之前說過,這些物體最后在相機視圖中是看不見的,質量差無關緊要。
選中“lou_ti_jian_1024”編組,設置分辨率為1024x1024,拆分的結果如下圖中所示。
接下來打開編組“2_ceng”,選中其中的“2_ceng_nei_qiang_2048”編組,設置分辨率為2048x2048,拆分的結果如下圖中所示。
選中編組“2_ceng”中的“2_ceng_nei_qiang_2048”編組,設置分辨率為2048x2048,這個編組物體的面很多,拆分UV2花費的時間比較長,耗時4分鍾,當然有的人的機器太差或拆分方法不當,很可能會拆分幾十分鍾或幾個小時,甚至會耗時幾天,拆分的結果如下圖中所示。
接下來選中編組“2_ceng”中的“2_ceng_chuang_lian_1024”編組,設置分辨率為024x1024,拆分的結果如下圖中所示。
再選中編組“2_ceng”中的“2_ceng_bi_hua_512”編組,設置分辨率為512x512,拆分的結果如下圖中所示。
接下來再選中編組“2_ceng”中的“2_ceng_di_ban_1024”編組,設置分辨率為1024x1024,拆分的結果如下圖中所示。
再選中編組“2_ceng”中的“2_ceng_diao_ding_1024”編組,設置分辨率為1024x1024,拆分的結果如下圖中所示。
最后選中編組“2_ceng”中的“2_ceng_ge_shan_deng_512”編組,設置分辨率為512x512,拆分的結果如下圖中所示。
至此編組“2_ceng”中的物體就拆分完了,然后關閉編組“2_ceng”。以此類推,依次拆分編組“1_ceng”和“-1_ceng”中二級編組中的物體。
從小姐姐拆分的UV2可見,每個光照UV中的UV區塊都均勻排列,並充分有效地利用了所有UV空間,而Unity3d的UV2拆分常常將所有UV區塊密集在UV空間的一角,如下圖所示,右下角的小窗口是2048x2048光照貼圖的范圍,而Unity3d拆分的UV2全部聚集在小窗口左下角的紅線范圍內,使大量的UV空間白白浪費,導致實際得到的光照UV很小,烘焙后的光照圖很虛、很臟,而且伴有亮光、白斑、黑斑、硬邊、撕裂、破面等缺陷。讓光照UV充滿整個UV空間很難把握,所以強烈建議大家放棄Unity3d的UV2拆分功能,用自己熟悉的建模軟件來拆分UV2才是正確的選擇。
拆分完所有的物體,全部模型階段的預處理就結束了,然后將場景從建模軟件中導出,導出時一定記得將替身物體和場景的其他物體分開導出,因前面已經說過,要在Unity中對替身物體單獨設置“生成障礙物”,就得單獨導出FBX。導出前創建一個文件夾,將FBX文件保存在這個文件夾中,然后將場景中引用的所有貼圖的文件夾復制到這個文件夾中,最后將這個文件夾拷貝給美工(以防貼圖丟失,當導入Unity3d時,如果找不到貼圖,會在FBX文件附近的文件夾中搜索)進行場景烘焙和后處理。需要說明的是,以上的預處理小姐姐是拆開來講的,這僅僅是詮釋知識的一種方式,了解了這些預處理,一些可以在建模過程中隨手完成,無需等到模型建完再來處理。作為建模師,雖然不參與美工,但了解后續美工的工作流程,對於構建符合VR和游戲實際項目要求和零返工的場景是非常重要的。
3. Unity3d場景搭建
將建模軟件導出的FBX場景和替身文件導入Unity3d的Assets面板,如下圖所示,然后加載建模軟件中的材質和貼圖,最后將兩個FBX文件拖入層級面板。
從下圖紅線框處看到,建模軟件中的編組被正確傳遞過來,展開每個編組,里面的二級編組和標記的分辨率數值也都保留了,所以為了管理方便,應養成在建模軟件中對模型進行整編的習慣。
選中層級面板中的替身(tishen)物體,按下圖提示禁止替身物體的實時渲染,解決替身物體與場景物體的重疊閃面。
接下來選擇Assets面板中的替身物體的FBX文件,按下圖提示勾選“generate colliders”,讓替身物體成為障礙物,也可暫時不勾選,等到架設漫游相機時再勾選。
3. Unity3d燈光布設
Unity3d的燈光布設和其他3d渲染一樣,需要根據場景所要表現的時分來確定,例如黎明、朝晨、正午、午后、傍晚、初夜,本案例為一個室內場景,下面針對這幾個時分進行燈光的布設討論。
⑴. 黎明
黎明就是天剛朦朦放亮時分,室內燈光尚未開啟,窗口依稀可見微弱的天光,室內物體只見模糊的輪廓,因此只需用環境光或者在窗口布設面光源向室內打光,當然也可用環境光和面光源同時來模擬天光。
用環境光模擬天光可按下圖所示為環境光設置天空盒和微弱的光強度。
用面光源模擬天光可按下圖所示在所有洞口(窗口、門口、幕牆)布設面光源,或者用建模軟件在所有洞口構建替代面光源的幾何面,然后在unity中給這些幾何面設置發光材質,詳見烘焙部分。
⑵. 朝晨
朝晨時分,陽光溫和,光線斜射到靠近窗口的房間,室內物體棱角清晰,並有明顯的陰影,另外,這個時分還未上班,室內燈光還未開啟,因此可用平行光作為主光源來模擬太陽,並以環境光和窗口的面光源為輔助光照亮室內陰暗的地方,效果詳見場景烘焙部分。
⑶. 正午
正午時分,陽光充足,光線以較大的角度投射到房間,如下圖所示,此時室內燈光已開啟,因此用平行光作為主光源來模擬太陽,燈光強度較大,環境光和窗口的面光源以及室內格柵燈的面光源作為輔助光照亮室內陰暗的地方,因為面光源的效果只有烘焙之后才可見,所以詳見下文烘焙部分。
⑷. 午后
午后時分,陽光漸弱,投射角度慢慢變小,依然用平行光作為主光源,燈光強度降低,環境光和窗口的面光源以及室內格柵燈的面光源作為輔助光照亮室內陰暗的地方,布光如下圖所示,效果見下文烘焙部分。
⑸. 傍晚
傍晚時分,夕陽即將西下,陽光很微弱,投射角度很小,室內格柵燈的面光源作為主光源照亮室內,平行光模擬的太陽光、環境光和窗口的面光源作為輔助光向室內投射微弱的光線,詳見下文烘焙部分
⑹. 初夜
初夜時分,華燈初上,窗外微弱的月光和燈火投向窗口的房間,此時辦公室在加班,所以用格柵燈的面光源作為主光源照亮室內,用平行光模擬的月光、環境光和窗口的面光源模擬的室外燈火作為輔助光向室內投射微弱的光線,詳見下文場景烘焙部分。
3. 場景烘焙
下面小姐姐根據上文和大家討論的布光方法,對本案例分別進行六個時分的烘焙,為了不讓每個時分的設置相互覆蓋,我們可以將每個時段保存為一個場景,保存之前,我們得先做一些公共的設置,也就是每個場景共同的設置,這樣就不用每個場景重復設置,需要時只需修改參數即可。
首先我們來設置環境光,所謂環境光就是大氣粒子、建築、樹木、石頭等自然界的物體接受太陽光后漫反射的光。對於一個特定的受光物體,除了直接接受太陽光照外,也會受到周圍物體漫反射光的照射,但有時僅受環境光的照射,例如陰天的物體就不受太陽光的直接照射。Unity為了模擬自然界真實的光照,引入了環境光,環境光被集成在Unity3d的光照面板中,下圖所示,環境光的設置包括環境光來源、環境光的強度和環境光的模式。
環境光來源是指以哪種方式模擬環境光,包括三種方式(如下圖所示):天空盒、漸變色、固定色,漸變色和固定色基本不常用,一般只用天空盒來模擬環境光,所以這里只討論天空盒,所謂天空盒就是用特殊方法構造的天穹和環境。
當選擇天空盒(skybox)方式時,環境光就用上面與天空盒材質鏈接的天空盒產生環境光了,如下圖所示,也就是說天空盒實際上是一種特殊材質,這個材質上貼着天空盒貼圖,那么這個天空盒材質是哪兒來的呢?其實就是個材質而已,只不過和平時的Unity3d材質有所不同,下面我們就來定義一下這個材質。
自定義天空盒材質,只需在assets面板中用鼠標右鍵點擊,在彈出的菜單中按下圖所示創建一個材質,然后給新建的材質命名,隨便叫什么,如“aaa”或“abc”,只要便於識別,這里就命名為“skybox_mtl”,然后選中這個材質,按下圖所示的提示選擇skybox下的cubemap,此時這個材質不再是普通的材質,而是具有天空盒性質的材質了。
選擇skybox下的cubemap之后,還需要為這個材質鏈接一個Cubemap貼圖才能成為真正的天空盒,如下圖所示。
找一張適合制作Cubemap的全景圖像,導入Unity3d,然后選中這張圖像,按下圖提示將這張圖像的紋理外形的下拉框展開,將紋理外形由默認的2D改為Cube,然后點擊右下角的應用按鈕“apply”,Unity會將這張圖像轉換為Cubemap了,如下圖所示。
再重新選擇天空盒材質,然后按下圖所示,將剛轉換的Cubemap貼圖拖到天空盒材質的Cubemap貼圖里,這樣一個完整的天空盒就鏈接到了環境光,也就是這個天空盒可以模擬真實環境的光照了。
現在來看看天空盒到底是什么樣子,隱掉場景模型之后就可以看到,如下圖所示。
下面兩圖是相機旋轉到另外兩個角度時天空盒的截圖。
這個天空盒比Unity3d默認的藍色天空的天空盒生動、自然的多,天空盒的作用不僅僅只是產生環境光、還用於構造室外環境和反射環境,有童鞋一定會質疑,就是一張圖怎么會產生環境光呢?好,小姐姐下面給大家演示一下天空盒是不是真的會產生環境光照。為了讓大家看清楚天空盒的光照效果,我們創建一個簡單的立方體,然后左右旋轉天空盒,來看立方體表面的光照變化,下圖是0度時的光照。
下圖是天空盒在24度時的光照情況。
下圖是天空盒在66度時的光照情況。
下圖是天空盒在312度時的光照情況。大家對比一下四張圖,看看天空盒有沒有產生光照,小姐姐剛才是通過旋轉天空盒讓大家觀察物體的光照變化,其實我們可以反過來想,是不是可以認為,處於場景不同角度的模型面,光照是不一樣的呢?確實是這樣,所以天空盒被很多3d軟件引用來模擬環境光照。
認識到天空盒可以產生光照的事實后,可調整下圖中的參數來改變天空盒,大家自己調整試試看。
如果需要,可多創建幾個天空盒材質,每個材質鏈接不同的天空盒貼圖,當然也可以只創建一個天空盒材質,為其鏈接不同的天空盒貼圖,來滿足場景環境光照的不同使用要求。
下圖是使用天空盒作為環境光渲染的汽車效果,由下圖可見,汽車車身的細節在環境光的照射下補充了主光源的不足,對表現一些細小復雜的結構非常重要,另外,天空盒又模擬真實環境,為汽車車體的高光反射提供了反射源,使反射更真實,質感超好,同時天空盒避免了不必要的環境建模。這就是小姐姐在前面提到的天空盒的三個功效:環境光源、反射源、營造環境。這種天空盒的效果,是Unity3d默認天空盒所不能不及的。Unity3d asset store里的天空盒也基本都是些天空,非常生硬,有些童鞋自己用全景圖制作天空盒,不是有縫,就是會擠壓變形,小姐姐會為支持《Unity模型預處理布光烘焙后處理特效美工場景優化實戰視頻教程》的童鞋無償提供自己精心制作的8k高精度超漂亮天空盒資源,導入即可使用。對於本案例,這個天空盒一方面作為環境光來模擬真實的環境光,另一方面作為室外環境來襯托場景,站在窗口觀察,看上去很自然,並能和場景融為一體。對於天空盒作為反射源的作用,因為本案例是室內場景,所以沒有意義,我們后面會用反射探測器來為室內物體提供反射源。如果沒有這樣的天空盒,會讓人感覺場景孤零零的,象建在荒郊野外一樣的感覺,所以為不同的場景搭配恰當適宜的天空盒非常重要。
這種天空盒可以使用普通的全景圖來作,但小姐姐強烈建議大家最好使用HDRI格式(高動態范圍圖像)的全景圖制作天空盒,這種格式的圖像,光照效果更好,也是一種流行的光照圖像格式。
天空盒除了前面的圖像模式,還有unity3d默認的藍天的那種模式,很多童鞋有時想修改默認的天空盒,但總是找不到修改的地方,這種模式就是程序模式,當按下圖的提示選擇skybox下的procedural(程序模式)時,我們發現天空盒變成了默認的那種。
當滑動程序模式下天空盒材質的大氣層厚度時,大家會發現天空盒發生了變化,反正我不喜歡這種模式的天空盒,而且這種用處不大,如果願意用這種天空盒,可以自己研究一下。
為了讓大家搞清楚環境光和產生環境光的天空盒,小姐姐用了很多的篇幅,繞了一圈之后,我們還是回到本案例環境光的公共設置,具體設置如下圖所示。
接下來我們設置一下每個窗口面光源的光照,前面小姐姐說過,Unity3d的物體定位不方便,在每個窗口布設面光源太費時間,而且太多的面光源烘焙渲染非常耗時,所以前面小姐姐在建模軟件中為每個窗口構造了一個幾何面,然后在Unity中為這些幾何面設置發光材質來取代面光源的光照,貼賦了發光材質物體光照的烘焙要比面光源的光照的烘焙快很多。
創建一個材質,這個材質將用於每個窗口替代面光源的幾何面,命名為win_light,按下圖所示勾選自發光材質,並設置發光強度為2。
選中1、2層窗口構造的要發光的幾何面,按下圖所示將創建的發光材質鏈接到要發光幾何面的材質組件,也就是將發光材質賦給這些幾何面,這時這些幾何面就成了發光體,烘焙時就會像面光源一樣產生光照,需要注意的是,發光體和面光源一樣,產生的光照在實時狀態下是沒效果的,只有烘焙之后才可見光效。
再創建一個材質,命名為loutijian_light,這個材質將用於樓梯間要發光的幾何面,按下圖所示設置發光強度為0.5,由於樓梯間的發光幾何面有多個模型面組成,如果和剛才一樣將發光強度設為2,烘焙時相當於有多個發光面,樓梯間的光線會比窗口亮,這不符合實際情況,所以這里將發光強度適當降低一些,綜合光照效果就會和窗口相當了。
選中幕牆要發光的幾何面,按下圖所示將剛創建的發光材質賦給幕牆的發光面,這樣這些幾何面在烘焙時就會產生光照了。
之所以為窗口和幕牆獨立創建發光材質,是為了分別給兩者設置不同的發光強度。
接下來我們為每層屋頂格柵燈的幾何面設置發光材質,並命名為geshandeng_light,然后設置發光強度為1,如下圖所示。
接下來選中三層的所有格柵燈幾何面,將剛創建的材質賦給這些幾何面,如下圖所示。
接下來創建平行光來模擬太陽光或月光,因為Unity默認已經創建了一盞平行光,所以我們直接利用即可。
因為辦公室的一些桌上有台燈,這些台燈物體不會發光,所以還得為這些台燈創建一些點光源,當然不一定要為每個台燈都要創建點光源,因為點光源的渲染烘焙非常耗時,所以適當點綴即可。
按下圖所示,創建一盞點光源,將其位置調整到靠近台燈燈頭的下面,切記不要被封死到燈頭里,否則看不到點光源的光效。點光源有一個調整衰減范圍的幾個球,上面有幾個把手,拖動可調整點光源的衰減范圍,台燈的光照范圍有限,這個衰減范圍就是控制光照范圍的,也就是點光源從中心開始沿半徑向外逐漸衰減為0,衰減范圍之外,不會照亮物體,如果開啟陰影,衰減范圍之外自然也不會有物體的陰影。
同法泡制,為需要光照的台燈物體創建點光源,如下圖所示。
最后為每個房間創建一個反射探測器,用於烘焙光影時采集每個房間的反射環境,有童鞋一定會想,為什么不直接給每層創建一個反射探測器,而要給每個房間創建一個反射探測器呢,我們可以這樣來想,如果給每層創建一個反射探測器,那么在某個小房間的反射物體上會映射距離這個房間很遠的房間的物體,這是不符合實際反射的,因此應將反射探測器限制在每個房間。
如果不在公共設置部分創建好反射探測器,等復制出六個場景后,創建反射探測器的工作量會非常大的。
接下來我們就按下圖所示創建一個反射探測器(Reflection Probe)。
反射探測器的默認空間形態為一個立方體線框(如下圖所示),立方體的體心有一個探測器中心(如下第二張圖所示)。
反射探測器在Unity場景中的位置如何調整大家都懂得,這里就不說了,其大小可按下圖所示來調整。
反射探測器中心的位置可按下圖所示來調整。移動反射探測中心和移動反射探測器不是一回事,每個反射探測器的中心應盡量置於反射探測器的體中心位置,當調整反射探測器大小時,中心就會偏移,所以需要對其進行調整。
有了上面這些知識的鋪墊,我們就可以為每個房間創建反射探測器了。首先我們先來做一個房間的,如下圖所示,將前面創建的反射探測器移動到二層的一個房間的大致位置,然后用反射探測器的編輯工具將反射探測器的6個面調整到完全包絡這個房間所有物體。
然后再將探測中心調整到反射探測器體中心位置,如下圖所示,這樣這個房子的反射探測器就搞定了。
以此類推,按照上面的方法為所有房間創建反射他測器,如下圖所示。需要注意的是,如果某個房間沒有反射材質的物體,就不用創建反射探測器了。
接下來我們按下圖所示為在建模軟件中編組的帶有分辨率數值且按這個數值在建模軟件中拆分UV2的物體組設置參數,由下圖可見,層級面板中物體組的命名完全和建模軟件中一樣,之所以在建模軟件中打組時給需要拆分的UV2的物體組名稱后面標注分辨率,就是為了在這里設置時提示,否則到這里把建模軟件中拆分時的分辨率數值全忘了。
按照上面的步驟同法泡制,對層級面板中所有標注分辨率數值的物體組逐一進行參數設置,這樣在烘焙時,所有物體組就都會按照建模軟件中拆分的優質UV2進行高質量烘焙了。如果機器配置太low,或場景規模太大,就得分批次烘焙,選中哪些物體組,就會只烘焙哪些物體組。當然,如果想快速測試一下場景的燈光效果,就得分批次烘焙,也就是只選擇一個或幾個需要測試光影效果的物體來烘焙,否則就得花很長時間等所有物體烘焙完才能看到大致的效果。
至此,所有的公共設置就完成了,現在我們將案例的場景名修改為bgcj_lm(lm代表黎明),如下圖所示。
等黎明時分的場景烘焙完之后,我們再將bgcj_lm另存為bgcj_zc(朝晨),如下圖所示,這樣我們可按照時間順序,讓后一個時分的場景設置在前一個時分的基礎上修改,避免一些重復設置。
以此類推,當前一個時分烘焙完成,依次將場景分別另存為bgcj_zw(正午)、bgcj_wh(午后)、bgcj_bw(傍晚)、bgcj_cy(初夜),這樣我們就可以一個跟一個,最后得到了對應6個時分的6個場景,如下圖所示,這樣做的目的一方面是讓后一個時分的場景能在前一個時分場景基礎上修改,另一個方面是能讓每個時分的設置相互獨立,避免相互覆蓋,全部烘焙完成后的場景文件如下圖所示。
⑴. 黎明時分的光影烘焙
打開前面另存為bgcj_lm的場景,因為黎明時分是沒有陽光的,所以可以關閉平行光,如下圖所示。
黎明時分台燈也是不可能開的,所以關閉所有點光源,如下圖所示。
黎明時分所有格柵燈也是不可能開的,所以關閉所有格柵燈發光面材質的發光,如下圖所示。
在前面的燈光布設部分小姐姐提到,黎明時分可以用環境光或者在窗口構造的發光面來產生光照,那么我們現在就先用環境光來照亮場景,暫時關閉窗口的發光面,如下圖所示。
前面小姐姐和大家討論的環境光一般用天空盒來產生光照,對於黎明時分,天空盒的光照強度比較低,所以應該降低環境光的強度到0.5,如下圖所示。當我們拖動環境光強度的滑桿時,場景中環境光照的亮度會發生變化。
環境光除了光照強度,還有光照顏色的因素,環境光的顏色是由天空盒決定的,所以選中天空盒材質,將天空盒的色調調為深藍色(如下圖所示)。黎明天剛蒙蒙亮時,天光的顏色就是深藍色,在天光照射下,室外環境也呈現深藍色。(有童鞋可能會問天空為什么總會和藍色有關呢,例如黎明天空是深藍色,晴朗的白天天空是淡藍色,還有遠處的山為什么也是蒼藍色、海水也是藍色,這是因為在物理學中,藍色光的波長最長,傳的最遠,所以最遠的東西,只有藍色光會被人們的肉眼所感知,所以會呈現藍色)。
調整天空盒的色調后,我們發現天空盒還是太亮,此時可以降低天空盒的曝光度,其實就是天空盒的亮度,將曝光度降至0.4,如下圖所示,天空盒的顏色基本符合黎明時分了,但是我們發現,雖然曝光度降低了,可是天空盒的貼圖上有一個明顯的太陽,太亮,如果從窗口看出去,這不符合黎明的氣氛,所以天空盒得換一個沒有明顯亮光的貼圖。
將天空盒換成如下圖所示的貼圖之后,既消除了上面天空盒中太亮的太陽,而且看上去更符合黎明的室外環境和天空氣氛,那么我們就用這個天空盒來照亮黎明時分的場景。這里需要說明一下天空盒的曝光度和環境光強度的關系,曝光度控制天空盒的亮度,這個大家調整滑桿就可以看到天空盒的變化,曝光度還控制着環境光的光照強度,當滑動曝光度滑桿時看不到場景中環境光的變化,但是確實會影響環境光的,只是只有烘焙后才能看到效果,大家可以自己試試看,既然曝光度和環境光的強度都影響環境光的光照,那么兩者到底有什么關系呢?環境光的光照是來自天空盒,曝光度可以理解為天空盒光照的總閥,環境光強度可以理解為環境光的終端閥,也就是說光強度再大,曝光度比較低,實際光照也會很低,反過來,曝光度再大,光強度很低,實際光照也很低,就像家里水表前的閥門和水龍頭的關系,也就是說,在給定天空盒曝光度的情況下,環境光強度越小,環境光照越弱,反之,調大環境光強度,環境光照越強。而在給定環境光強度的情況下,天空盒的曝光度調小,環境光照越弱,反之,如果調大天空盒的曝光度,環境光照越強。環境光的曝光度一般根據天氣或時間段的情況來調整,比如黎明時分,天空盒的曝光度就得降得很低,正午時分天空盒的曝光度得調大或保持默認值,希望大家正確理解。
環境光設置好后,接下來按照下面的圖示(紅線標注)設置較低的烘焙參數,先來測試黎明時分場景的光影。使用較低的參數是為了用最短的時間烘焙出結果,大致瀏覽一下燈光的光照情況。
接下來僅選擇層級面板中2層的所有物體群組、樓梯間群組、遮光板群組(即后綴帶有烘焙分辨率數值的群組),然后點擊光照面板右下角的“Generate”按鈕,Unity就開始烘焙只選擇的物體,如下圖所示。
用上面設置的參數烘焙選擇的物體,耗時7分鍾33秒,光感還行,就是質量太差,如下圖所示。
接下來我們按照下圖所示,提高參數設置,重新烘焙。
按照上面的參數重新烘焙,耗時11分17秒,烘焙結果如下幾張圖所示。由圖可見,僅在環境光(hdri天空盒)的照射下,房間的窗口附近產生了非常漂亮的光效,雖然光線暗淡,室內物體模糊,但層次還是分明的,這是符合黎明(天蒙蒙亮)時分光照的。
上面我們是單獨用環境光照射的場景,前面小姐姐說過,也可以單獨用窗口的發光幾何面來照射(當然大家也可以用unity的面光源來照射,但是每個窗口布設面光源工作量太大,而且太多的面光源烘焙很費時,所以小姐姐在建模軟件中為每個窗口構造了一個幾何面,來代替面光源,然后給這些結合面設定發光材質,發光材質烘焙要比面光源烘焙速度快得多),下面我們就關閉環境光,單獨用發光幾何面來照射。
那么如何關閉環境光呢?只要將環境光的強度設為0,環境光就失效了。
下面我們將2層窗口事先構造的發光幾何面全部選中,如下圖所示,勾選其材質中的Emission(發光),並設置HDR發光強度為0.5,因為我們已近關閉了環境光,此時場景僅受可發光的幾何面單獨照射,點擊“Generate”重新進行烘焙。
按上面的設置烘焙,耗時12分25秒(如下圖所示),由下圖可見,單獨使用可發光幾何面照射,一樣可以得到與單獨使用環境光照射烘焙的結果,而且可發光幾何面單獨照射烘焙后的結果,更有層次。
前面小姐姐說過,黎明時分的光照也可以用環境光和可發光幾何面共同作用來模擬,現在我們就同時開啟環境光和可發光幾何面的發光材質來照射場景(具體參數如前所述),然后重新烘焙,結果如下圖所示。
由上面的圖可見,在環境光和可發光幾何面的共同照射下的烘焙結果比兩者單獨照射的效果更好,雖然室內物體光照不足,但層次還是可見的,所以如果表現黎明時分的光照,建議使用環境光和窗口的面光源或發光幾何面共同照射場景,環境光可理解為主光源,可發光幾何面作為補光來彌補環境光的不足。
小姐姐之所以單獨使用環境光和可發光幾何面,是為了讓大家單獨體會一下這兩種不同光的光照效果,希望大家理解。
至此,黎明時分的光照就烘焙完了,按照前面的規划,要烘焙朝晨時分的光照,我們只需將黎明時分的場景另存為bgcj_zc,這樣場景bgcj_zc就繼承了場景bcgj_lm的所有設置,當修改場景bgcj_zc時,不會覆場景bcgj_lm已經完成的光照等相關設置,話不多說,直接將場景bcgj_lm另存為bgcj_zc,下面就來設置和烘焙朝晨時分的場景。
⑵.朝晨時分的光影烘焙
下面將場景bcgj_lm另存為bgcj_zc,朝晨時分的場景就自動激活(或稱為當前編輯的場景)。前面我們已經討論過,朝晨時分陽光溫和,光線斜射到靠近窗口的房間,窗戶附近的物體棱角清晰,並有明顯的陰影,另外,這個時分還未上班,室內燈光還未開啟,因此可使用平行光作為主光源來模擬陽光,並以環境光和窗口的可發光幾何面為輔助光(或稱補光)來照亮室內陰暗的地方,因此開啟前面倍關閉的Unity默認創建的平行光(如下圖所示)。
用上述的燈光進行烘焙,結果如下圖所示。
下圖為背面沒有陽光投射房間得烘焙效果。
有上圖可見,窗口附近的物體清晰可見,遠離窗口的物體還是比較暗淡,這是符合常理的,如果有童鞋在一些寫字樓工作過,剛上班還沒開燈前的房間效果大致應該是這樣的光照效果。