Unity TA總監王靖:Unity如何實現美術畫質升級?

遊資網發表於2020-12-08
11月19日,中國 Unity 線上技術大會的直播中,擔任Unity中國區的技術美術總監王靖,為我們分享了遊戲畫質的提升之路。

Unity TA總監王靖:Unity如何實現美術畫質升級?

以下是演講實錄:

大家晚上!我是王靖,目前在Unity擔任中國區的技術美術總監。今天我和大家分享的主題是遊戲畫質提升之路。在分享開始之前先簡單介紹一下我們Unity技術美術的團隊。

我們Unity技術美術團隊除了平時會製作Unity內部的一些專案,比如大家看到的一些demo以外,還會幫助我們客戶定製一些Unity引擎的渲染效果,美術流程,還有技術支援。比如說解決問題、培訓等等的。目的就是幫助使用Unity引擎的客戶提升整個專案畫面的品質。

下面我們進入正式的分享環節。我們Unity從創立開始每年都會應用最先進的渲染技術製作demo。從2015年的《Black Smith》到2016年的《亞當》,2018年的《死者之書》,包括2019年和2020年《異教徒》的兩部分影視短片。其實在我們Unity的很多影視或者動畫demo中都能找到很多應用在現在遊戲渲染中的原型。比如說《Black Smith》的角色陰影,《亞當》中的PBR渲染效果,《死者之書》中植物的風場效果等等。在國內我們Unity也通過技術美術支援服務的方式幫助很多客戶把一些好的效果和優化技術應用到了遊戲中。

我們首先看一下《異教徒》中最新的角色製作流程。主角的頭部和表情和貼圖都是通過我們說的4D捕捉的流程製作的。整套流程並沒有說是影視或者遊戲之分。遊戲也完全可以直接用這套流程來做。目前我們Unity支援的很多遊戲專案都在使用注入動作捕捉、表情捕捉、照片建模或者是掃描建模這類的流程來提高整個模型貼圖製作的精度和還原度。主要還是針對高質量的寫實類的遊戲。

Unity TA總監王靖:Unity如何實現美術畫質升級?

來看一下這個流程整個視訊的展示。我們現在看到的是真人在鏡頭前捕捉的過程。他在模擬一些表情,說話。現在這個是我們看到的初步捕捉完成之後整個角色的表情和模型。可以看到這個時候還有很多頂點warp的問題。

Unity TA總監王靖:Unity如何實現美術畫質升級?

之後,我們會把我們的模型匯入到RS3D中,一個是對warp的頂點進行修正。可以看到這是我們把頂點都修正完之後的結果。這是加入了高模的細節,之後整個就是人素模的表情。

這是整個捕捉完了之後加上材質、渲染之後在引擎裡面渲染的效果。

現在很多團隊一看到照片建模就望而卻步,特別是手遊團隊,其實這套流程已經非常成熟了,我們再來看個視訊。

Unity TA總監王靖:Unity如何實現美術畫質升級?

這是一個使用RS3D解決warp頂點的一個演示視訊。還可以用來將角色一系列掃描的表情轉化為相同拓撲和紋理座標的角色模型。這樣就可以將整個流程完美地應用到遊戲的低模上。

整個過程都是通過程式化節點的方式計算的,美術人員也沒有太多的工作量。我們可以捕捉完一套表情應用給不同的模型。可以大量地節省我們模型捕捉的成本。

主角的夾克製作我們使用了Marvelous Designer,相信現在的3D美術對這款工具應該都不會陌生。我們先在Marvelous Designer中打板,跟裁縫製作真實衣服打板是一樣的,因此我們也調研了很多真實夾克製作的打板圖,現在看到的就是最終確定的效果。大家看到右邊是Marvelous裡面打板的效果。

Unity TA總監王靖:Unity如何實現美術畫質升級?

最終軟體會將每一塊麵縫合起來,經過布料模擬來配合整個角色的動作,產生自然的佈置。最後還會在ZBrush中新增一些細節。這個流程同樣在國內遊戲中也是一個很標準的工作流程。

再來看使用這個Marvelous來製作夾克還有一個好處,可以很好地模擬布料動畫。右邊是Marvelous中使用角色簡模進行脫夾克的布料模擬,左邊是我們在Unity中渲染的效果。遊戲中我們可以使用Maya或者Blender的外掛快速地將物理模擬的動畫轉化成骨骼蒙皮動畫輸送給我們的遊戲引擎進行實時渲染。

