GDC文章粗讀——看看《Hi-Fi RUSH》的卡通渲染(下)


3樓貓 發佈時間:2024-05-24 15:32:38 作者:Hakumen Language

前言

這篇接著上週的上半部分,繼續來讀Tango在2024GDC大會上的分享。
由於會介紹到很多引擎中實現光照和陰影的細節,對於完全不瞭解遊戲引擎的人,可能會驚奇的發現——原來陰影不是打上光自動的就算出來的;對於有過遊戲開發經驗的人來說,如果不用開發卡通風格的環境,其實也不必深入定製光照系統的方方面面。因而看看他們如何來定製修改光照系統可能也會有打開黑盒的效果。
開始之前插進來一小段談談環境光遮蔽(AO)與陰影的關係。其實兩者都是光傳播中的暗處表現,原則上如果通過物理法則來計算,兩者是一致的,即受光越少表現為越暗。提出AO這種近似主要用來解決靠近物體表面及相鄰部分的陰影,且這種相鄰陰影是充分考慮環境間接光照後的歸納結果;而所謂的陰影往往用來表現物體擋住光源產生的輪廓,因此對光源的強度和數量都有一定的依賴,並且整體實現的計算量會大於AO。所以後面的介紹中會看到一些近似陰影的方案。
後面的內容還是以翻譯原文為主,打星號的則是我自己的備註和評論。 文中有大量的Volume這個詞被翻譯為“體積”,其實需要理解為“能表達一定範圍的體積區域”,這一點後面就不反覆解釋了。

1 卡通風格光照

*這部分介紹了經過定製化的一些實時光照組件。這裡的光照可以理解成——以定製化的輪廓照亮指定的區域或物體表面,所以其實是一組著色方案,不涉及產生陰影。
*最終他們選擇了前向光源和貼花光源為主,其中前者都是用的引擎中的元件,所以提到的不多。
主光源(光、影)

主光源(光、影)

——Hi-Fi RUSH的卡通著色使用一個簡單的兩色調光影著色模型。全局的主光源是以UE4的前向渲染的基礎pass,而非延遲渲染的pass來計算的。
——在開發的後期階段,我們開始利用UE4的渲染指令來進行數據傳送和渲染pass的回調和線程的委託,這使我們能實現源生的遊戲內渲染pass(原文是original render passes game-side,這裡應該是能開發自定義渲染pass的意思)。現在我們對於如何做UE4定製化修改有了更多經驗,但這一認知也是通過實現了更多核心技術後積累的。
*現在的主流主機遊戲管線往往都是延遲和前向結合的,可以兼容兩種管線的特性。這一段及後面的一段內容主要解釋了為什麼選擇前向主光源方案,至於上一篇提到的其它渲染特性大多數還是用的延遲渲染管線裡的。
使用延遲渲染主光源的情況

使用延遲渲染主光源的情況

——最終我們需要支持2個主光源,並且把卡通風格的後處理與主光源關聯、最終匯入延遲渲染pass的方案也在性能上有所不足。對於延遲和前向渲染的光照進行混合的方案可能也是我們可以改進的方向。
*這一段我的理解是當時延遲渲染的可定製程度不支持他們的風格(因為風格化部分要通過對光照區域後處理來實現,因此無法通過體積後處理來做光照),為此風格化光源必須通過前向渲染來實現,但這又會增加性能開銷;到了需要室內室外2個主光源的情況,這一複雜度就指數級提高了。不過最終他們似乎並沒有提到對此的優化和改造。
可放置的卡通風格光源

可放置的卡通風格光源

——在前向主光源之外,藝術家可以使用點光源或聚光燈之類來實現局部環境光照。
卡通光源(前向渲染光源)

卡通光源(前向渲染光源)

