很多剛剛接觸Unity3d的童鞋花了大量的時間自學,可總是把握不好Unity3d的烘焙,剛從一個坑里爬出來,又陷入另一個新的坑,每次烘焙一個場景少則幾個小時,多則幾十個小時,機器總是處於假死機狀態,半天看不到結果,好不容易烘焙完了,黑斑、撕裂、硬邊、漏光或漏陰影等缺陷遍布,慘不忍睹,整體效果暗無層次,或者蒼白無力,燈光該亮的亮不起來,該暗的暗不下去,更談不上有什么意境,痛苦的折磨,近乎失去了信心,一個團隊從建模到程序,都沒什么問題,可一到烘焙這一關,就堵得心塞,怎么也搞不出好的視覺效果,作品沒法及時向用戶交付,小姐姐在這里分享一些自己的經驗,希望能幫到受此痛苦折磨的朋友,話不多說,開工!
哦,對了,忘了交代一點,很多朋友總是喜歡追高版本的unity3d軟件,以為高版就一定很好,目前Unity3d 2019還處於測試階段,有人就迫不及待地下載使用,測試版問題很多,用於生產風險很大。unity3d共有三個版本標識,alpha、beta、final,其中alpha是公認的內測版,也就是內部測試版,很多代碼都有問題,beta版是公測版,也有不少問題,final版才是最后的正式版,alpha版一般簡寫為a,例如unity 2019.1.1a8(64-bit)、Unity 2019.2.0a4,這兩個版本都是測試版,如果版本標識中有字母b,就是公測版,也不能下載使用,只有帶 f 的版本才能用於項目制作,所以現在最高只能使用2018版,很多老司機還在用5.6版,一般都不追高版。
本文和大家一起探討的實例效果截圖(后續會不斷更新):
干活!
● Unity日景烘焙
首先小姐姐以著名的斯蓬扎宮模型場景為例,和大家一起探討一下正午時分的光影布光方法及烘焙過程。3dMax模型情況如下圖所示(由圖可見,模型的面數為6萬多(見截圖左上角),模型一定要采用精簡的單面建模,否則這個場景的面數會多達幾百萬,甚至上千萬的面,如此多的面數,Unity是吃不消的,無論烘焙過程的展UV,還是烘焙,甚至烘焙之后的場景運行,都會陷入無休止的等待、假死機和卡頓狀態,畢竟烘焙之后也會個場景帶來一些負載,而且最終作品要在用戶機器或手機上運行,所以從模型的面數方面,必須充分考慮給場景留出足夠的裕度)
1. 模型導出
無論你用3dMax、Maya、C4D、Blender或Sketchup建的模型,建議都以fbx格式導出,因為Unity3d對fbx格式兼容的最好,這也是官方的建議,導出時一定要勾選“EmbedMedia”(嵌入媒體),否則在導入Unity時會成為無貼圖的“裸模”
2. 模型導入Unity
⑴ 在導入模型前,按下圖所示,勾選掉Unity3d的“Auto Generate”(自動烘焙)選項,好多人一打開Unity3d,不知道怎么啦,總感覺系統處於運算狀態,就是因為Unity默認這個選項是勾選的,當導入模型后,什么還沒做,就一直陷入莫名的忙機,也是這個原因,所以導入前取消這個選項。
⑵ 按下圖所示將剛才從3d軟件導出的FBX模型拖入Unity3d的Assets文件夾,2017版之后,可能出於別的考慮,Unity不再直接導入材質和貼圖,所以很多人發現模型導入后總是無材質和貼圖的裸模,這里還需要做一點設置,看下一步。
⑶ 選中剛導入的FBX模型,點擊inspector面板的Materails按鈕,我們發現下面的所有材質都顯示“none”,這就是裸模的根源,有童鞋說,前面不是說導出FBX時不勾選“Embedmedia”選項,就會出現裸模,這都勾選了,怎么還是裸模呢?這里需要說一下,如果前面不勾選,這里一定是裸模,但是,勾選之后,還需要一點點設置,否則依然會裸模,也就是前面和現在的設置缺一不可。
⑷ 繼續,此時拉開“location”后面的下拉框,將設置改為第一項,也就是“use external materails(legacy)”,意思是使用外部材質,如下圖所示:
⑸ 接下來還需要將“naming”后面的下拉框改為“from model‘s materails’”,如下圖所示,意思是貼圖名稱取自模型材質,然后點擊下面第二張圖中所示的“apply”(應用)按鈕,這時unity就稀里嘩啦地將所有材質和貼圖真正導入Unity。
⑹ 導入材質和貼圖后,unity的assets文件夾中會多出“materails”和與FBX同名的后綴為".fbm"的兩個文件夾,一個存放的是材質,一個用來存放貼圖,如下圖所示。
⑺ 接下來將assets中的FBX模型拖入“Herarcy(層級面板)”,此時我們可以看到,FBX模型連同材質和貼圖被完美地導入了Unity,如下圖所示。
到此模型導入完畢,從下面的圖可以看到,在unity3d默認燈光的照射下,場景看起來很蒼白,沒有一點層次,你的作品功能再強大,場景沒有出色的視覺美感,所有功夫全白費,受眾是不能接受這樣的作品,這就是烘焙的重要意義!考慮到一些童鞋導入模型都成問題,所以前面啰嗦了一堆,熟悉的童鞋可以跳過。接下來就進入unity3d烘焙的正題。
3. Unity3d場景布光及光照參數設置
無論是游戲,還是VR場景,烘焙前首先要做的事是燈光的布設,因為烘焙的主要任務是渲染燈光的光影效果,沒有燈光,烘焙也就無從談起。unity3d的布光原則,和其他3D軟件並無二樣,也就是要根據所要表現的意境和氣氛來決定如何打燈。一開始我們就說要烘焙正午時分的場景,下面我們就按正午時刻的光照來布設燈光。大家都知道,正午時分,陽光明媚,光照明暗分明,太陽光近乎垂直投射,但是,這個場景只有頂部一個可進光的開口,其他部分都是密閉的,表現正午的氣氛,如果燈光垂直向下投射,陰影會與場景物體重合,所以我們不能垂直打燈,因此將燈光調至與地面夾角大約60-80度,合理的燈光布設是場景光影出彩和營造氣氛的先決條件,不同的時間段,燈光角度不同。
⑴ 下面我們用平行光來模擬太陽光,作為主光源(照亮場景的主要光源)照亮場景的部分區域(也就是迎光面),產生光斑,與此同時,在其他區域產生陰影。照亮區和陰影區必須形成強烈的反差,才能顯示出陽光的明媚,很多人烘焙的場景平淡,就是因為明暗對比不強烈,該亮的不亮,該暗的不暗。非洲人之所以看起來牙齒很白,是因為黑色臉部的襯托所致,因此要表現優秀的陽光效果,光照明暗反差要大,但暗區也不能死黑一片。Unity一創建新的場景,就默認為我們創建了一盞平行光,現在我們將其調至如下圖所示的投射角度,既要考慮讓一二層都有陽光投射的痕跡,又不至於燈光垂直入射。
⑵ 接下來選中平行光(Directional Light),將inspector面板中的燈光強度(intensity)調至2,如下圖所示,默認值是1,很多人馬上說燈光已經曝光了,但必須調大,因為我們最終要的是烘焙光照,不是實時光照,現在只是實時光照曝光了,因為烘焙光照的算法和實時光照不同,不調大,烘焙后陽光不夠強烈。另外,順便將燈光的模式“Mode”改為“baked(烘焙模式)”,如下面第二張圖所示。其他值
⑶ 主光源設定之后,我們還需要考慮陰影區域的照亮,雖然陰暗區相對照亮區較暗,但也不能有伸手不見五指的感覺,正午陽光充足的時候,在強光的照射對比下,陰影區會顯得比較暗,但物體還是能看清,而且有層次感的,這主要是天光的貢獻,因此我們需要開啟Unity的天光作為輔助光源來照亮陰暗區域,與此同時,主光源照射到迎光面后,反射到周圍的物體上,這些物體又作為二次光源照亮其他物體,多次反彈后到達陰暗區,也起到光照的作用,因此,這個場景的輔助光源除了天光,還有主光源-太陽光多次反彈光,或者說兩者的綜合效果作為輔助光,共同照亮陰影區。現在我們打開光照面板,點擊window/lingting/settings,如下圖所示,彈出光照面板,然后按下面第二張圖所示,將光照面板的標簽拖至inspector面板標簽之后,使其和inspector面板並排,這樣節省屏幕空間,如下面第三張圖所示。
⑶ 接下來將光照面板(Lighting)下場景(Scene)標簽中的環境反射(Environment Reflections)的反彈次數改為5,這個值越大,光線會充分傳遞到陰暗區,亮度越亮,但亮度不會超過照亮區。然后將實時光照(RealTime Lighting)下實時全局光照(RealTime Global ILLumination)后的復選框取消勾選,也就只進行烘焙全局光照計算。接着將混合光照(Mixed Lighting)的光照模式(Lighting Mode)后的下拉框中的選項改為烘焙間接光(Baked Indirect),最后再將光照貼圖設置(Lightmapping Setings)下的光照運算器(Lightmaper)后的下拉框選項改為漸進式(Progressive),如下圖所示。還需要勾選環境遮蔽(Ambient Occlusion),也就是AO,如下第二張圖所示,這個選項會在物體或物體間內轉角或內轉折處產生軟陰影,例如牆內凹角,對於表現細節很有幫助。至此場景的輔助光和光照參數就設好了。
4. 烘焙模型設置
做完以上的設置之后,還需要對模型進行必要的設置。選中層級面板中所有需要烘焙的模型物體,勾選Inspector面板右上角的Static,將所有物體設定為靜態,如下圖所示,否則烘焙之后沒有陰影和任何效果,切記!然后在assets面板中,選中導入的所有FBX模型,勾選inspector面板模型(model)下的創建光照貼圖坐標(Generate Lightmap UVs)復選框,如下第二張圖所示,否則烘焙后,模型會遍布黑斑,其實是光照圖錯亂,因為沒有貼圖坐標,光照圖不知道怎么貼。
5. 烘焙
完成上面的設置,就可以進行場景烘焙了。點擊下圖所示的“Generate Lighting(生成光照)”按鈕,即可開始光照烘焙
說明:最近Unity2019版的正式版發布,由於一直在測試破版的穩定性,所以到現在才更新,請童鞋們諒解!下面就改用2019版來和大家繼續探討Unity3d的光照烘焙。
接上面的步驟,烘焙完成共耗時7.5分鍾,且無任何報錯提示,如下圖所示:
下面從不同角度來看看烘焙的效果,由下列截圖可見,烘焙成果非常干凈,未見很多童鞋所說的黑斑、白斑、麻點、漏光、漏陰影、撕裂、破面、硬邊等現象,而且烘焙速度非常快。一般情況下,最終的正式渲染烘焙,很多人都得1,2個小時,大部分沒經驗的童鞋,得5,6個小時,甚至幾十個小時,還有的童鞋陷入了無休止的死機狀態。無論質量好壞,有的童鞋想看一眼效果,一時半會都看不到,搞得非常心塞。前面說過,我們此次的目標是烘焙正午時分的光照效果,大家看看有沒有正午的效果?小姐姐個人認為,整個場景明暗對比強烈,陰暗區域雖然很暗,但是層次還是很清晰的。
我們再來看看細節效果
下面我們用視頻看看烘焙的效果
6. 沒經驗的初學者烘焙的情況
初學者或者沒經驗的童鞋,將烘焙參數設的稍高一些,即如下圖所示,將”Bounce(反彈次數)“設為4,Lightmap Resolution(光照貼圖分辨率)”設為20,“Lightmap Size(光照貼圖尺度)”設為2048,烘焙時屏幕右下角的ETA(剩余時間,也就是烘焙完成需要的時間)一開始顯示為3個多小時,然后不斷增加,甚至幾十個小時,經歷漫長的等待之后,直接心理奔潰,明明做個簡單的例子烘焙挺快的,為什么一到實際項目就讓人這么心塞呢?
這些童鞋不甘心,又降低烘焙參數,如下圖所示,將”Bounce(反彈次數)“設為1,Lightmap Resolution(光照貼圖分辨率)”設為10,“Lightmap Size(光照貼圖尺度)”設為2048,烘焙時屏幕右下角的ETA(剩余時間)為1個多小時,同時狀態欄提示“There are 5 objects in scene with overlapping UV’s…(場景中有5個物體UV坐標重疊)
烘焙的結果慘不忍睹,劣跡斑斑,仿若火災之后的情景,如下圖所示,
童鞋們常見的烘焙缺陷就不再一一列舉了,那么為什么小姐姐使用很高的烘焙參數,完成高品質烘焙只用了7.5分鍾,而童鞋們使用稍高點的參數就陷入了無休止的假死機?甚至把參數降得很低,烘焙都比小姐姐花費的時間多的多,而且烘焙的質量還非常差呢?對於小姐姐不到8分鍾的高品質渲染烘焙時長,很多童鞋有點大跌眼鏡,似乎不大相信,因為自己從來就沒有在幾分鍾內完成一個場景的烘焙,而且還需要一次又一次的反復測試,每次都有各種問題,一出現問題,就一頭霧水,不知道如何排除,即使等待漫長的時間有了結果,也是黑斑、白斑、漏光、漏陰影、破面、亮邊、硬邊等現象嚴重,搞得都失去了信心,下面就烘焙超慢以及烘焙過程出現的問題分別進行深度分析,僅為小姐姐個人的觀點,請高手磚拍。
7. 烘焙渲染超級緩慢的原因分析及解決方案
⑴ 模型面數超高是Unity3d烘焙超慢的罪魁禍首
大家都知道,光照烘焙的實質是將模型的每個面上所受光照渲染到其展開的對應UV區塊上的過程,大家可以自己試驗一下,在自己熟悉的3D軟件中創建一個簡單的立方體和一個面模型,然后導入Unity3d進行烘焙,速度會非常快,但是當復制10萬個立方體,再導入Unity3d烘焙的時候,速度就非常慢,由這個簡單的例子可以得出結論,模型的面數越多,烘焙所消耗的時間越長,所以降低模型面數是加速烘焙的首選方案,換言之,模型面數超高是造成Unity光影烘焙緩慢的主要原因,也就是在保證模型外觀不變的情況下,應盡可能地降低模型面數。
很多童鞋之前從事效果圖或3D動畫,轉入VR之后,仍然沿用效果圖和動畫的建模習慣,將每個面建的很精細,很光滑,即使模型規模再大都不用擔心,因為這些童鞋的機器配置都很高,但是VR不同於效果圖和動畫,效果圖和動畫最終作品只需給用戶提交幾張圖片或視頻(圖片序列),而VR最終作品是要給用戶提交一個能夠在配置不高的用戶機或手機上實時運行的3D場景文件,所以制作VR或游戲作品,無論你的機器配置多高,都應盡可能優化場景模型面數。模型面數不僅影響烘焙速度和質量,同時也影響最終作品的實時運行效率。
簡單地說,VR和游戲建模,應放棄傳統的實體建模習慣,改用精簡的低面數最優化單面建模方法,也就是poly(多邊形)建模,這樣才能有效降低模型面數,具體如何構建模型,就不贅述了,這里只給出一些原則,也就是在保證模型外觀的前提下,應盡可能降低曲面光弧度(段數),一些細節采用貼圖來表現,如下圖所示:
有些童鞋認為曲面精度太低,看起來太粗糙,大家看看上兩圖所在位置經過烘焙后的效果,由圖可見,雖然降低了曲面精度(光滑度),烘焙后並不失真。
另外對於護欄、鐵藝、女兒牆之類比較費面的模型,可采用鏤空貼圖來表現。踏步較多時,也可采用貼圖表現,門窗之類也用貼圖,這樣就可以大幅度降低模型面,如下圖所示:
⑵ 模型交叉也是導致烘焙渲染超級緩慢不容忽視的因素
有的童鞋非常偏執,不願意用單面建模方法,說自己的模型面數並不高,可渲染烘焙還是很慢,原因是他的場景中有很多下圖所示的模型交叉(或穿插)結構,烘焙時會計算圖中所示的2處陰影和AO,大家都知道,烘焙的過程中陰影計算是最耗時的,不合理的建模,會讓系統花大量時間計算無意義的陰影,如果采用單面建模方法改造成如下第二張圖所示的結構,只需計算一處的陰影,如果類似的這種交叉結構在場景中大量存在,烘焙肯定會很緩慢。而在改成單面模型后,烘焙會大幅加速
⑶ 面重疊(Overlapped faces)也是導致烘焙渲染緩慢的重要因素
一些童鞋確實使用poly單面建模構建的場景,但是由於疏忽或誤操作,一些頂點未被焊合,或其他原因,造成很多重疊的面,從外觀上看,都是單個的面,而實際在這些面的后面重疊了好多面,這些面在烘焙渲染過程中,都會被展開,並要一一被烘焙,而實際后面重疊的面都毫無意義,白白花費了很長時間在烘焙無用的東西,所以建模完成后,應排查重疊面和重疊的頂點。關於重疊面后面會進行圖解。
⑷ 不合理的lightmap UV布局將大幅增加烘焙渲染時間
由於Unity3d自帶的lightmap UV’s拆分(展開)算法的硬傷,在指定的UV尺度下,物體的光照UV常常集聚在一張lightmap的局部區域,使大量的UV空間白白浪費,如下圖所示。為了增大UV所占的比例,很多童鞋通過增加下面第二張圖中的“Scale in Lightmap”參數反復測試,時間都花在了一次又一次的測試中,少則幾個小時,多則幾天,得不償失。而且當增加“Scale in Lightmap”參數時,原來一些UV區塊又相應縮小,為了讓所有的UV區塊都增大,每個物體的“Scale in Lightmap”都得增加,此時烘焙時間成倍劇增。原本想讓所有UV區塊占滿一張lightmap,可是unity並不聽使喚,不僅沒有充分利用lightmap有效空間,而且又增加了lightmap的數量,每張lightmap和剛才那個lightmap一樣,都浪費很多UV空間。經過多次長時間的烘焙測試后,烘焙缺陷雖然消除了,可lighmap所消耗的內存空間驚人,這給作品后續的實時運行增加了很大負擔。因此不合理lightmap UV布局也是導致烘焙緩慢的重要因素。所以小姐姐強烈建議不要使用Unity3d自帶的Lightmap UVs展平功能,也就是不要勾選下面第三張圖中的“Generate Lightmap UVs(自動展平Lightmap UV坐標)”,不勾選這個選項則系統會利用建模軟件中拆分(展平)的通道2中的UV坐標。這個數據保存在FBX文件中,Unity3d是可以識別的。
8. 影響烘焙渲染質量的因素分析及解決方案
前面我們一起討論了造成烘焙渲染緩慢的原因和解決方案,下面我們繼續剖析造成很多烘焙缺陷原因及解決方案,前面所討論的渲染烘焙緩慢的原因也是造成各種烘焙缺陷的根源,接下來我們逐一進行分析。
⑴ 模型面數超高是影響烘焙質量的重要因素
有耐心的童鞋,硬着頭皮等待了很長時間,烘焙完了整個場景,結果卻發現到處是黑斑、亮斑、硬邊、漏光、漏陰影、破面、撕裂、亮面、黑面等缺陷,整個場景看上去很臟,一下就懵圈了,全然不知如何解決。根據小姐姐個人經驗,要解決上述的烘焙缺陷,首要問題應該降低模型面數,也就是在保證模型外觀情況下,盡可能使用較少的面來構建場景。大家可以試想一下,兩個一樣的模型,一個面數很高,另一個面數很低,當他們被拆分(展平)在相同分辨率的lightmap UV貼圖坐標中時,相對於低面模型來說,高面模型的每個面只有縮得很小才能被容納在這個lightmap中,當某些面小到不足以表現這些面所受的光照的細節時,偏暗的像素就會積聚成黑塊,偏亮的像素就會集聚成白塊。進而當這些lightmap包裹到對應的模型面上時,就出現了黑斑或白斑,如下圖所示。而低面模型相對高面模型來說,在相同分辨率的lightmap中,每個面所占的比例就大的多,足以表現每個面所受的光照的細節,因此烘焙的結果清晰、干凈。
大家繼續來看下面第二張圖,一些面原本需要在下面左圖所示的大小的UV區塊上來表現光照,但由於模型面數太多,Unity3d展平UV后,自動分配給這些面的實際UV區塊,只有中間圖所示的大小,烘焙完成后,這些面對應的光照圖要包裹到1:1的模型面上,需要放大很多倍。大家都知道,當一個很小的圖被放大很多倍時,Unity會以插值法來彌補像素,彌補的像素RGB值是原本相鄰的兩個像素RGB的平均值,即右圖所示的結果,當這張圖的“色帶”的分界線貼在某個面上時,就出現常見的“硬邊”缺陷,當深色的“條帶”貼在某個面上時,就出現了常見的“黑面”缺陷,同理,當淺色的“條帶”貼在某個面上時,就出現了常見的“亮面”缺陷。總之,如果不采用精簡的低面數最優化單面建模,而使用傳統的實體建模方法,模型面數會很高,烘焙時,不僅耗時,而且會出現各種各樣的缺陷。
⑵ 面重疊也是影響烘焙質量不可忽視的因素
面重疊對烘焙質量的影響比較隱蔽,常常被很多人忽視,甚至有些童鞋壓根就不知道面重疊會影響烘焙質量,但它對烘焙質量的影響確實不容忽視。為了讓童鞋們了解什么是面重疊,我們還是以前面烘焙的場景為例進行圖解,小姐姐將這個場景的poly合並成了3層和一組配飾模型,分別為1_F、2_F、3_F,為了方便大家搞清關系,小姐姐將模型拉開顯示了,如下圖所示:
這里我們先不解釋什么是面重疊,而是先討論如何檢測面重疊,對於使用3dmax建模的童鞋,可以按照下圖所示的步驟打開面重疊檢測功能。
打開之后,屏幕顯示如下圖所示的信息,其中“Overlapping Faces:”的意思是重疊面的數量,因為剛打開,沒有選擇物體,所以后面顯示“Not Applicable(不適用)”。“Click here to Configure”意思是點擊這兒來配置相距多遠算作重疊,一般設為0.0001,也就是相距很近很近。“Click to Update”意思是點擊這兒來更新,當選擇物體后,點擊這個按鈕來顯示重疊面的數量。
下面我們就以3_F,也就是三層的模型為例來檢測重疊的面,首先點擊“點擊這兒來配置”,設置間距為0.0001視為重疊,如下圖所示:
接下來在場景中選擇3_F,然后點擊“Click here to Update”,此時“Overlapping Faces”的數量顯示為16,也就是3_F中有16個面重疊,如下圖所示。
接下來我們看看到底面是怎么重疊的,按Alt+Q隔離3_F,旋轉視圖觀察,沒有發現重疊面提示,有時候確實很難發現重疊的面,但是大家都知道,面的重合,必然伴隨着頂點的重合,所以我們將面重疊改成頂點重疊檢測,按下圖所示的圖示步驟打開頂點檢測功能。
和前邊面重疊檢測的操作一樣,配置間距容差為0.0001,然后點擊“Click here to Update”,屏幕信息顯示38個頂點重合,如下圖所示。
與此同時,場景中顯示很多綠色頂點,這些綠色的點就是重疊的38個頂點,現在我們就來看看這些綠色的頂點到底是什么回事,要選擇和編輯頂點,我們得進入poly的頂點層級,然后選擇一個綠色的頂點,旋轉視圖觀察,如下圖所示
將選中的這個綠色頂點沿y軸向后移動,得到如下圖所示的結果,至此,小姐姐就不用解釋什么是面重疊了,從下圖中可見,確實在這點處有面重疊。
移除這個頂點,或者和剛才位置的頂點焊合,然后再次檢測頂點重疊和面重疊,重疊的頂點數和重疊的面數分別降低為36和14,如下圖所示。
由此可見,通過移除或焊合,可消除頂點重疊或面重疊,以此類推,可消除所有重疊的頂點和重疊的面。
通過以上的圖解,大家已經知道如何找到重疊的面和重疊的頂點,以及如何消除重疊面和重疊的頂點,同時也了解了什么是面重疊和頂點重疊,那么到底面重疊對Unity3d的光影烘焙質量有什么影響呢?下面我們就一起來討論一下。
前面我們已經討論過模型面數超高對Unity3烘焙質量的影響,而且得到結論,面數太高,會導致所有面展平后在lightmap中所占的比例大幅減小,進而使烘焙后出現各種各樣的缺陷,面重疊和模型面數超高一樣,展平后,那些重疊在有效面后面、對場景造型沒有任何貢獻的毫無意義的多余面也會擠占有效面的UV空間,使得有效面在lightmap中的比例縮小,所以必須清除重疊面。重疊面不僅對場景造型沒有任何貢獻,而且展平后還會為渲染烘焙這些毫無意義的面消耗很長的時間,同時因為擠占了有效面的lightmap的UV空間,使得有效面的UV空間相應減小,從而導致前面所述的各種烘焙缺陷,所以要加速烘焙、提高烘焙質量,清除重疊面是不容忽視的。對於使用Cinema4D和Maya建模的童鞋,都可以在自己習慣的建模軟件中找到檢測重疊面的功能,大家可自己去嘗試,這里就不一一贅述了。
⑶ lightmap UV布局也是影響Unity3d烘焙質量最重要的因素
雖然降低模型面數、消除面重疊都會加速烘焙渲染和提高烘焙質量,但是如果有效面的Lightmap UV的布局如果不合理,最終的烘焙依然會很耗時、烘焙質量依然會很差。那么什么叫Lightmap UV布局不合理呢?一方面是Lightmap UV沒有充分利用lightmap UV空間,所有UV區塊集聚在lightmap UV的某一部分,使大量的UV空間都白白浪費。另一方面就是Lightmap UV的布局因根據面的大小調整對應UV區塊的比例,使得lightmap在所有物體上均勻分布,這個可能有些童鞋不大理解,這么來說吧,所謂的不均勻,就是光照圖在一些物體的某些面很清晰,而在另一些面很模糊,大家在貼材質時經常會遇到,貼圖在物體不同面上的大小不同,這就是貼圖的UV分布不均勻造成的,和這個道理一樣,lightmap UV的布局也應考慮均勻分布,為了消除烘焙缺陷,如果極端地使用每個物體的“Scale in Lightmap”來調整物體的UV比例,是無法做到Lightmap UV的均勻分布的。
如下圖所示的Lightmap UV布局使得所有UV區塊都聚集到了這個ligtmap UV的左下角,這使得所有面在整個lightmap UV中所占的比例都很小,導致有些面所受的光影效果無法充分表現而造成最終的烘焙缺陷,同時為了消除烘焙缺陷,只能定性地增大“Scale in Lightmap”這個參數反復測試,無法精確控制UV的布局,而且隨着每個物體“Scale in Lightmap”參數的增加,烘焙渲染越來越慢,因此小姐姐個人認為,Unity3d的lightmap UVs展平功能有致命的缺陷,所以強烈建議童鞋們使用自己習慣的3D建模軟件來展平lighmap UV,例如3dMax、Maya、C4D等。
下圖是小姐姐在3dmax中展平的前面烘焙的案例場景的lightmap UV,從下圖可見,四張lightmap的UV布局充分利用了UV空間,沒有像Unity3的展平那樣,全部集聚在某一局部,而是均勻地分布在整個lightmap UV空間中,同時所有面的UV大小也是均勻分布的,烘焙后不會出現lightmap局部清晰或模糊現象。更不會出現任何烘焙缺陷。
下圖是將在3dmax中展平的lightmap 導入Unity3d,並經高質量烘焙后得到的光影圖,由圖可見,Unity3d老老實實地按照3max展平的UV高質量地烘焙出了整個場景的光照圖。一氣呵成,無任何缺陷,且總共用時7.5分鍾。從前面的截圖大家都已經看到,整個場景沒有任何烘焙缺陷,而且光影圖非常清晰,明暗層次分明。
由以上的圖解可見,lightmap UV的布局,的確會影響着烘焙的質量,也就是合理的UV布局,不僅會加速烘焙,而且可以提高烘焙質量,不合理的UV布局,不僅會導致烘焙緩慢,而且很難保證烘焙質量。
正是小姐姐在模型階段采用了3dmax最優化低面數精簡建模方法構建的整個場景,並在3d中排除了所有的重疊面,同時在3d中合理地拆分(展平)了lightmap UV,所以在Unity3d中僅用了7.5分鍾就快速高質量地烘焙出了整個場景。當然,一些童鞋會說,自己烘焙一些實例,也是幾分鍾完成了,也沒什么烘焙缺陷,那是因為你所用的案例模型都是很簡單的,並且經過優化處理的,當然烘焙很快,而且沒有任何問題,但是一換成實際的項目場景,立即就卡住不動了,少則幾個小時,多則幾天烘焙不出來。所以只要按照小姐姐上述的方法,可在幾分鍾內快速完成實際項目的烘焙渲染。當然其中會涉及到一些經驗。
9. 分步/分批次烘焙渲染
一些童鞋的機器可能配置太低,整個場景一鍵烘焙可能吃不消,或者烘焙太慢,此時可以分步烘焙渲染,也就是一次烘焙一個或一組物體。有時只有某些物體有烘焙缺陷,通過分步/分批次烘焙,可避免無缺陷物體的重復烘焙時間。下圖所示為單獨烘焙1層的情況下,僅用時2分多鍾。依照這樣的方法,然后分別選擇2層、3層進行單獨烘焙,每次只選擇一個或一組物體來烘焙,前面已經烘焙完成的物體不會受影響,這樣不僅會減輕一次烘焙的機器負載,而且避開了一些物體的重復烘焙,尤其是當某個物體烘焙出現問題的時候,可將排查范圍鎖定在所選擇的物體內。對於機器配置較低的童鞋,無需再為升級硬件支付額外的成本,這個功能是小姐姐個人的一些經驗所得。
10. 烘焙渲染分類
烘焙渲染根據燈光和物體的狀態可分為靜態燈光下靜態物體的烘焙、靜態燈光下動態物體的烘焙、動態燈光下靜態物體的烘焙、動態燈光下動態物體的烘焙四種。對於早先從事3D動畫的童鞋,肯定不理解為什么要有這四種分類呢,因為動畫只需將場景中的所有物體渲染成圖片序列(視頻),終端用戶只需要播放就可以了,而VR和游戲是需要用戶和場景進行交互操作的,兩者的機理有本質的區別,作為VR和游戲的開發程序,Unity自然有自己獨特的烘焙渲染方式。下面我們就這四種烘焙渲染方法一一展開討論,為了簡化問題,我們設定一個比較簡單的場景,如下圖所示:
⑴ 靜態燈光下靜態物體的烘焙
前面我們討論的斯蓬扎宮的烘焙就是靜態燈光下靜態物體烘焙的典型實例。之所以稱之為“靜態燈光下靜態物體的烘焙”,是因為除相機外,燈光的狀態(位置、方位角、顏色、強度等)以及物體的狀態(位置、方位角、比例、材質等)相對時間恆定不變,簡單地說,就是燈光和物體的狀態不隨時間變化。這種烘焙的設置前面提到過,這里我們再討論一下,其設置如下圖,即第一步先將產生陰影的主光源的燈光模式(Mode)設定為“baked(烘焙模式)”。第二步將需要烘焙的物體設定為“Static(靜態)”,如果不設定為靜態,烘焙之后沒有任何效果。第三步將lighting(光照)面板中Realtime Lighting(實時光照)下的Realtime Global ILLumination(實時全局照明)選項取消勾選,保留Mixed Lighting(混合照明)下的Baked Global ILLumination(烘焙全局照明)選項的勾選。然后進行必要的其他設置,烘焙上面的場景就得到上圖的靜態燈光下靜態物體的烘焙效果。
這種烘焙方式在烘焙完成后,所有直接光照和全局光照完全被轉移到光照貼圖中,此時無論如何調整燈光(燈光強度、燈光顏色、燈光角度),甚至將燈光模式改為mixed或realtime,或者勾選"realtime Global Illumination",都對場景無任何影響,也就是說,這種方式烘焙的場景,運行時燈光是不能改變的(如下圖所示),大家可以自己試一試。
有童鞋可能會問,這種烘焙方式,場景中是不是不能有運動物體,當然不是啦,只是運動物體就像被烘焙忽略一樣,沒有任何光影效果而已,但運動在場景中是存在的,並且保持着原有的運動效果,簡單地說,這種烘焙方式不適合有運動物體的場景。
下面是“斯蓬扎宮”應用這種方式烘焙的正午時分的截圖,其效果可以與Vray的渲染效果媲美,當然這需要一些經驗。
本想用視頻向大家展示這種烘焙運行時的效果,折騰了好多天,可是這里不支持鏈接視頻,而且Gif動態圖像有5M限制,所以沒法在這里給大家展示,要看這種方式烘焙的場景運行時的效果,可以去http://v2-restudy.com/custom/1455.html看視頻。
⑵ 靜態燈光下動態物體的烘焙
這種方式適合燈光靜止且有運動物體的場景(如馬路上行駛汽車的城市場景)。為了演示靜態燈光下動態物體的烘焙,我們在上面的場景中,添加一個Cube(立方體),用它來代替運動的物體,它可能是一輛汽車、一個角色,或者是其他的運動物體,總之,為了簡化,這里用一個運動的立方體來表示,位置如下圖所示,按照前面的概念,要烘焙這個立方體,也得勾選“Static”,否則烘焙后沒有效果。所以選中這個立方體,然后勾選“Static”,設定這個立方體為靜態(運動的物體是不該設為靜態的),然后重新烘焙整個場景。
下面用一個Gif動態圖像來看看整個場景烘焙后的情況:
由上圖可見,立方體的烘焙是錯誤的:1. 立方體投射的陰影沒有跟隨立方體運動;2. 立方體所接受的陰影沒有變化;3. 立方體進入暗區和亮區光照沒有變化。
由此可見,除了相機,如果場景中有運動的物體,不適合使用靜態燈光下靜態物體的烘焙方式,而應改用“靜態燈光下動態物體的烘焙”方式,具體步驟如下:首先將運動物體解除“Static”設定,或者說,運動物體不要勾選“Static”選項;接下來將主光源的燈光模式(Mode)設定為Mixed(混合)模式;然后將lighting(光照)面板中Realtime Lighting(實時光照)下的Realtime Global ILLumination(實時全局照明)選項取消勾選,保留Mixed Lighting(混合照明)下的Baked Global ILLumination(烘焙全局照明)選項的勾選。最后將Mixed Lighting(混合照明)下的Lighting Mode(光照模式)改為“Shadowmask(陰影遮罩)”,這樣實時光照的陰影就可以和烘焙陰影很好地融為一體(這里特別說明一下,所謂實時光照的陰影和烘焙陰影融為一體,是指兩者陰影的亮度一模一樣)。有些童鞋想用3dmax、C4D或Maya自帶的烘焙模塊來為Unity3d烘焙場景,對於靜態燈光下靜態物體的烘焙,這是完全可以的,但是一旦有運動物體,就要用到實時光照,此時實時燈光的實時陰影亮度很難做到與其他3D軟件中烘焙的陰影亮度完全一樣,當兩者重疊在一起時,實時陰影很暗,看上去就像挖了一個黑洞一樣的感覺,這個大家自己去試試就知道了,有了這樣的嘗試之后,大家就理解什么叫“實時光照的陰影和烘焙陰影融為一體”的概念了,如果用其他3D軟件來烘焙,導入Unity3d后,陰影很難融為一體,所以建議大家不要使用其他3d軟件來烘焙Unity3d場景,免得白白浪費時間。
Unity靜態燈光下動態物體的烘焙設置步驟如下四圖所示:
最后還需要為運動物體設定“Light Probe Group(光探測器組)”,用來收集運動物體可能到達處的環境光照信息,以保證運動物體在不同位置的正確光照。也就是在Heirarchy面板的空白處右鍵點擊,在彈出的菜單中點擊light下的“Light Probe Group(光探測器組)”,場景中就會出現帶有四個頂點的立方體網格,這就是光探測器。具體步驟圖解如下:
下圖為調整光探測器的過程,其中需要不停地選擇和使用“Duplicate Selected(復制選擇的)”命令,然后移動頂點,最終讓光探測器的頂點密布運動物體的運動范圍,范圍比實際要大些。
光探測器器布置好后,清除之前烘焙的數據(Clear Baked Data),然后重新烘焙(Generate Lighting),如下圖所示:
重新烘焙后得到如下圖所示的結果,由圖可見,運動物體的光影這回正確了。
這種烘焙完成后,改變燈光的光強度、顏色或角度以及運動物體的狀態,場景會相應變化,簡單地說,這種方式烘焙完成的場景,運行時可以改變燈光和運動物體的狀態(但運動物體必須在光探測器組范圍之內),如下圖所示:
有童鞋馬上會問,不是在說靜態燈光下動態物體的烘焙嘛,燈光能改變,就不是靜態燈光了,是的,之所以演示這種烘焙后燈光可以改變,是因為在實際應用中,肯定有童鞋會發現這個現象,但是還是建議這種烘焙后不要改變燈光,因為會發生一些怪異的現象,比如,場景中會出現雙光斑和顏色不一致,具體大家自己可以去嘗試,正是因為這個原因,所以小姐姐把這種方式歸類到靜態燈光之列,用於靜態燈光下靜態物體的烘焙,並在運行時不要改變燈光。
下面是應用這種方式烘焙的“斯蓬扎宮”的截圖,要瀏覽這種方式烘焙的場景運行時的效果,可以去前面的網址看視頻。
⑶ 動態燈光下靜態物體的烘焙
如果燈光在運行時需要改變且場景中無運動物體(如窗簾慢慢拉開時陽光投逐漸射進室內的照明、涵洞中的油燈照明等),就需要使用這種方式來烘焙。這種烘焙方式的設置如下圖所示:
下圖是這種方式烘焙的效果及烘焙后改變燈光狀態時場景的變化情況,由圖可見,這種方式烘焙的場景在運行時可改變燈光。
下圖是應用這種方式烘焙的“斯蓬扎宮”的兩張截圖,要瀏覽這種方式烘焙的場景運行時的效果,可以去前面的網址看視頻。
⑷ 動態燈光下動態物體的烘焙
對於燈光在運行時需要改變且有運動物體的場景用這種方式來烘焙,設置方法與動態燈光下靜態物體的烘焙設置相同,如下圖所示,所不同的是,需要為運動物體設定光探測器組,方法同靜態燈光下動態物體烘焙中的光探測器組的設定,這種方式烘焙的效果如下圖所示。
這種方式烘焙的場景在運行時燈光也可改變,詳見上一方式中的動態Gif圖。
下面是這種方式烘焙的“斯蓬扎宮”的截圖,要想瀏覽這種方式烘焙的場景運行時的效果,可以去前面的網址看視頻。
⑸ 四種烘焙方式的比較
上面只是和大家孤立地討論了四種烘焙方式的設置和烘焙效果,下面對四種方式進行橫向比較,以方便童鞋們對四種方式有更深入的理解,這里我們設定如下所示的場景,牆壁、地面、四個球體為靜態,四個立方體做活塞運動。
下圖為靜態燈光下靜態物體的烘焙方式(即baked+baked Glaobal Illumination)烘焙完成的場景,有同學肯定有點懵圈,前面說的靜態燈光下靜態物體的烘焙從來沒提到過運動物體,這個怎么會有運動物體呢,其實這種方式是可以有運動物體的,只不過這里也為運動物體引入了光探測器組,運動物體是用烘焙到光探測器組中的光照數據照明的,前面之所以沒提運動物體,是為了特別強調靜態物體的“靜態”!由下圖可見靜態燈光下靜態物體的烘焙方式,靜態物體表面的光影和AO非常精細,烘焙結果相對其它方式來說,對硬件的開銷最小,但靜態物體和動態物體表面均不會產生高光,且運動物體不產生投影,運動物體進入明暗區域表面只有明暗變化,並沒有接受真正的陰影。如果對於運動物體的光影要求不高,可優先采用這種烘焙方式。
下圖為靜態燈光下動態物體的烘焙(Mixed+Baked Global Illumination)結果,由圖可見,這種方式烘焙的場景,除了靜態物體的表面的光影和AO精細之外,靜態物體和動態物體均有高光,動態物體不僅接受陰影,而且產生真實的投影,相對於上一種方式來說,機器開銷稍大一些,這種方式使用的最多的烘焙方式。更正:下圖中注釋“烘焙(Mixed)應為混合(Mixed)”。
下圖為動態燈光下靜態物體和動態物體兩種烘焙方式的混合體,這種方式烘焙,靜態物體和動態物體表面均有真實的高光和陰影,且燈光在運行時可改變,但靜態物體表面的光影沒有其它方式精細,對於運行時需要改變燈光的場景,可采用動態燈光下靜態物體的烘焙或動態燈光下動態物體的烘焙。
好了,至此對於四種烘焙方式就和大家討論完了
● Unity夜景烘焙
前面小姐姐以“斯蓬扎宮”日景的烘焙作為切入點,和大家一起討論了3D模型導入Unity3d的方法、Unity3d的簡單布光和烘焙,並介紹了Unity3d常見的烘焙缺陷及其解決方案和加速烘焙的方法,逐步深入到Unity3d的四種烘焙方式,通過實例的圖解,相信童鞋們對unity3d的烘焙已經有了進一步的理解。實際應用中除了日景的烘焙,也常常涉及到夜景的烘焙。下面還是以“斯蓬扎宮”的場景為例,和童鞋們繼續討論夜景的烘焙。前面的例子都只使用了一盞模擬太陽的平行光,在下面的例子中將使用多盞燈光來烘焙。
1. 燈光布設
和3D場景一樣,Unity3d的場景布光也要有主光源,也就是照亮場景的主要光源,其作用除了點亮場景外,還起着主控場景意境和氣氛的作用。相信大家對“斯蓬扎宮”的場景強控已經很熟悉了,對於這個場景,小姐姐認為夜景應保持一份神秘和靜謐,因此考慮在兩層回廊布設適當適量的“宮燈”,燈光顏色采用暖色調。
在場景中添加如下圖所示的“宮燈”模型,置於回廊頂部,具體位置如下圖所示
2. 烘焙設置
為“宮燈”模型添加對應的燈光,將等類型設為點光源“Point”,燈光強度設為1,燈光顏色設為橙色,燈光模式設為混合(Mixed),燈光范圍設為9左右,為燈光設置Cookie,並將燈光置於“宮燈”模型下部的地面附近,如下圖所示:
將“宮燈”模型及其燈光一起選中,通過復制,每層左右兩邊各布置兩組,然后向二層復制四組,如下圖所示:
3. 夜景烘焙
勾選下圖所示的Mxied Lighting下的“Baked Global Illumination”(也就是采用靜態燈光下動態物體的烘焙方式進行烘焙),然后點擊右下角的“Generate Lighting”進行烘焙。
烘焙后的效果如下圖所示,烘焙用時6.8分鍾(408.155秒)
8個點光源共同作為主光源點亮了整個場景,各自產生了限定在一定范圍包內的柔和陰影,但是作為主景的獅頭雕還不夠突出,所以考慮在獅頭的上方布設兩盞模擬射燈的點光源,同時在獅頭前方的地面上也布設一盞模擬射燈的點光源,三盞點光源共同作為場景的輔助光源一起點亮獅頭,但不宜過亮。具體設置如下圖所示:
另外,為了強調另一端的兩個裝飾鼎,分別在其附近各布設一盞點光源,作為裝飾性的輔助光,照亮場景局部,具體設置如下圖所示:
然后重新烘焙,結果如下圖所示,烘焙用時7.4分鍾(448.196秒),要瀏覽這種烘焙運行時的動態效果,可以去前面的網址看視頻。
● Unity混合烘焙
前面討論了四種基本的烘焙形式,但實際應用中,既有靜態燈光,又有動態燈光,既有靜態物體,又有動態物體,這種情況下的烘焙就叫混合烘焙。
前面的例子在烘焙時,要么只選擇光照模式為Realtime Lighting下的Realtime Global Illumination,要么只選擇光照模式為Mixed Lighting下的Baked Global Illumination,而系統默認兩項都被選擇,如下圖所示,那么到底是該都選擇呢,還是只選擇一項呢?下面給出官方的一段建議,原文如下:
The most flexible way to use the lighting system is to use Baked GI and Realtime GI together. However, this is also the most performance-heavy option. To make your game less resource-intensive, you can choose to disable Realtime GI or Baked GI.
其意思是:使用照明系統最靈活的方法是一起使用Baked GI和Realtime GI(也就是兩項都選擇),但是,這也是性能最沉重的選擇。為了減少資源和時間消耗,您可以選擇禁用Realtime GI或Baked GI(也就是只選擇一項)。
根據上面官方的建議,靜態燈光下靜態物體的烘焙,靜態燈光選擇Baked的模式,光照模式只選擇Baked Global Illumination;靜態燈光下動態物體的烘焙,靜態燈光選擇Mixed模式,光照模式也只選擇Baked Global Illumination,並為動態物體在其運動范圍內添加光探測器組;動態燈光下靜態物體的烘焙,動態燈光選擇Realtime模式,光照模式只選擇Realtime Global Illumination;動態燈光下動態物體的烘焙,動態燈光選擇Realtime模式,光照模式也只選擇Realtime Global Illumination,並為動態物體在運動范圍內添加光探測器組。這樣的匹配方式烘焙場景最節省硬件開銷和時間。但對於混合烘焙方式,靜態燈光就選擇Mixed模式,動態燈光選擇Realtime模式,也就是在一個場景的多盞燈光中,有的燈光設為Mixed,有的燈光設為Realtime模式,而光照模式Baked GI和Realtime GI兩項都要同時選擇,這樣Mixed燈光自動對應Baked GI,Realtime燈光自動對應Realtime GI。此時有童鞋會問了,不是說同時選擇兩種GI方式,會增加硬件開銷嗎,為什么還要同時選擇呢,為了得到更真實的復雜光影效果,混合烘焙必須同時選擇兩種GI,但有方法來優化場景來緩解額外的硬件開銷。
上面的意思簡單地圖示如下
對於一般用戶來說,靜態燈光下動態物體的烘焙方式足夠用了,這是用的最多的一種烘焙。
火車或汽車出入隧道、室內外出入、游戲角色出入涵洞、室內開關燈這樣的場景,使用混合烘焙,光感會更好。當然小姐姐個人認為,使用前面所說的四種基本烘焙方式之一代替,也能獲得好的效果。
有了前面知識的鋪墊,混合烘焙不再是問題,這里就不進行圖解了,有興趣的童鞋可以自己去嘗試。
● Unity室內烘焙
下面以一個小客廳為例,和童鞋們一起討論Unity3d的室內烘焙,一方面是對前面知識的綜合應用,另一方面滿足以下做裝修童鞋的學習需求。
話不多說,開工!這個例子的3D場景如下圖所示:
拆分好的UV如下圖所示
導入Unity3d后的場景情況如下圖所示:
這個場景比較簡單,一個窗戶、一個沙發、一個茶幾、一個書櫃、兩個落地燈、一個牆面裝飾、還有一個掛畫、茶幾上一個杯子、兩盆綠植,這里我們設想將場景烘焙成陰天的白晝氣氛,也就是沒有直射太陽光,室外光線完全是大氣折射的太陽光,所以我們確定這個場景的主光源為從窗戶投射的光線,可以使用Unity3d的面光源置於窗戶附近,但我們這里選用Unity3d的材質燈光,也就是將某個模型的材質勾選“自發光”,這個模型就成了燈光了。選中窗戶玻璃,勾選其材質中的自發光(Emission),將自發光強度設為1.5,發光顏色設為白色,如下圖所示:
因為這個場景不可能有運動物體,光線也不會變化,所以選用靜態燈光下的靜態物體的方式烘焙場景,所以將自發光材質的Global Illumination(全局光照)設為Baked,勾選光照面板中的“Baked Global Illumination”,然后烘焙,得到如下圖所示的結果(烘焙用時5分鍾):
從上圖可見,場景太暗,但明暗關系已經有了,如果反復烘焙,太浪費時間,我們設想通過photoshop來調色,需要說明的是,這里所說的調色不是簡單的圖片調色,而是對整個場景調色。如下圖所示,將一個特殊的色帶文件與相機關聯起來,對這個文件調整,就會調整相機中的場景,這樣我們將這個文件(png圖片)用ps打開,然后截取一張相機視圖的圖片,按照圖片調色的方法,對截取的圖片調色,然后將圖片調整的參數應用於那個色帶文件,保存色帶文件后,Unity3d的場景就回作相應的調整,關系就是這樣。
下面我們就來調色,首先抓取相機視圖的圖片,然后在ps中打開,同時也將剛所說的色帶文件也用ps打開,如下圖:
首先調一下截取的相機視圖圖片的亮度和對比度,亮度88,對比度-50,如下圖所示:
然后對色帶也做這樣的調整,如下圖所示:
然后保存色帶文件,Unity的相機視圖就會作相應的調整,調整后如下圖所示:
原理大家都明白了吧,這樣就是以用ps靈活地為Unity3d場景調色了,只要Unity3d烘焙出場景的明暗關系,剩下的就交給ps了,這樣可以節省大量反復測試烘焙的時間。按照上面的方法對相機視圖進行色相飽和度、色彩平衡等調整后,相機視圖的場景如下:
好了,場景調色就到這里。
木地板應該有反射,所以我們需要引用Unity3d的“Reflection Probe(反射探測器)”,在層級面板空白處右鍵單擊,在彈出的菜單中選擇light下的“Reflection Probe”命令,場景中會出現一個四面體線框,如下圖所示,在反射探測器的檢視面板中按下節點命令,四面體的四個面上會出現黃色下把手,拖動可以調節探測器的大小,按下探測器檢視面板中的移動按鈕,可以調整探測器的位置,用這兩個命令配合,將探測器調至和房間一樣大,或者說讓探測器完全包絡這個房間,烘焙的時候,會將整個房間烘焙成一個比較小的全景圖貼在探測器上,供具有反射的材質映射來實現真實反射。這里說明一下,當場景比較復雜時,可以用多個反射探測器拼合來滿足場景的外形,場景中不需要反射的地方,就不需要布置反射探測器了。
反射探測器布置好后,需要重新烘焙,反射數據是通過烘焙獲得的。如果熟悉了,烘焙之前就布置好反射探測器,免得重復烘焙。烘焙之后結果如下
上圖反射效果不太好,下面我們為木地板加一個實時反射,效果如下:
現在我們將玻璃的材質燈光關閉,用平行光來模擬陽光,重新烘焙(用時6分鍾左右)並開啟反射后效果如下:
在這個例子中引入了ps的后處理調色,以避免為達到好的色調和顏色及明暗對比反復烘焙浪費很多時間,好了,這個例子就討論到這。
● Unity沙漠庭院烘焙
下面和童鞋們再討論一個“沙漠庭院(The Courtyard)”的烘焙,也算是對Unity烘焙的綜合應用,其3D場景如下圖所示:
因為拆分的UV比較多,這里就不上圖了,導入Unity后的場景如下圖所示:
日景烘焙,按下圖設置模擬太陽的平行光和光照參數
為場景中模型燈設置材質燈光參數如下圖,這里第二次用到材質燈光,然后點擊光照檢視面板中的“Generate Lighting”,開始烘焙場景。
噔噔蹬蹬,經歷28分鍾的烘焙,結果如下
這個場景是官方的。沒有提供3D模型,小姐姐想了很多辦法才導出FBX文件,面數高達300多萬,測試烘焙了幾次,光照圖好多都設到了4096x4096,總有問題,如下圖所示:
那這些烘焙缺陷如何消除呢?前面小姐姐說過,模型面數太多是導致烘焙缺陷的重要因素,因為同樣分辨率的光照圖,模型面數越多,分配給每個面的區塊就越小,模型面數越少,分配給每個面的區塊就越大,區塊越大,光照圖越清晰,區塊越小,光照圖被拉扯得越嚴重,缺陷就會越多。下圖為官方的模型:
下圖為小姐姐用低面數最優化精簡單面建模方法重新構建的模型(花了兩天時間,總面數50萬,降低了6倍),
另外,小姐姐烘焙這個場景后,發現模型的貼圖有問題,如下圖所示:
上面這些貼圖問題其實是很多人經常遇到的,現在我們回到3d中,看看3d中的情況,如下圖所示
由上圖可見,3dmax場景打開后,模型顯示破破爛爛,這也是很多網友提問的問題,網上解答的不是讓修改顯示驅動,就是模型偏離原點太遠,小姐姐認為不是這些原因造成的模型破爛,按上圖的標注勾選背面去除,立即就消除了模型的顯示破爛,如下圖所示:
由下圖可見,Unity中的問題在3dmax場景中也存在
另外,貼圖的分辨率為4096X4096,精度很高,為什么在Unity中很虛呢?這里不得不和大家討論一下UV問題,通常情況下,很多人在3dmax中習慣用UVW map來調整模型的材質貼圖,對於簡單的模型,這種方法沒問題,但是對於復雜的模型,用標准的平面、圓柱、球面等貼圖坐標,橫豎都不正確,就像上面的圖示一樣,這種現象稱為UV扭曲或拉伸,這是不正常的貼圖。要解決UV扭曲、拉伸或擠壓,必須掌握UV拆分(也稱為“展UV”,通俗地講就是展平UV),前面提到過拆分UV,一聽到拆分UV,很多童鞋一個頭兩個大,覺得拆分UV很難掌握,這里小姐姐不想對拆分UV進行深解,只是通過對比,讓大家對UV拆分有個大概的概念。
為了找到上面例子中貼圖被扭曲和拉伸的原因,我們將模型的貼圖換成棋盤格,因為上面例子中的貼圖不容易看出問題,棋盤格材質是所有3D軟件用來顯示UV排列的一種方式。
下圖是上面的實例場景模型貼圖換成棋盤格的情況
下面我們一塊一塊來圖示分析
棋盤格的排列代表模型的UV坐標情況,或者說棋盤格的排列是由模型的貼圖坐標控制的,棋盤格排列有問題,貼圖一定也會有問題。從上面的圖解可見,場景貼圖的UV坐標是不正確的,棋盤格線性排列,貼圖紋理一定會朝一個方向;棋盤格錯亂,貼圖紋理也一定錯亂;棋盤格扭曲,貼圖紋理也一定扭曲;棋盤格密集(擠壓)或拉伸,貼圖紋理一定會變虛,因為拉伸會導致紋理被拉大,擠壓會導致紋理皺皺巴巴,這兩種情況都會使貼圖變得模糊。上面的圖示中模型貼圖局部密集,相信大家都遇到過。
為了矯正不正確的貼圖坐標,模型必須使用3dmax的Unwrap UVW修改器進行手工UV拆分,或者叫手工展UV(展平UV坐標),如下圖所示。對於材質的紋理貼圖坐標,使用系統自動拆分UV,常常是不正確的,所以必須使用手工來拆分。對於使用C4D、Maya、犀牛、Su的用戶,也有相應的功能,這里就不贅述了。
拆分或展平的UV坐標是被保存在貼圖通道中的,貼圖通道設置在Unwrap uvw和材質面板各有一個,如下圖所示。
Unwrap uvw面板的貼圖通道(Map Channel)用來設置拆分的UV坐標保存在哪個通道,通道可以有8個。材質面板中的貼圖通道(Map Channel)用來設置這個材質貼圖的排列受哪個UV坐標的貼圖通道控制,系統默認固有色(或過度色)貼圖受通道1(即Map channel 1)控制,展UV(Unwrap uvw)修改器面板的貼圖通道(Map Channel)默認是2,因為一般情況下都是用UVW Map調整貼圖坐標,這個UV坐標占據通道1,有的童鞋使用展平修改器時,發現模型的貼圖沒有變化,是因為展平修改器的貼圖通道和材質的貼圖通道不一致,模型的貼圖沒有受到你正在使用的材質貼圖展平UV的控制,如下圖所示:
展平修改器一般情況下是用於控制光照貼圖的(也就是控制烘焙貼圖),光照貼圖默認占據通道2,所以展平修改器的通道默認是2,有時因為模型的貼圖坐標不正確,需要手工拆UV,也就是需要使用一下展平修改器,此時必須將通道改為1,這個大家必須注意,否則拆了半天,材質貼圖沒變化。
剛才小姐姐說,貼圖通道可以有8個,通道1默認是分配給材質固有色貼圖的,通道2默認是分配給光照貼圖的,其他6個可以用來展平法線貼圖、高光貼圖、陰影貼圖、AO貼圖等等,一般我們只需要過度色貼圖和光照貼圖兩個通道。
UV展平后有兩種用途,一種用於美工在photoshop中繪制貼圖,另一種用於控制紋理貼圖,沒有美術功底的童鞋,當然不會繪制貼圖啦,那就用展平的UV坐標來控制紋理貼圖好了。
我們手工展UV是為了矯正不正確的紋理貼圖,所以展平UV的貼圖通道就改為1。
展平UV大家可以想象成拆盒子一樣,要拆盒子,得有縫,沒有縫,是拆不開的,拆UV,一般也得有縫,UV縫可以系統自動定義,也可以手工繪制,系統定義的縫經常不是我們所想要的,所以對於控制材質貼圖的UV,我們一般都是手工來繪制拆縫的,這里就不具體繪制拆縫了。拆縫繪制好后,就可以展UV了。展平UV修改器的展平方式很多,如下圖所示:
正確拆分(或展平)的UV,棋盤格應該是方方正正(長寬相等或近似相等),排列整齊,這樣貼圖貼上去才沒問題,如下圖所示,絕對不允許排列錯亂、扭曲、拉伸或擠壓,否則就像上面的例子一樣。
另外在一個物體中,對於一種材質,棋盤格的密度必須相等,除非特殊要求。棋盤格的除了長寬相等、排列規整外,還必須合理,什么是合理呢?例如下圖中的回轉體,網上很多例子都將其端面的棋盤格排列成下圖所示:
小姐姐個人認為回轉體的端面,應該讓棋盤格繞環向(或圓周方向)排列,為什么呢,假設這個物體是個木頭,端面的紋理應該是一圈一圈的年輪,按照上圖的排列,木紋貼上去,紋理肯定是線性的,這是不正確的,再假設這個物體是一個機械零件,端面的紋理應該是車削加工的刀紋,一圈一圈的,按照上面的排列,金屬紋理貼上去,也不會又一圈一圈的刀紋,而是線性紋理,這是不合理的UV拆分,為什么在這里要強調這個問題呢,因為我們前面所討論的場景,好多UV坐標有問題的物體就是回轉體。
小姐姐對上面例子的模型重新拆分貼圖UV,並使用“條帶展平”拆分后得到下圖所示的效果,錯誤的UV坐標得到了矯正,而且上下面的棋盤格沿圓周方向排列,這才是合理的,如果貼上磚紋,紋理自然會環向分布。由圖可見,UV坐標消除了錯亂、扭曲、拉伸和擠壓
同理,對其他有問題的模型重新拆分貼圖UV后,效果如下:
通過手工拆分UV之后,錯亂、扭曲、拉伸的UV得到了矯正。這里說明一下,對於一個物體,材質相同的部分,除了UV坐標正確、合理之外,棋盤格大小必須一致,也就是UV坐標的密度必須相同,如果UV密度不同,就像你的手心手背一樣。另外同一場景中的不同物體,如果材質及貼圖相同,UV密度也必須相同,這樣才看上去協調。
那么如何讓一個物體的所有面的UV密度相同呢?按照下圖所示的方法來完成:
一個物體各個面的UV密度統一了之后,那材質和貼圖相同的不同物體如何統一呢?很簡單,選擇每個物體,點擊上圖中第六步的圖標,所有物體的UV就全部均勻一致了,如下圖所示:
將貼圖去換回原本的貼圖后,貼圖不再有錯亂、扭曲、拉伸和擠壓現象了,如下圖所示:
UV正確拆分后,不需要太高分辨率的貼圖就可以讓模型的貼圖很清晰,貼圖分辨率太高,烘焙和實時運行時機器負載太大。
手工拆分貼圖UV后,也可以將其應用於光照貼圖,這就需要通過貼圖通道的復制將材質貼圖的UV復制給通道2,當然也可以用機器自動展平光照貼圖的UV。
好了,廢話就說到這里,矯正了模型的貼圖坐標之后,下面我們就來重新烘焙上面的例子,按之前設定的參數,重新烘焙后結果下(有時約12分鍾):
添加燈光輝光和地面模糊反射之后的效果如下:
由圖可見,先前的問題都已經消除掉了。
這個場景的夜景烘焙后續會補充,下面大家一起來看看一個小區室外場景的烘焙
● 社區室外日景烘焙
這個案例的3D場景截圖如下所示,這個場景原本900多萬面,小姐姐用單面建模方法重新構建模型,只用了4.5萬面,用於VR和游戲的場景必須用精簡建模,以保證手機端的流暢運行。
在3D軟件中拆分每個物體的UV於通道2,一般童鞋一個物體拆分一個UV,實際上多個物體可以共享一個光照圖的UV,也就是選中多個物體一起拆分,得到一個UV,這樣這些物體就共享一個UV了,拆分好UV后倒入U3D,如下圖所示:
這個場景日景的燈光比較簡單,用一盞模擬太陽光平行光作為主光源,並勾選陰影,用天光和環境光作為輔助光源彌補主光源的盲區,其他參數按前面例子的方法設置,有前面知識的鋪墊,相信大家可以自行完成烘焙的相關參數設置,小姐姐烘焙完成的結果截圖如下(用時12分鍾):
烘焙完成后大家可按照前面小姐姐介紹的方法用ps對場景進行潤色,當然不是對圖片調色,而是借用圖片的調節,來調整整個場景的顏色,以避免在Unity中重復烘焙。這里小姐姐就不上圖了,相信大家都可以自行完成這個操作的。Unity3d的烘焙是美工的一個環節,關系到Unity作品的顏值和賣相,同時也關系到作品的實施運行是否流暢,特別是移動設備上的運行,要開發商業作品,光靠概念是不可能完成項目的,必須經歷系統的實戰訓練,如有意可關注小姐姐的《Unity模型預處理布光烘焙后處理特效美工場景優化實戰視頻教程》去臨摹,也可閱讀小姐姐CSDN的其他案例文章。
● 社區室外夜景烘焙
這個場景的夜景燈光相對來說比較復雜,小姐姐設想以建築的亮化霓虹燈和路燈共同作為主光源照亮場景,用射燈作為輔助性裝飾輔助光點綴建築,同時用微弱的天光和環境光也作為輔助光照亮建築的邊緣,燈光布設截圖如下:(待續)