2018年2月22日 星期四

ADAM裡的渲染與著色:第三章

作者:John Parsaie, 江毅冰 原文
潤稿:Kelvin


你看過了ADAM: The Mirror 和 ADAM: Episode 3 影片了嗎?這兩部短片獲得了超過百萬的點閱率,很多人都想知道由著名電影"第九區"導演Neill Blomkamp和他的團隊Oats Studios 如何使用Unity 來製作出這樣酷炫的效果。你可以閱讀我們一系列的文章。

光照


本文作者由Made with Unity團隊的軟體工程師John Parsaie與Unity技術美術總監江毅冰共同完成。John Parsaie在ADAM電影中負責像是表面散射、透明後期處理、Alembic圖形整合等等。


江毅冰,在加入Unity之前就職於頑皮狗、皮斯克等知名公司裡的AAA產品團隊,參與製作的作品包括Uncharted 4(頑皮狗)、怪獸電力公司和汽車總動員2等(Pixar)和無敵破壞王(Disney)等作品製作。


佈景:按幀分解


在即時ADAM系列電影中所呈現的令人震撼的效果,是在Unity中用大量元件組裝而成的。在這篇文章中,我們會著重說明Oats Studios是怎麼實現這些效果的。所以如果你想瞭解在某一幀這些美術如何使用它們的自訂Shader,請繼續閱讀下去。


本文所分析的ADAM 3中的一幀畫面



本文中我們將用RenderDoc打開ADAM 3的一幀畫面,為你剖析視覺效果背後的一些內幕。


RenderDoc是個十分實用的幀分析和圖形除錯工具。RenderDoc已經與Unity的編輯器整合。想瞭解更多關於RenderDoc與Unity的資訊請到這裡



渲染G-Buffer


ADAM 2與ADAM 3都是使用Unity 2017.1的Deferred渲染路徑來渲染的。這代表所有不透明的物件都會被渲染到一組緩衝區中,而這些緩衝區就被稱為G-Buffer或Geometry Buffer。G-Buffer包含了渲染管線下實現光照計算所需的所有資料。


左下方的G-Buffer和 alpha通道



透過設定多個渲染目標(MRT),對顯示的每個不透明物件,都可以在相同的draw call中將以下資料寫入到G-Buffer的所有四個組成部分中。

1.Diffuse Color RGB/Occlusion A(ARGB32)
幾何體的“固有顏色”和烘焙環境遮蔽。

2. Specular Color RGB/Smoothness A(ARGB32)
Unity支援鏡面和金屬PBR工作流程。但在內部,這二個工作流程的輸入內容最後寫入緩衝區的資訊是相同的。這是為了統一相同著色模型下的PBR輸入,後面將會用到這個模型。


3. World Normal RGB/Unused A (ARGB2101010)
更高精度的緩衝區會用來存儲每個圖元所處的世界空間法線或表面的朝向。這個資訊對於計算光源照度至關重要。


4. Emission, Ambient RGB / Unused A(ARGBHalf)
自發光和環境GI被渲染到這個緩衝區中。之後,這個緩衝區也在管線後期中被用來收集反射和累積光照。根據使用者設定,此緩衝區設定為LDR或HDR格式。ADAM就是用HDR光照渲染的。


注意:在管線中,使用自訂著色模型的透明和不透明物品的處理方式不同。


深度-模板緩衝區(The depth-stencil buffer)


在渲染G-Buffer時,場景的深度也被渲染到相應的特殊緩衝區中。對於即時圖形來說,深度資訊的存儲十分重要,它對我們在將場景投影到二維空間的過程中或之後保持物件的三維感至關重要。重建圖元的世界位置也很必要,這稍後在延遲著色中會用到。更重要的是,這是我們耳熟能詳且深受喜愛的即時高級後期處理特效的關鍵組成部分。


深度緩衝區(左)和 模板緩衝區(右)