Unity TA總監王靖:Unity如何實現美術畫質升級?

渲染方面我們看一下。渲染方面我們今天主要看一下眼球和皮膚的渲染。這兩部分後面我會講一下怎麼樣在移動端去實現。

《異教徒》的主角皮膚用了很多的渲染技術。主要有上面幾類。今天我們主要看一下其中最重要的一個效果,就是我們平時或者美術經常說的皮膚的非常普遍的現象,就是3S效果,次表面散射。這個效果也是在做皮膚渲染中需要重點做的。我們現在看的是HDRP主機遊戲中怎麼做這個皮膚,後面會講手遊。

直接用《異教徒》的角色看一下3S效果的對比,這是沒開啟的,這是開啟後的效果,這明顯是一個背光的效果,特別是耳朵周圍的透紅的現象,這就是3S的次表面散射的標準的現象。可以對比地看一下。這是沒的,這是有的

Unity TA總監王靖:Unity如何實現美術畫質升級?

看一個更誇張的效果,左邊是沒有3S效果的,右邊是開啟的,這個效果更誇張,好像做了一次磨皮,右邊的效果更像皮膚,有點蠟的感覺。

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們要還原一個效果或者是提升一個效果,首先就要先了解這個效果,這樣就能更好地為我們做優化打下基礎。我們快速地瞭解一下什麼是3S的效果?也就是次表面散射。光從一種介質進入到另一種介質有三種形態,第一種是反射,第二種是次表面散射,第三種是透射。其中反射是我們現在非常火的BRDF,也就是PBR材質中用到的雙向反射分佈函式。

我們通常說的次表面散射光照傳輸模型就是BSSRDF,我們叫它雙向表面散射反射函式,就是現在大家看到的這個函式。

Unity TA總監王靖:Unity如何實現美術畫質升級?

然後其中一個非常關鍵的引數就是這個R,通常次表面散射的光線密度分佈是一個各向同性同向的函式,一個畫素受周圍畫素光照影響的比例和兩個畫素之間的距離有關,這個密度分佈函式就是R,R的計算是非常複雜的。

2001年Jensen提出了一個Diffusion Profile擴散剖面。這個Diffusion Profile是用來描述光線如何在半透明物體中進行擴散和分佈的函式。可以簡單地理解為Diffusion Profile就是一張權重圖,不同的皮膚渲染方法通常就是對Diffusion Profile的不同的近似。初期的Diffusion Profile使用的是偶極子來擬合計算的,但是對於皮膚來說效果不理想。之後針對這個Diffusion Profile圖形界進行了一頓猛攻,出現了多極子和高斯函式求和的擬合方法。有興趣的同學可以搜這些方法來看,我就不展開講了。

總之,後續這一系列的改進都是為了更好地擬合我們看到的這個R,就是基於物理函式計算結果的曲線。

看左邊這張圖就是Diffusion Profile的計算結果,就好像我們拿一個手電筒垂直地照在了我們的皮膚上,看到光線到表面中心點周圍的一個光暈,從右邊這張圖看到RGB擴散的範圍是不一樣的。這個紅色的光比綠色的光、藍色的光散射得更遠,所以耳朵和鼻子部位通常是紅彤彤的。美術上,感官上我們看到的一些效果往往在做渲染的背後是一大堆的理論,我們只有更好地理解這些現象背後的原理才能做出最佳的實際的效果。

Unity TA總監王靖:Unity如何實現美術畫質升級?

發展到這個時候的次表面散射還只是一個離線渲染的階段,只能用於影視當中。

2009年之後這個3S逐漸進入了我們實時渲染的階段。首先是螢幕空間的模糊演算法,價效比比紋理空間提高很多。這個模糊的過程就是根據我們前面說的Diffusion Profile對周圍的畫素進行加權求和,來模擬次表面散射的過程。

之後是2005年出來了一個可分離次表面散射,我們稱之為4S,它完全是從優化的角度出發,並不是純粹的數學推導,它是使用兩個可分一維卷積來近似,效率得到了極大的提升。

下面的連結就是可分離次表面散射的一個paper,有興趣的同學可以仔細研究。

