我們先系統性的理解一下烘焙原理。 ![]() 烘焙的目的是將物體高模上的法線信息盡可能完好的記錄下來。而做好烘焙的三要素為:平滑組,UV和Cage。 ![]() ![]() 什么是平滑組?如果兩個面共享一條邊并且共享一個平滑組,它們將被渲染成為平滑曲面。每個面片可以包含不超過32個平滑組。在一個平滑組中的面在它們相交的這個頂點的法線方向為它們三個面上法線方向的加權平均(見圖3)。 我們看一下圖1,UV沒有完全切開的情況下,如果你把所有邊設為軟邊,那么立方體的所有面都被設置在一個平滑組里,就會得到圖1左上和圖2右邊的情況。一個正方形,邊緣很光滑,但是面不平,而且輪廓很糟糕。 ![]() 但如果我們把不同的面分到了不同的平滑組,立方體立刻就變好看了。表面平整,輪廓清晰。但是細看邊角處,我們除了凹痕以外還看到了一條黑線。 ![]() 造成這條黑線的罪魁禍首是沒有分UV所造成的面與面之間法線信息的溢出(bleeding)。解決方法就是在邊的相接處把UV切開,再隔開一定距離。如上上圖的2。 ![]() 最后要講的是cage。 ![]() 烘焙時,低模的面向外發射射線,如果兩個相接的面呈90°角,那么射線就不會通過兩個面的邊角處。而cage的作用是讓射線也通過兩個面向量的加權平均方向,通過面之間的邊角處,從而使低模獲得高模完整的法線信息。 ![]() 知道這個原理后,在做高模時,為了讓射線更容易通過面之間的邊角處,高模上的細節要注意避免相連的兩個面互相垂直,倒角也不要用力過猛。 講完了原理,我展示一下3ds max中進行完美烘焙的流程。 預備工作:低模和高模的樞軸都位于世界原點,刪除歷史(maya)或collapse all(max),凍結變換,用到的法線貼圖類型為tangent space normal。 上面講的是理論,真到實踐中有些東西要調整。我講到要分UV,但實戰中模型更復雜,我們能見到邊就分UV嗎?分那么多塊材質怎么畫呢?所以實戰中除了分UV還要做倒角。方便一起上材質的部分不切UV,分開的UV要賦予不同的平滑組。 (題外話,即使不做倒角,帶有平滑組的低模被放到游戲引擎中也會有和完全倒角的低模一樣的頂點數,見下圖) ![]() 第一步,把做好預備工作的高低模的初始狀態放在第0幀,在下一幀把零件之間隔開一段距離,高低模的零件的位置要保證重合。這樣做的原因是:一,你可以馬上返回第0幀查看帶有法線貼圖的低模的效果;二,零件之間有距離間隔能防止零件之間法線信息的相互溢出。這里特別要跟蓮醬講一句,UV在做好以后是不會變的,即使模型的零件發生了位移。在做到烘焙這一步時,跟模型和UV已經沒有關系了,你現在所做的一切操作都只是為了制作一張有完整高模信息的法線貼圖。 ![]() 第二步,選擇低模,Modifier->Projection->Cage。在Cage菜單下勾選Shaded。 ![]() 第三步,選擇某零件低模的頂點,在Cage菜單下上調Push里的Amount值,讓低模的Cage剛剛好包裹住高模。有時候大部分區域都包裹好了,但有些地方卻露了出來(如下右圖)。這個時候只需將該區域的頂點選上后進行精調即可。 ![]() ![]() 全部零件調完Cage以后進入第四步,烘焙測試(非最終渲染)。主菜單->Rendering->Render to Texture,選擇輸出路徑,在Projection Mapping中選擇Projection,pick里選擇高模,點開Option,勾選Ray miss check以發現錯誤信息。暫時不選Global Supersampler,因為這不是最終渲染。(確保Light Tracer為開啟狀態) ![]() 稍微講一下padding。一個UV圖上,除了UV shell以外的黑色區域稱為gutters。如果UV shell和gutter的顏色差別很大,也會造成貼圖信息溢出的情況。padding的作用是在UV shell和gutters之間做一個保護層,防止貼圖信息的外溢。根據貼圖大小不同,padding的值也需調整。如下表。 ![]() ![]() 返回Render To Texture菜單,添加法線貼圖,因為只是測試給個1k分辨率就可以了,點擊渲染。 第五步,將渲染好到法線貼圖放入shader,回到第0幀檢查低模上的法線信息。我們勾選了Ray miss check,但貼圖上沒有小紅點,說明烘焙時沒有出現什么大錯誤。 ![]() ![]() 第六步,檢查沒有問題以后回到Render to Texture菜單,取消勾選Ray miss check,點擊Global Supersampler進行如下操作。再渲染一張2k貼圖作為最終結果。 ![]() 第七步,將法線貼圖導入PS。用涂抹和印章工具優化一下。有些細節也可以直接在PS里制作,你也可以使用Quixel做,更省事。我自己其實全是在SP/SD里做的,從來不用cage。模型復雜到一定程度,cage就顯得太費力了。 ![]() ![]() 補充: ![]() 當然了,如果你不是做游戲,而是影視渲染,那么我們這種所謂的“完美烘焙”也不是最完美的。最完美的是手調法線,附一個Max里的調法線工具。 Modeling_FaceWeightedNormals |