——對於可放置光源,基於和主光源一樣的原因我們選擇了前向渲染光源。很多小開發團隊可能對此很掙扎,不過多大程度上能對UE4進行定製開發是(進度和可行性上)安全的是我們開發早期也很掙扎的一點。
——最初我們試驗了前向光源,不過對於延遲渲染中的貼花光源其實更易於優化,最終也對藝術家更有用。
*本頁中也解釋了,選擇不需要修改引擎的前向光源也有疫情期間的考慮,以及最終貼花光源成了有效且強力的擴展方案。
卡通光源(貼花光源)

卡通光源(貼花光源)

——添加一個有著切斷式衰減(cutout light attenuation)的貼花光源可以使場景通過3D燈光來照射同時又不看起來像3D。
——貼花光源支持任意的切口紋理。我們的藝術總監準備了7種紋理樣式來使貼花光源在不同的遊戲場景種有豐富的變化。
貼花光源以傳統光源的方式渲染

貼花光源以傳統光源的方式渲染

——貼花光源是延遲渲染光源,因此當貼花光源被放置在場景中時,他們是以傳統的球體或錐體的其它延遲光源的方式來運算的。
貼花光源渲染使用貼花體積

貼花光源渲染使用貼花體積

——貼花光源,基於其名字,它的特殊性就是可以指定一個貼花體積作為範圍來以貼花的形式渲染光照。
——場景藝術家可以通過傳統方式來設置貼花光源,並且他們可以為不同的光源指定不同的貼花體積。
使用貼花體積作為優化

使用貼花體積作為優化

——投影到一個貼花體積的一個明顯好處是它渲染了相對更小的一片範圍,因此有著更好的性能。
為牆壁添加貼花光源

為牆壁添加貼花光源

——除了提高性能外,貼花光源也為藝術家提供了為指定局部進行光照的更高的控制力。
——例如,我們可以分別為地面和牆壁指定不同的貼花光源(圖中紋樣不同)。
阻止漏光

阻止漏光

——在《惡靈附身2》中,我們的PBR光源可以使用光裁剪體積(clip volumes)來阻止點光源之類的漏光到隔壁房間。
——貼花體積也可以起到類似的阻止漏光的作用。
角色如何呢?

角色如何呢?

——在Hi-Fi RUSH中,角色光照和環境光照是分離的系統。這意味著前向光源與貼花光源都不影響角色。(角色的光照著色上一篇介紹過了)
*整體看來,在風格化渲染中光照更多的是服務於藝術表現而不是其物理特性,所以會比傳統BPBR渲染管線還拆解得更細一些。

2 實時陰影

*遊戲引擎中對於主光源的實時陰影其實是可以通過配置主光源直接實現的,但這裡基於性能和表現考慮做了拆解,且不止一種層面。
——環境和角色有合適的陰影即使對於卡通風格的渲染也是很重要的。
——如果無策略的採用陰影,性能開銷會變得很高。在UE4中,陰影可以看起來質量很高但開銷也很大。
——為了平衡質量和性能,我們對於如何渲染陰影非常仔細謹慎。
卡通光源不能投下陰影

卡通光源不能投下陰影

——我們出於對性能的考慮我們限制了主光源的陰影投射。卡通風格的光源無法投射陰影。
*這裡主要指光照渲染的物體範圍不能作為陰影渲染的物體範圍,否則性能和精度無法平衡。
多層陰影紋理(動態陰影)

多層陰影紋理(動態陰影)

——對於戶外環境陰影,我們使用UE4標準的多層陰影紋理(cascaded shadow maps)。
——我們有自己的一套預烘焙陰影紋理系統,用於表現部分平行光的陰影以提升性能,但對於場景的大部分,我們需要動態多層陰影紋理能提供給我們的質量。
*採用多層陰影紋理主要是讓陰影在較大和較小的尺度都能有不錯的精度,但是這個範圍也不是無限的,代價也是可觀的。
只投射陰影的光源(動態陰影)

只投射陰影的光源(動態陰影)