Unity TA總監王靖:Unity如何實現美術畫質升級?

上面這些技術是目前PC和主機3A遊戲中主流的次表面散射的技術。我們Unity的《異教徒》的角色並沒有直接使用,而是在可分離次表面散射的基礎上進行了改良和一些提升。

我們主要是針對可分離次表面散射上的問題進行了改良和提升。問題很多。我們今天講一些主要的改進。

第一個是擬合結果不正確。這個單一的高斯函式在近似多層散射方面做得很好。然而,即使是兩種高斯的混合也很難準確地表示單次散射和多層散射的組合。

在影像中我們可以看到這個結果是白色的,而雙高斯近似是紅色的,它其實擬合的結果並不是很好。

Unity TA總監王靖:Unity如何實現美術畫質升級?

另一個問題就是對美術不友好。高斯分佈是一個數學概念,在3S中沒有物理意義,當你使用兩個lerp引數的時候它是7個自由度的組合,如果不太清楚如何設定它們,很難得到一個有意義的組合。一個資深的美術仍然是可以使用這個高斯組合的模型取得很好的效果的。可是,這是一個漫長的過程,並不適合我們商業引擎Unity。

Unity TA總監王靖:Unity如何實現美術畫質升級?

這也是現在我在支援我們很多專案中經常遇到的一個問題,現在很多專案的效果做得不好並不是說渲染技術的問題,而是美術不知道該怎麼調。因為很多專案的渲染比如說Shader和工具大部分都是由圖形程式或者是偏技術的TA編寫的,很多引數曝露出來給美術,美術根本看不懂。像上面這種引數連規範都沒法寫,你要寫明白,就要給美術把前面所有的數學公式講明白才行,等美術理解掌握了,你按照國內一個專案的週期,可能專案就做完了。

我們看看我們Unity《異教徒》的這個皮膚3S的改良。Unity實現了Burley的一個規範化的擴散模型。我們稱之為迪斯尼3S,它為蒙特卡羅模擬得到的一個參考資料提供了一個精確的擬合。這意味著同時要考慮單次和多次的散射。它只有兩個引數,體積反照率A和形狀引數S,它們都可以解釋為顏色,這個形狀引數與散射距離成反比,這就是我們在UI中曝露出來的引數。

Unity TA總監王靖:Unity如何實現美術畫質升級?

左邊是我們HDRP中Diffusion Profile的引數,大家可以發現更簡單,更符合美術的理解。同時,我們還做了一個優化,Diffusion Profile這個擴散剖面被歸一化了,並且可以直接做概率密度函式,這也是蒙特卡羅積分中一個很重要的性質。

實現方面,《異教徒》的3S效果也做了很多的優化,為了加強視覺統一性,我們使用Surface albedo作為volume albedo,我們提供兩個albedo貼圖的選項。第一個是post scatter模式。當這個albedo紋理和一些由於3S導致的顏色溢位,比如你這個albedo貼圖是照片掃描或者是採集來的,這種模式下我們就只在出口位置做一次反照率。還有一種是pre-and post scatter模式,這種模式會有效地模糊albedo貼圖,這個可能會導致更柔和、更自然的外觀。比如你的紋理是在DCC工具中製作的,或者是手工製作,你可以使用這種模式。

我們來看一下效果的對比。這是沒有3S效果,這是我們第一種post scatter的模式。這是第二種模式,就是pre-and post scatter。對比一下看一眼,這是第一種,更清晰一些。第二種就是會模糊一些。這是兩種模式的對比。

Unity TA總監王靖:Unity如何實現美術畫質升級?

Unity TA總監王靖:Unity如何實現美術畫質升級?

Unity TA總監王靖:Unity如何實現美術畫質升級?

另外,我們這個3S還負責背光物體半透明的外觀,但是出於效率的原因,我們以一種更簡單的方式來處理這兩種效果。我們採用了兩種方法,第一種是隻適用於薄的物體,通常我們說的葉子。第二種是用來處理通用的半透明物體。兩者之間主要的區別,對於相對薄的物體,由於幾何體本身是薄的,所以它的正面和背面的陰影是相同的。所以我們在DCC工具中 烘焙一張厚度圖來獲取,對於厚的物體重用正面的陰影狀態顯然是不行的,所以我們使用的是shadowmap和距離引數結合的方式來獲取厚度。