模板緩衝區與深度緩衝區共用著相同的資源。在根據圖元受到渲染的內容分類圖元時,模板緩衝區尤其有用。我們在之後還可以使用這些資訊來區分圖元,並選擇要怎樣處理它們。在Unity中模板緩衝區被用作光剔除遮罩。在ADAM中,它也被用來標記呈現出次表面散射(SSS)的對象。



次表面配置緩衝區(Subsurface profile buffer)


對於次表面散射,渲染器也會在G-Buffer產生期間將索引寫入額外的緩衝區,該緩衝區之後會用於查找來自次表面配置資訊的重要資料。這個緩衝區還存儲一個表示散射發生次數的標量。


次表面配置緩衝區:(R)配置索引 (G)散射半徑



如上所述,這些重要資料來自使用者在編輯器建立的次表面漫反射配置資訊。這些使用者自訂的配置資訊決定了漫射光在高度半透明介質中的散射方式。


次表面漫反射配置資訊


我們也可以通過這些設定資訊來控制正向散射和透射率。例如:光線在穿透耳朵和鼻孔時的效果。所有這些資訊都會發送到GPU並在之後讀取。



下一步


G-Buffer完成渲染後,複雜的場景幾何計算就會被移到少數幾個緩衝區上,在之後進行計算。這樣做能使以後所有計算的效能消耗較為固定和可預測,這是因為光照計算在這時對於場景幾何複雜性來說,完全是未知的。然而,在主要光照計算之前,還有一些關鍵的預備性步驟,這些步驟將在下面進行探討。


環境反射光效果


透過使用G-Buffer中創建的資料,我們會對天空盒立方體貼圖運行計算以獲取環境反射資訊。這個計算將粗糙度、法線、視角方向、鏡面反射顏色等資訊考慮在內,並且通過一系列的方程來從環境中產生符合物理規律的鏡面反射效果。這些反射效果會被添加到自發光HDR緩衝區中。



環境反射光





陰影


到了這一步,幾乎所有渲染器所需的初步工作都已經完成。於是,渲染器進入到延遲光照處理階段,由陰影效果處理開始。

Unity在其定向光處理上使用了一種眾所周知的技術,名為級聯陰影貼圖(CSM)。這個技術的原理很簡單:距離越遠,我們眼睛能看到的細節就越少,既然如此,為什麼要把大量精力放在對電腦圖形學中的遠處細節的計算上呢? CSM便是基於這個事實,根據物體與攝像機的距離分佈或級聯陰影圖的解析度。


級聯陰影貼圖(左)和聚光陰影貼圖(右)



在這個鏡頭中,定向光CSM實際上只用在環境幾何體上,而畫面中二名角色的光照則由一組聚光燈處理!有一些鏡頭是這樣處理的,因為它給了Oats Studios的燈光師更多的靈活性,從而能突出鏡頭中的關鍵視覺效果。



螢幕空間陰影



我們還使用了一個名為“螢幕空間陰影(screen-space shadows)”的技術,有時也稱為“接觸陰影”,它通過深度緩衝區中的光線步進來提供細節豐富的陰影。這種技術尤其重要,因為它能夠捕捉攝影測量法構建的環境中顆粒狀陰影的細節,這些細節有時甚至是CSM都無法捕捉到的。螢幕空間陰影和Unity的陰影貼圖技術被一同用來“填補”漏光。



延遲著色


在以上步驟完成後,我們就有了足夠的資訊來對光照場景進行逐圖元重構。



一次延遲光照處理中讀取的所有資訊


延遲光照處理過程將針對視圖中的所有光照進行處理,每次都會將光照累積到HDR緩衝區。G-Buffer的內容是根據當前光照的資訊(包括陰影貼圖)來計算的。


首先,從深度緩衝區重建圖元的世界空間位置,該位置後續被用於計算從表面點到眼睛的方向。這對確定依賴視角的鏡面反射效果來說十分重要。陰影和其它光照資訊(例如剪影等)也會被彙集成一個標量,用以計算衰減後的最終效果。接下來,所有表面資料都從G-Buffer中取出。最後,所有資訊都被送到我們的著色模型,這是一個基於物理的微縮焦雙向反射分佈函數(BRDF),進行最後的著色處理。