——對於多層陰影紋理之外的動態影子,藝術家需要使用只投射陰影的光源(shadow-only lights)。
——由於我們是2D卡通風格,因此光照和陰影分別有不同的多個光源也不是問題。
玩家的Shadow-Only光源

玩家的Shadow-Only光源

——玩家角色被分配了一個額外的shadow-only光源。在戶外區域,玩家角色不是通過多層陰影紋理,而是通過這個單獨的光源來渲染。
*這個方案既可以保證玩家角色陰影的精度,還可以只為這個陰影做風格化處理(上一篇提到的基於有向距離函數劃線的樣式)。
角色的Shadow-Only光源

角色的Shadow-Only光源

——巨型BOSS也被分配了單獨的shadow-only光源來使其看起來富有戲劇性。這一頁展示的陰影光源就只為BOSS投下陰影。
從暗到明的風格化漸變

從暗到明的風格化漸變

——玩家陰影和部分烘焙陰影紋理是通過風格化的由暗到明的過渡來進行繪製(圖中的框)。
——風格化的線在陰影距離投下陰影的物體較遠時變得更細。
膠囊陰影

膠囊陰影

——非玩家角色使用更高性能的膠囊體陰影作為其陰影方案。
——膠囊體陰影是UE4的標準功能。藝術家預先製作了能預估角色輪廓的膠囊體,它們被用來預估並逐像素計算主要的方向光源投下的軟影子。
——這對於照片質量真實的遊戲是不合適的,不過由於我們是卡通風格,因此可以接受這種斑點狀的陰影。
膠囊陰影可以在任意地方投影

膠囊陰影可以在任意地方投影

——由於膠囊陰影不需要額外的陰影投射燈光,因此我們能得到與場景光照條件無關的,室內室外都合適的次要角色陰影。
AO體積的貼花陰影

AO體積的貼花陰影

——膠囊陰影對於高空中、體型小的角色會投下過於大且分散的陰影。
——對於這種角色,我們實現了一個簡單的基於AO體積的貼花系統。CPU射線檢測被用來尋找空間中合適的貼花位置。
環境的Shadow-Only光源

環境的Shadow-Only光源

——最後,我們還允許引入一個shadow-only的聚光燈用於環境物體的投影。
——對於圖中的場景,移動的巨型機器手臂就是被這種燈光投影的。
*這裡提到的還都是實時影子,已經用了一種內置方案和額外的3個補充方案。遊戲渲染本身就是一些巨大的trade off,即使視覺上差不多的東西做法也可能完全不同,性能可能差十倍不止。

3 靜態烘焙陰影

*靜態烘焙陰影可以理解成預處理一些陰影計算需要的數據,但不完全是指烘焙成最終的紋理。
靜態陰影紋理

靜態陰影紋理

——(傳統的)靜態陰影紋理是指離線烘焙的陰影紋理。它們在性能提升和藝術家易用性兩方面都非常重要。
——UE4的烘焙陰影紋理被整合到Lightmass烘焙中(烘焙光照系統),不過我們為了更好的整合性,通過卡通風格的延遲渲染管線創造了我們自己的陰影烘焙系統。
離線烘焙了哪一部分?

離線烘焙了哪一部分?

——陰影紋理的組成通常包含兩步驟。
——第一步生成一個光源作為透視攝像機的深度紋理。
——第二部通過著色點(像素)在光源空間的深度(通過空間變換),和第一步的深度紋理中對應位置的值比較來產生實際的陰影。
——我們預先烘焙的是第一步的深度紋理。
*實時陰影計算的原理之前的其它文章也介紹過。當然這只是基礎思路,後續有各種方案來處理失真問題、精度問題和軟影子問題等。
靜態陰影紋理Actor

靜態陰影紋理Actor

——通過在場景中放置靜態陰影actors(UE中的基本物體單位),藝術家可以應用靜態陰影紋理。
——這些actors由兩部分組成:一個負責拍攝深度紋理的攝像機,和一個負責渲染陰影紋理的延遲渲染體積包圍盒(a deferred box volume for rendering the shadow map)。
最大化陰影紋理覆蓋(對指定範圍的)