這個優化我們同樣為很多移動客戶進行了定製,後面我們有案例。

我們看一下兩種效果的對比。第一張圖是薄的物體,可以看到它模擬樹葉透光的效果。後面就是這個耳朵。我們可以看到這個厚和薄之間的區別,兩個引數之間的。

Unity TA總監王靖:Unity如何實現美術畫質升級?

再來看一下純效率方面的優化。G-Buffer Pass,根據材質型別去標記它的stencil,這樣可以減少不必要的3S pass畫素的繪製,我們還標記次表面照明緩衝區,以避免在3S pass期間執行逐畫素模板測試,還實現了一個基本的LOD的系統。對取樣分佈進行隨機逐畫素的旋轉。

Unity TA總監王靖:Unity如何實現美術畫質升級?

最後我們再來看看整個的效率表現。在PS4上,我們限制在每個畫素21個取樣,使用CS進行卷積合併diffuse和specular lighting buffers,GPU整個耗時在1.16毫秒左右。由於今天時間有限,所以我就先講這麼多,關於皮膚這塊。有興趣的同學可以後面再交流。

Unity TA總監王靖:Unity如何實現美術畫質升級?

講了這麼多,我們如何使用我們這個皮膚材質的?很簡單,現在的主機專案只要使用我們這個ShaderGraph就足夠了。在最新的HDRP的渲染管線的ShaderGraph中我們已經加入了Stack Lit Master節點,這個節點可以說完全基於我們Unity《異教徒》demo開發的。《異教徒》開發完成之後對ShaderGraph進行了一次重要的升級。

我們來看一下這個Stack Lit這個Master節點。主要就是在這個節點上勾選surface scatering這個選項,我們就可以看到皮膚的3S相關的設定就可以出現了,包括我們前面說的Diffusion Profile的設定。可以很好地勝任我們皮膚渲染的工作。感興趣的同學可以自己去嘗試一下。而且我們現在整個《異教徒》角色的案例官方也在資源商店中免費給大家開放學習和使用了。

我們看一下最終的效果。這是《異教徒》中的角色皮膚渲染效果。這是《Wind-Up》中小女孩的皮膚渲染效果,我們可以看一下這個小女孩耳朵3S投射的效果。這是一個樹葉的效果。它右邊的Diffusion Profile針對每一個角色或者是物體都是不一樣的。

Unity TA總監王靖:Unity如何實現美術畫質升級?

Unity TA總監王靖:Unity如何實現美術畫質升級?

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們再看一下眼睛的做法。我們說的眼睛是心靈的視窗,同我們畫人頭像一樣,眼睛是要重要刻劃的,做渲染也是同樣重要的。《異教徒》主角的顏色使用了非常多的技術。

最主要的是基於物理的折射,但是它與複雜度成正比的。這個物理折射雖然給我們帶來了效果好一些,但是它也更費一些渲染。這個程式碼我就貼在這兒了,我們可以看一下。主要看最後一行,它有一個mask的部分,在虹膜座標上進行了一定量的偏移,目的就是在虹膜、鞏膜過渡的位置新增異色邊緣的渲染效果。而且整個texcoard座標位置是為了後面取樣這個虹膜部分的貼圖做準備的,我們繼續往後看。

Unity TA總監王靖:Unity如何實現美術畫質升級?

通過剛才的公式可以看到為了實現這個物理折射的計算,我們需要在眼球模型的物體空間進行一些對應的計算。所以說我們要對這個眼球模型本身的製作提出要求。這就是主角眼球。我們可以看它主要需要規範座標系。也就是說眼球的中心作為模型的原點,讓眼球縱向朝向Z軸,其次是我們需要做出這個眼球前方區的一個結構,這是為了得到更好的物理折射,同時也可以用來區分瞳孔的位置。

我們通過一個圖來說一下這個shader的計算。為了更好地獲得這個物理折射所需要的各個引數,在眼球渲染的shader中需要通過在物體空間的Z軸取一個座標,來動態地劃分這個虹膜和鞏膜的shader區域。大家可以理解為在物體的Z軸投射了一個平面,像我們示意圖展示的,以此劃分好區域,並分別處理好兩個位置的渲染,這樣的座標劃分一舉多得的。