所有最終光照都會累積到不透明物體上,次表面物件除外



在這時,我們已經有了一個近乎完全著色的場景,但是那些白色的輪廓怎麼辦?如果你還記得的話,那些是我們在範本緩衝器中標記的用於次表面散射的圖元,它們的著色處理尚未完成。



次表面散射


前面有簡單地提到,次表面散射是漫反射光的散射和再現,多見於半透明介質中最典型的例子之一是皮膚。而且在所有非金屬中都會有不同程度的次表面散射,只不過多數時候我們並不會注意到。

但是在即時電腦圖形下,次表面散射究竟代表著什麼呢?


散射距離比圖元小(左) 散射距離比圖元大(右)


這個問題的答案其實引出了一個更大的問題。上面的二個圖都包含一個代表圖元的綠色圓圈,以及位於其中心的入射光。藍色箭頭表示漫反射光線,橙色箭頭表示鏡面反射光線。左圖顯示所有漫射光線會在材質中散射,並在相同圖元的邊界內重新出現。由於幾乎所有要渲染的材質都會出現這種情況,我們可以假設漫射光是從入射點發出的。

當渲染的材質對漫反射光線散射過多時,會出現問題,光線會重新出現在圖元的邊界之外,如右圖所示。之前的假設在這樣的情況下毫無説明,我們需要探索更先進的技術來解決這個問題。



漫反射光(左) 鏡面反射光(右)



遵循當前最先進的即時次表面散射技術,我們對光照應用了特殊的螢幕空間模糊。但是在此之前,我們必須確保將漫反射和鏡面反射光照分離到各自的緩衝區中。為什麼要這樣做呢?回顧一下這些圖表,你會發現鏡面反射光會從表面立即反射,不參與任何次表面現象。所以我們至少應該在執行次表面光照估算之前,將它與漫反射光照分離。


在下圖中,你可以更清楚地看到二種光照的不同效果。請注意,所有的鏡面反射光都已與漫反射光完全分離,從而可以在完成左側的輻射/漫反射緩衝區所需的工作的同時,不用擔心損壞鏡面反射的高頻細節的完整性。



漫反射緩衝區(左)鏡面反射緩衝區(右)



基於由自訂次表面配置資訊創建並發送而來的擴射內核,螢幕空間模糊效果近似於這種次表面散射現象。



多個次表面配置資訊可被用在不同的材質上



通過在計算結束時將漫反射光和鏡面反射光相結合,我們便把之前的問題給解決了!像這樣的技術在估算圖元到達範圍外的散射時是非常有效的。此時場景中的所有不透明物件現在都被著色了。



場景中的所有不透明物件都已被完全著色



接下來是渲染螢幕空間反射(SSR)、天空盒(Skybox)、螢幕空間環境遮蔽(SSAO)和透明度。下面你可以逐步觀察這些過程的變化。



對SSR、天空盒、SSAO和透明度進行的渲染



運動模糊(motion blur)的重要性


運動模糊在影片中的確起到了關鍵的作用。雖然它提供了可以控制影片品質的另一個微妙維度,但對某些鏡頭來說它是一把兩面刃。


運動向量紋理(左)用運動向量計算的運動模糊(右)



當然,渲染運動模糊需要渲染器瞭解運動本身。這些資訊通過首先渲染初步的運動向量貼圖而來。這個緩衝區是通過計算螢幕空間中當前頂點位置和先前頂點位置之間的差值,產生用於計算運動模糊的速度。


我們還做了一些額外的工作,以正確地從Alembic流獲得運動向量。有關詳細資訊,請閱讀文章



後製特效


應用後期處理特效之前和之後的效果


我們終於來到了最後的後期處理過程。在這一步中,最終色彩分級、ACES色調映射、暈影、泛光和景深合成到一起,生成一個接近完成的圖像。但是,Marian的防護面罩去哪了?