最大化陰影紋理覆蓋(對指定範圍的)

——藝術家使用屏幕右下角的深度紋理預覽來手動最大化深度紋理的覆蓋,以提升陰影質量。
*如果依賴引擎自動化的陰影,覆蓋範圍往往是引擎通過算法動態估算的。另外,烘焙的就是圖中這個紋理了。
計算屏幕空間陰影紋理

計算屏幕空間陰影紋理

——通過比較著色點在光源空間中的深度與烘焙深度紋理中的深度值,就可以渲染出指定的貼花體積範圍內的陰影紋理了(以屏幕空間陰影紋理的方式)。
*屏幕空間渲染,可以理解成對指定範圍內的像素進行逐像素運算得到的渲染結果。這裡指定一個貼花體積作為範圍主要是性能優化考慮。
陰影紋理抗鋸齒

陰影紋理抗鋸齒

——未進行抗鋸齒的陰影紋理會有明顯的鋸齒感。為此我們採用了4X4的PCF(Percentage Close Filtering)作為陰影紋理的抗鋸齒方案。
*PCF可以理解成一種把周圍幾個像素的權重進行混合的過濾器(Filter),具體算法參考文末資料。
靜態陰影紋理佈置

靜態陰影紋理佈置

——這裡是是一張展示了靜態陰影紋理佈置的截圖。許多覆蓋了一定小範圍的靜態紋理攝像機被放置在關卡中。
不同的陰影紋理攝像機

不同的陰影紋理攝像機

——即使圖中的很小的把手也有單獨的靜態陰影紋理。
靜態陰影紋理預載

靜態陰影紋理預載

——使用了靜態陰影紋理不僅是基於藝術設計的考慮,也是處於紋理預載(streaming )效率的需要。我們的首要關切點是內存用量和預載故障(streaming hitches)方面。
——我們通過監控紋理尺寸來管理靜態陰影紋理預載的工作量,並且關注在如何在多幀之間分配這些預載的工作量。為此,我們不能接受單個過大的陰影紋理。
——我們在預載隊列中通過設置每幀內存限制來平均分配預載的工作量。
*靜態陰影紋理這一步更多的就是場景美術的體力活了,要在美術表現和性能之間做一個取捨。

4 全局光照

*這裡的全局光照主要基於預採樣的一種補充光照組件,另外提到probe探針就是基於球諧光照(可能結合CubeMap或3D紋理)的低頻光照技術——低頻指無法反映出信號源劇烈變化的部分。至於使用方式和光照覆蓋的範圍,後面會提到。
包含了全局光照的卡通渲染

包含了全局光照的卡通渲染

——我們認為支持標準3D燈光要素例如全局光照(GI)是很重要的(圖中的數據球及周圍)。
採用什麼方案做GI呢

採用什麼方案做GI呢

——在項目初期我們準備嘗試UE4的Lightmass組件,因為它帶來的烘焙光源有著很高質量,我們非常滿意。
——但同時,我們也考慮到使用Lightmass的光照紋理會為藝術家帶來處理光照UV(的難度)和較長的烘焙時間,這些因素是有著較高的時間成本的。
——高質量的卡通風格資源需要藝術家不斷手動調整,因此場景編輯在整個項目的過程中會是非常忙碌的工作。
*這裡主要就談到質量與協同工作便利性的取捨,實際上這一取捨在工業化遊戲開發中會不斷面對。
讓我們定製化UE4的體積光紋理

讓我們定製化UE4的體積光紋理

——我們發現(單獨)使用Lightmass中的體積光照紋理(volumetric lightmaps)對於環境光照也很有用,它可以有更快的烘焙速度且不需要光照紋理的UV。
——我們決定定製化體積光照紋理的功能,聚焦在提高烘焙迭代的速度和易用性上。
局部體積GI光照

局部體積GI光照