Unity TA總監王靖:Unity如何實現美術畫質升級?

在劃分虹膜和鞏膜的同時也方便我們實現異色邊緣的效果。這樣的做法大家覺得很複雜,但是因為各個區域的取樣座標是在物體空間內動態計算的,所以我們可以將同一套眼球的貼圖配置給不同的眼球模型,也可以進行勾畫不同眼球的貼圖。

通過這個眼球的案例,我相信大家可以發現其實一些渲染效果的背後往往都伴隨著特殊製作的流程和規範,不只是寫個shader那麼簡單。

這也是現在很多效果,大家用的相同的渲染技術,但是做出來的效果千差萬別。

為了實現這個角色的眼睛很好的效果,我們使用了一種Cone Mapping的技術,眼球周圍分佈四個虛擬點,根據這四個虛擬點計算,將這個虛擬點融入到我們蒙皮中,這樣可以很好地使AO匹配我們角色眼睛的動畫。

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們來看個視訊。我們這個眼睛製作完之後,由於上面說的流程,這個眼睛是可以做到一些程式化的效果,比如我們可以動態地改變異色邊緣的大小,可以改變它的折射效果,包括還可以給瞳孔換顏色,都是可以的。

Unity TA總監王靖:Unity如何實現美術畫質升級?

講了這麼多,大家可能覺得你做這麼個眼睛有沒有必要?我們看一下這個對比。這是我們看到的做了渲染之後的眼睛的效果。這是沒有的效果。這個就是我們平時做專案眼睛渲染的效果。如果你不做任何的處理,它就是個死魚眼,不對比,你看這個效果時間長了還覺得它挺好,很多人覺得夠用了。但是,你一對比,這個效果可能接受不了。所以說做效果一定要找到一個對比。我們可以看這兩個效果的對比。

Unity TA總監王靖:Unity如何實現美術畫質升級?

Unity TA總監王靖:Unity如何實現美術畫質升級?

同樣的我們這個眼睛在最新的HDRP的ShaderGraph中也可以找到Eye Master這個節點來使用。

我們看一下這個皮膚渲染在手機上一般怎麼做提升的。在移動端我們為客戶定製的方案就是用手機上的預積分的皮膚折射技術,這個方法最早出現在2010年,之後因為PC和主機硬體快速發展就淡出了人們的視野。但是,現在卻成為了手遊皮膚渲染的主流方案。

Unity TA總監王靖:Unity如何實現美術畫質升級?

上面這個連結是2001年siggraph上的一篇專門講遊戲分皮膚折射的技術,我們可以看一下。左邊是貼圖空間的diffusion,我們剛剛說的Diffusion Profile的方式渲染的效果。右邊是預積分皮膚折射的結果,肉眼上很難看出來這個區別。

這個預積分皮膚折射是一個從結果反推實現的方案,具體思路是把次表面反射的效果預計算成一張二維的紋理查詢表,這個查詢表的引數分別是NdotL和曲率,能反映出光照隨著曲率的變化。

看一下左邊這張積分貼圖。它的X座標取樣是我們NdotL後的數值。重點說一下Y座標。這個Y座標代表的是曲率。通常曲率和NdotL索引上圖中的預積分的LUT貼圖就可以了。

中間這張圖是可以用工具bake生成的。NPR的渲染中也可以讓美術直接畫,還可以在模型上做完效果再用工具去反推這張圖。

Unity TA總監王靖:Unity如何實現美術畫質升級?

最右邊是如何使用兩個導數同時繪製曲率的圖式。最終結果是R越小,這個法線變化越大,意思就是曲率越大。也就是說我們下面看到的R值越小,皮膚表面更容易產生次表面散射,而類似耳朵邊緣、鼻翼的位置,這種方法非常適合在移動遊戲上使用,效率高,效果也不差。很多主機遊戲也是使用這個方案的。比如《最終幻想15》中的人物皮膚渲染就是大量地用到了這個預積分的皮膚渲染。還有前一陣子非常火的主機遊戲《對馬島》也是用了這種方法。

我們看一下,我們還是做了一些優化的,比如我們是在URP管線上實現了這套皮膚渲染的。在URP管線裡面加入了PBR的工作流程,使用了cone map去替代(不清楚)的計算,我們也支援透明物體的厚和薄的物體,我們還使用了Mask Map去區分這個皮膚和普通材質。