Marian的防護面罩


在使用到該技術的行業中,處理即時圖形的透明效果是一個老生常談的問題。諸如景深、螢幕空間反射、運動模糊和環境遮蔽等效果的主幹部分都需要從場景深度進行一些空間感知/重建,但是對於被透明物體覆蓋的圖元,要怎麼處理呢?你將需要二個或更多的深度值!

首先將所有不透明的物件渲染到場景中,然後是一個針對透明物件清單所特有的自後向前的特殊正向的繪製向處理過程,將每一遍個繪製處理階段混合到幀緩衝,但而不寫入深度緩衝。這樣做可以盡可能地規避這個問題,對於大多數物件,比如角色的眉毛或霧,這樣的處理效果還不錯。


Marian的防護面罩帶有一些不現實的反射效果,無AO,DoF不正確,無運動模糊


然而從上面的例子可以看出,我們不能在Marian的透明防護面罩上規避這個問題,因為這個防護面罩在影片超過一半時間中都有出現。針對這種情況,我們需要某種替代方案。

最終產品製作階段的解決方案是將透明物件延遲到二個完全著色幀之間的合成階段中進行渲染。正如前文所說,第一幀包含了除了防護面罩外的所有物件。在第一幀渲染完成後,G-Buffer和深度被放置到第二幀的第二個渲染階段中,其中防護面罩被渲染為不透明物件。





防護面罩的透明處理被延遲到二個完全著色幀之間的合成階段



在第二幀的第二個後製處理過程中,通過使用原始幀的G-Buffer和深度的內容,我們可以成功地獲得防護面罩的正確的SSR、SSAO、運動模糊和景深效果。要使面具回到原始幀,只需根據防護面罩的alpha進行合成,這個alpha將會因為運動模糊或景深效果而被模糊。



應用和沒有應用這個技術的畫面。請注意右邊預期的遮蔽效果



透過對Marian的防護面罩進行這樣的處理,我們將它很好地整合到了畫面中,如上面所示。你會注意到右圖中有正常的SSR和AO。雖然這並不是透明問題的全方位解決方案,但是這種技術解決了原來的極端情況,並為透明物件提供了完整的後期處理支援。



畫龍點睛:火焰


Oats Studios將室內的火焰系統運用得很好,完全提升了影片的畫面品質。通過在時間軸中進行動畫和排序,這些鏡頭光暈被添加到圖像幀畫中,產生最終的圖像。



最後的著色幀以及準備添加在上面的鏡頭光暈



成品效果

至此,你已瞭解我們所提到的所有東西是如何在運行時進行渲染的。


Marian拿著石頭靠近她的人質哥哥


總的來說,把框架細分是團隊為適應製作需求做出的一些選擇,而逐幀分解不僅是理解這些選擇的好方法,也是一個可以從中獲取有用資訊並應用到你自己專案的好方案。

想了解更多圖形框架相關資訊可以搜尋Adrian Courrèges’學習系列。


未來展望


Unity計畫在2018年為每個使用者呈上更強的圖形功能,例如影片中使用的次表面散射。我們稱之為可程式設計腳本渲染管線(SRP),它是Unity 2018 beta版提供的一套新API,開發者可以用它自訂渲染器。我們還將發佈SRP的範本,稱為高清渲染管道(HDRP),這是個包含次表面散射等新功能的現代渲染器。《ADAM》中使用的次表面散射是從HDRP直接移植到Unity 2017.1的現存渲染器中的。

如果你想要瞭解更多SRP的資訊,以及今年Unity將推出的新圖形功能,請閱讀Unity 2018中的圖形渲染



我們已經揭秘了一系列Unity 2017的功能,例如:Timeline、Cinemachine、Post-Processing Stack以及30 FPS即時渲染是如何幫助Oats Studios這樣的團隊改變電影製作的未來的。希望未來有更多Unity製作影視作品的佳作產生。

著作人