——一個允許我們這麼定製化修改的大因素是我們的遊戲有著卡通風格的藝術方向,這意味著我們可以藝術地(artistically)選擇地圖上哪些部分需要全局光照。
——在這一頁圖中,只有窗戶周圍一小塊區域設置了全局光照,(即使如此)對於整體畫面也足夠了。
GI烘焙限制在需要的區域

GI烘焙限制在需要的區域

——這裡展示了同一關卡中GI光探針調試顯示(debug display)開啟的樣子。
——場景藝術家決定在較強的散射性的物體(strong emissives)周圍烘焙光探針,不過對於有著強光源照亮的區域則不烘焙探針。
世界空間中的體積光源

世界空間中的體積光源

——UE4有一個稱為Lightmass重要性體積(importance volume)的內部功能,它能使光探針烘焙限制在指定的範圍內。
——我們修改定製了這一功能以實現我們自己的全局光照體積actor。
——在UE4的vanilla中,光探針數據是逐關卡存儲的;在經過我們修改後,在我們的遊戲中光探針數據是逐actor存儲的。
優化體積光紋理數據

優化體積光紋理數據

——另外必須提到的是,我們優化了UE4的體積光照紋理的數據以節省內存(圖中),因為我們只需要無方向性的全局光照信息。
——我們把單個光探針球諧紋理(spherical harmonics 3d textures)從8減到1。這節省了很多內存。
世界體積光烘焙流程

世界體積光烘焙流程

——對於前面我強調過的烘焙迭代速度和易用性等關鍵點,我會快速的展示一下GI烘焙工作流的總覽。
——首先我們通過一個GI光照體積來圍住需要添加GI的區域。
世界體積光烘焙流程

世界體積光烘焙流程

——這之後,藝術家選擇菜單中的Build Selected Volumes功能。
——在定製化的烘焙代碼被執行後,GI被烘焙到限制的區域中。
——烘焙時間依賴於Lightmass設置和PC的性能,不過總的來說對於標準的開發PC來說,一次GI烘焙只需要1-2分鐘時間。
——由於烘焙被修改成針對單一actor的,藝術家可以快速調整迭代指定區域的烘焙結果。
世界體積光烘焙參數

世界體積光烘焙參數

——GI光體積同時包含了烘焙和渲染時的參數。
——一個常用的參數時細節單元尺寸(detail cell size),它能控制光探針散步的粒度。
——我們的場景藝術家使用這一參數來平衡質量和內存用量。
*整個這一節主要在說trade off的事,既有質量和性能的權衡,也有絕對質量和易用程度之間的權衡。

結語

在原文章的PDF中,在現場版分享內容之後他們還補充了4個短課題,分別是GBuffer Stencil 、Volumetric Fog 、Toon Lensflare 、GPU Physics Simulation。由於篇幅原因這裡無法包括在內,有興趣的可以去找原文來看看。
最近剛好聽到《遊戲帝國 第二季 EP6》,提到了EPIC創始人對於引擎和開發效率之間的關係。其實從遊戲行業進入需要協同開發階段以來,這就是項目規劃和管理的重要一環了。從這篇分享中的很多方面也能看出,實際遊戲開發中甚至都不是用的引擎中的內置最先進的功能,因為還有易用性和性能之類很多維度需要考慮。
另外一個點其實他們可能提到的不多,但確實他們的很多人員是從惡靈附身和鬼線東京團隊中逐步成長起來的,無論遊戲賣的怎樣,在UE4的技術積累上他們已經達到了相對黃金的階段。這也是我對於微軟砍掉這個工作室經濟上不理解的地方,畢竟這種項目團隊積累不是說隨便招幾十個人就能很快得到的,這時候放棄等於團隊建設和培養成本全放棄了。

最後還是資料鏈接:
GDC Vault的《3D-Toon-Rendering-in-HiFi Rush》
介紹Percentage-Closer Filtering的一篇文檔

© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com