我們看一下在手機上這個效果的對比。這是沒有的效果。這是加入了我們說預積分3S的效果。可以看到這個效果還是比較明顯的。特別是背面這塊。

Unity TA總監王靖:Unity如何實現美術畫質升級?

然後我們來看一下眼睛的渲染在移動端是怎麼實現的。主要是通過移動端的優化演算法來模擬的。我們使用了Parallax Refraction的方法來模擬refraction的效果。可以看到整個演算法比我們《異教徒》眼睛物理折射的演算法簡單很多,主要原因它就是沒有refraction這個函式了。這樣就說明了它不是一個基於物理的方法,其實是一個影視差貼圖模擬的方法。

右邊是兩種演算法的對比。我們可以看到Parallax Refraction的方法也能近似地達到虹膜折射的效果。這也是目前在手機上模擬眼球最常見的方法。如果一些高階機的局外選人的介面當然也可以用基於物理的演算法。

Unity TA總監王靖:Unity如何實現美術畫質升級?

左邊是URP管線上我們做了一個移動端的眼球的展示。可以看到這個眼球的面數少了很多,眼睛也變成了一個半球,Parallax這個引數的height這個值從0到3的變化。它這個值越大,扭曲的效果就越大,模擬折射的效果。

這是我們在移動端給角色加入了眼睛畫色之後的效果。

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們再看一下頭髮。頭發現在也是做很多遊戲或者虛擬計算裡面用的。現在有很多頭髮的解決方案,有使用動態骨骼的,我見過很多主機遊戲也在用NV的hairworks。我們Unity是將AMD的 TressFX,海飛絲這個頭髮的效果移植到了我們引擎中,目前支援URP和HDRP的管線。

我們看一下目前測試的效果。其實效果還是可以的,跟TressFX官方演示的效果差不多。

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們看一下它的效率。剛才看的那個demo在URP管線上,高通865的晶片,1萬根髮絲能跑60幀,效率還是非常高的。

再看一下皮毛的渲染。我們一般給客戶使用Shell的方式,在URP管線移動端為客戶也實現過絨毛的效果。這裡需要注意的是這個URP管線的shader的實現是無法直接在shader上寫多pass的,因為在URP管線上你是需要在render feature中繪製每一步的Shell並且可以很容易地加入LOD,可以根據距離的遠近來刪減這個Shell的部分。

我們還加入了一個毛髮梳理的流程。這是在Mari中為貓梳毛,會生成一張flow map,這樣的話你給美術製作更直觀,而且它上面還有毛的走線都是能看到的。

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們來看一下,左邊是沒有梳毛的效果,中間是梳過了,中間這個毛髮生長是跟我們在Mari中梳理的方向是一致的。最右邊的是沒有fur的效果,這應該也是現在主流的做法,在Zbrush中刷個紋理,再插個片。

Unity TA總監王靖:Unity如何實現美術畫質升級?

你們可以看一下左邊這個是沒梳的,好像這個毛不順,有點溼了炸毛的感覺,中間的更順滑一些。包括你可以刷它很多的資訊,包括它的粗細、疏密,都可以。

場景方面,今天我們來看一個現在非常火的效果,就是這個體積雲。我們在手機上最近這段時間很多客戶都定製了這種體積雲。這個體積雲的效果真的是特別火,很多手遊專案都在用了。在主機和影視渲染中體積雲的效果已經非常成熟了,2015年Schneider在ZGrapher上的演講。到2017年這個《地平線》,再到2019年的《荒野大鏢客》,這個天空體積雲的渲染給大家都帶來了非常震撼的效果。主機或者影視上實時渲染的體積雲主要的技術重點就是螢幕空間的ray marching,程式化控制這個雲的形狀和光照三大部分。

Unity TA總監王靖:Unity如何實現美術畫質升級?

我們看一下在移動端為客戶定製這個體積雲效果的優化。我們知道體積雲最費的就是ray marching,主要就是它這個Density marching和Shadow marching,主要的影響因素是解析度。我們看一下是怎麼優化的。我們主要針對以下四點進行優化的。

首先我們來看一下Scale方面的優化。《地平線》做法是marching四分之一的解析度,它是Jitter sample4×4的一個quard,16幀構建一個雲的畫面。《地平線》的做法的優點,假如這個鏡頭移動很慢,它會有足夠的細節,問題就是當它這個幀率過低或者是鏡頭的移動速度過慢的時候會出現鬼影,這種做法顯然不太適合我們手機遊戲。
Unity TA總監王靖:Unity如何實現美術畫質升級?

我們可以看一下這是《地平線》16幀構建一個雲的事例。而我們的做法是使用2×2一半的quard去進行Jitter sample,用4幀去構建一個解析度的雲的畫面。優點就是它的構建速度很快。缺點就是它這個高頻細節不夠,可能會出現block的現象,一塊一塊的馬賽克。但是有它是手遊,一般螢幕畫素比較密集,所以很好地規避掉了這個問題。這也是我們現在為什麼會採用這種優化方案的原因。就是在你手機上這個問題它不明顯。

Unity TA總監王靖:Unity如何實現美術畫質升級?

還有一個,在手機上我們也使用了blue noise,很多現在的優化都在用,來擾動取樣案時間的起始位置,同樣也使用Tenporal來疊加每一幀採用的結果。就類似於TAA的一種方式。

Unity TA總監王靖:Unity如何實現美術畫質升級?

並且我們為不同的平臺設定了雲的IOD,這也可以適配高中低端的手機裝置。我們看一下右邊。右邊是不同配置下的渲染的結果,可以看一下它是從上到下,分別是從高到低,我們能明顯地看出來它這個block的現象越來越重。

左邊是我們目前高中低端手機的配置,可以看一下Marching Step取樣的部署和Shadow Simple的count是個陰影取樣的部署,我們會針對不同的機型做定製化的優化。

Unity TA總監王靖:Unity如何實現美術畫質升級?

然後我們看一下《地平線》它使用了大型三維噪聲和二維噪聲建模雲的細節。它會有一個豐富的外觀。它每一個marching和Shadow Simple都需要大量的texture fetches,這就帶來了一個什麼問題,在移動端這個頻寬受不了,包括散熱這些是不行的,所以說我們預先過濾我們這個perlin和worley的噪聲,不同頻率的噪聲我們把它合併到一個單一的3D紋理裡面,並只在執行時獲取這個紋理。

Unity TA總監王靖:Unity如何實現美術畫質升級?

左邊上面《地平線》運用到了3D紋理,這都是3D紋理,不是2D紋理,可以看到這個數量還是非常恐怖的。

下面是我們最終用到的只有一張3D紋理和一張2D紋理。

再來看一下光照方面。我們只使用了三次Shadow Simple來降低這個質量,也是為了提升效率。我們只對基礎的雲的形狀進行應用貼圖的marching,忽略細節紋理,主要是為了接受這個頻寬。

此外,我們還加入了體積光大件散射包括對雲的影響,包括晝夜變換,天氣變換,也會產生不同的聚散的變換。可以看一下最終的效果。

Unity TA總監王靖:Unity如何實現美術畫質升級?

這是我們整個雲,可以看到我們加入了晝夜變換,包括你看這個雲還可以接受到大氣散射的效果。雲有一種黃昏、火燒雲的效果。其實這個雲本身是慢慢地在聚合的,只是我們現在看不到這個效果。

包括我們這個雲還會有遮擋,它不會跟天窗盒裡面的雲一樣。我們可以看左邊這個星球,它是遮擋在這個雲後面的,這個星球我們應是用一個feature畫上去的,畫到天空上的,也不需要你美術去做模型,它是被雲遮擋住的,比如有山聳入這個雲中它可以產生體積雲遮擋的效果。

可以看到這個晝夜變換,而且這個雲對於陽光遮擋的效果也非常好。我們可以快進地看一下這個雲聚合的效果。

這是大氣散射對這個雲的影響。

我們看一下它的效率。我們是在iPhoneX上測試的,解析度是1125×2436,標準的解析度,整個的雲我們marching step的數量是64步,shadow sample取樣數是6,整個GPU耗時6.54毫秒,就是說這個消耗還是比較大的。但是由於現在很多的高階手機,尤其是iPhone12也出來了,這個東西在場景優化比較好的情況下也是可以用的,是完全沒問題的。

可能今天講得有點快,但是內容就講完了。

相關文章