Unity TA总监王靖:Unity如何实现美术画质升级?
10月9日,中國(guó) Unity 線上技術(shù)大會(huì)的直播中,擔(dān)任Unity中國(guó)區(qū)的技術(shù)美術(shù)總監(jiān)王靖,為我們分享了游戲畫質(zhì)的提升之路。
?
以下是演講實(shí)錄:
大家晚上!我是王靖,目前在Unity擔(dān)任中國(guó)區(qū)的技術(shù)美術(shù)總監(jiān)。今天我和大家分享的主題是游戲畫質(zhì)提升之路。在分享開始之前先簡(jiǎn)單介紹一下我們Unity技術(shù)美術(shù)的團(tuán)隊(duì)。
我們Unity技術(shù)美術(shù)團(tuán)隊(duì)除了平時(shí)會(huì)制作Unity內(nèi)部的一些項(xiàng)目,比如大家看到的一些demo以外,還會(huì)幫助我們客戶定制一些Unity引擎的渲染效果,美術(shù)流程,還有技術(shù)支持。比如說解決問題、培訓(xùn)等等的。目的就是幫助使用Unity引擎的客戶提升整個(gè)項(xiàng)目畫面的品質(zhì)。
下面我們進(jìn)入正式的分享環(huán)節(jié)。我們Unity從創(chuàng)立開始每年都會(huì)應(yīng)用最先進(jìn)的渲染技術(shù)制作demo。從2015年的《Black Smith》到2016年的《亞當(dāng)》,2018年的《死者之書》,包括2019年和2020年《異教徒》的兩部分影視短片。其實(shí)在我們Unity的很多影視或者動(dòng)畫demo中都能找到很多應(yīng)用在現(xiàn)在游戲渲染中的原型。比如說《Black Smith》的角色陰影,《亞當(dāng)》中的PBR渲染效果,《死者之書》中植物的風(fēng)場(chǎng)效果等等。在國(guó)內(nèi)我們Unity也通過技術(shù)美術(shù)支持服務(wù)的方式幫助很多客戶把一些好的效果和優(yōu)化技術(shù)應(yīng)用到了游戲中。
我們首先看一下《異教徒》中最新的角色制作流程。主角的頭部和表情和貼圖都是通過我們說的4D捕捉的流程制作的。整套流程并沒有說是影視或者游戲之分。游戲也完全可以直接用這套流程來做。目前我們Unity支持的很多游戲項(xiàng)目都在使用注入動(dòng)作捕捉、表情捕捉、照片建模或者是掃描建模這類的流程來提高整個(gè)模型貼圖制作的精度和還原度。主要還是針對(duì)高質(zhì)量的寫實(shí)類的游戲。
?
來看一下這個(gè)流程整個(gè)視頻的展示。我們現(xiàn)在看到的是真人在鏡頭前捕捉的過程。他在模擬一些表情,說話。現(xiàn)在這個(gè)是我們看到的初步捕捉完成之后整個(gè)角色的表情和模型。可以看到這個(gè)時(shí)候還有很多頂點(diǎn)warp的問題。
?
之后,我們會(huì)把我們的模型導(dǎo)入到RS3D中,一個(gè)是對(duì)warp的頂點(diǎn)進(jìn)行修正。可以看到這是我們把頂點(diǎn)都修正完之后的結(jié)果。這是加入了高模的細(xì)節(jié),之后整個(gè)就是人素模的表情。
這是整個(gè)捕捉完了之后加上材質(zhì)、渲染之后在引擎里面渲染的效果。
現(xiàn)在很多團(tuán)隊(duì)一看到照片建模就望而卻步,特別是手游團(tuán)隊(duì),其實(shí)這套流程已經(jīng)非常成熟了,我們?cè)賮砜磦€(gè)視頻。
?
這是一個(gè)使用RS3D解決warp頂點(diǎn)的一個(gè)演示視頻。還可以用來將角色一系列掃描的表情轉(zhuǎn)化為相同拓?fù)浜图y理坐標(biāo)的角色模型。這樣就可以將整個(gè)流程完美地應(yīng)用到游戲的低模上。
整個(gè)過程都是通過程序化節(jié)點(diǎn)的方式計(jì)算的,美術(shù)人員也沒有太多的工作量。我們可以捕捉完一套表情應(yīng)用給不同的模型。可以大量地節(jié)省我們模型捕捉的成本。
主角的夾克制作我們使用了Marvelous Designer,相信現(xiàn)在的3D美術(shù)對(duì)這款工具應(yīng)該都不會(huì)陌生。我們先在Marvelous Designer中打板,跟裁縫制作真實(shí)衣服打板是一樣的,因此我們也調(diào)研了很多真實(shí)夾克制作的打板圖,現(xiàn)在看到的就是最終確定的效果。大家看到右邊是Marvelous里面打板的效果。
?
最終軟件會(huì)將每一塊面縫合起來,經(jīng)過布料模擬來配合整個(gè)角色的動(dòng)作,產(chǎn)生自然的布置。最后還會(huì)在ZBrush中添加一些細(xì)節(jié)。這個(gè)流程同樣在國(guó)內(nèi)游戲中也是一個(gè)很標(biāo)準(zhǔn)的工作流程。
再來看使用這個(gè)Marvelous來制作夾克還有一個(gè)好處,可以很好地模擬布料動(dòng)畫。右邊是Marvelous中使用角色簡(jiǎn)模進(jìn)行脫夾克的布料模擬,左邊是我們?cè)赨nity中渲染的效果。游戲中我們可以使用Maya或者Blender的插件快速地將物理模擬的動(dòng)畫轉(zhuǎn)化成骨骼蒙皮動(dòng)畫輸送給我們的游戲引擎進(jìn)行實(shí)時(shí)渲染。
?
渲染方面我們看一下。渲染方面我們今天主要看一下眼球和皮膚的渲染。這兩部分后面我會(huì)講一下怎么樣在移動(dòng)端去實(shí)現(xiàn)。
《異教徒》的主角皮膚用了很多的渲染技術(shù)。主要有上面幾類。今天我們主要看一下其中最重要的一個(gè)效果,就是我們平時(shí)或者美術(shù)經(jīng)常說的皮膚的非常普遍的現(xiàn)象,就是3S效果,次表面散射。這個(gè)效果也是在做皮膚渲染中需要重點(diǎn)做的。我們現(xiàn)在看的是HDRP主機(jī)游戲中怎么做這個(gè)皮膚,后面會(huì)講手游。
直接用《異教徒》的角色看一下3S效果的對(duì)比,這是沒開啟的,這是開啟后的效果,這明顯是一個(gè)背光的效果,特別是耳朵周圍的透紅的現(xiàn)象,這就是3S的次表面散射的標(biāo)準(zhǔn)的現(xiàn)象。可以對(duì)比地看一下。這是沒的,這是有的
?
看一個(gè)更夸張的效果,左邊是沒有3S效果的,右邊是打開的,這個(gè)效果更夸張,好像做了一次磨皮,右邊的效果更像皮膚,有點(diǎn)蠟的感覺。
?
我們要還原一個(gè)效果或者是提升一個(gè)效果,首先就要先了解這個(gè)效果,這樣就能更好地為我們做優(yōu)化打下基礎(chǔ)。我們快速地了解一下什么是3S的效果?也就是次表面散射。光從一種介質(zhì)進(jìn)入到另一種介質(zhì)有三種形態(tài),第一種是反射,第二種是次表面散射,第三種是透射。其中反射是我們現(xiàn)在非常火的BRDF,也就是PBR材質(zhì)中用到的雙向反射分布函數(shù)。
我們通常說的次表面散射光照傳輸模型就是BSSRDF,我們叫它雙向表面散射反射函數(shù),就是現(xiàn)在大家看到的這個(gè)函數(shù)。
?
然后其中一個(gè)非常關(guān)鍵的參數(shù)就是這個(gè)R,通常次表面散射的光線密度分布是一個(gè)各向同性同向的函數(shù),一個(gè)像素受周圍像素光照影響的比例和兩個(gè)像素之間的距離有關(guān),這個(gè)密度分布函數(shù)就是R,R的計(jì)算是非常復(fù)雜的。
2001年Jensen提出了一個(gè)Diffusion Profile擴(kuò)散剖面。這個(gè)Diffusion Profile是用來描述光線如何在半透明物體中進(jìn)行擴(kuò)散和分布的函數(shù)。可以簡(jiǎn)單地理解為Diffusion Profile就是一張權(quán)重圖,不同的皮膚渲染方法通常就是對(duì)Diffusion Profile的不同的近似。初期的Diffusion Profile使用的是偶極子來擬合計(jì)算的,但是對(duì)于皮膚來說效果不理想。之后針對(duì)這個(gè)Diffusion Profile圖形界進(jìn)行了一頓猛攻,出現(xiàn)了多極子和高斯函數(shù)求和的擬合方法。有興趣的同學(xué)可以搜這些方法來看,我就不展開講了。
總之,后續(xù)這一系列的改進(jìn)都是為了更好地?cái)M合我們看到的這個(gè)R,就是基于物理函數(shù)計(jì)算結(jié)果的曲線。
看左邊這張圖就是Diffusion Profile的計(jì)算結(jié)果,就好像我們拿一個(gè)手電筒垂直地照在了我們的皮膚上,看到光線到表面中心點(diǎn)周圍的一個(gè)光暈,從右邊這張圖看到RGB擴(kuò)散的范圍是不一樣的。這個(gè)紅色的光比綠色的光、藍(lán)色的光散射得更遠(yuǎn),所以耳朵和鼻子部位通常是紅彤彤的。美術(shù)上,感官上我們看到的一些效果往往在做渲染的背后是一大堆的理論,我們只有更好地理解這些現(xiàn)象背后的原理才能做出最佳的實(shí)際的效果。
?
發(fā)展到這個(gè)時(shí)候的次表面散射還只是一個(gè)離線渲染的階段,只能用于影視當(dāng)中。
2009年之后這個(gè)3S逐漸進(jìn)入了我們實(shí)時(shí)渲染的階段。首先是屏幕空間的模糊算法,性價(jià)比比紋理空間提高很多。這個(gè)模糊的過程就是根據(jù)我們前面說的Diffusion Profile對(duì)周圍的像素進(jìn)行加權(quán)求和,來模擬次表面散射的過程。
之后是2005年出來了一個(gè)可分離次表面散射,我們稱之為4S,它完全是從優(yōu)化的角度出發(fā),并不是純粹的數(shù)學(xué)推導(dǎo),它是使用兩個(gè)可分一維卷積來近似,效率得到了極大的提升。
下面的鏈接就是可分離次表面散射的一個(gè)paper,有興趣的同學(xué)可以仔細(xì)研究。
?
上面這些技術(shù)是目前PC和主機(jī)3A游戲中主流的次表面散射的技術(shù)。我們Unity的《異教徒》的角色并沒有直接使用,而是在可分離次表面散射的基礎(chǔ)上進(jìn)行了改良和一些提升。
我們主要是針對(duì)可分離次表面散射上的問題進(jìn)行了改良和提升。問題很多。我們今天講一些主要的改進(jìn)。
第一個(gè)是擬合結(jié)果不正確。這個(gè)單一的高斯函數(shù)在近似多層散射方面做得很好。然而,即使是兩種高斯的混合也很難準(zhǔn)確地表示單次散射和多層散射的組合。
在圖像中我們可以看到這個(gè)結(jié)果是白色的,而雙高斯近似是紅色的,它其實(shí)擬合的結(jié)果并不是很好。
?
另一個(gè)問題就是對(duì)美術(shù)不友好。高斯分布是一個(gè)數(shù)學(xué)概念,在3S中沒有物理意義,當(dāng)你使用兩個(gè)lerp參數(shù)的時(shí)候它是7個(gè)自由度的組合,如果不太清楚如何設(shè)置它們,很難得到一個(gè)有意義的組合。一個(gè)資深的美術(shù)仍然是可以使用這個(gè)高斯組合的模型取得很好的效果的。可是,這是一個(gè)漫長(zhǎng)的過程,并不適合我們商業(yè)引擎Unity。
?
這也是現(xiàn)在我在支持我們很多項(xiàng)目中經(jīng)常遇到的一個(gè)問題,現(xiàn)在很多項(xiàng)目的效果做得不好并不是說渲染技術(shù)的問題,而是美術(shù)不知道該怎么調(diào)。因?yàn)楹芏囗?xiàng)目的渲染比如說Shader和工具大部分都是由圖形程序或者是偏技術(shù)的TA編寫的,很多參數(shù)曝露出來給美術(shù),美術(shù)根本看不懂。像上面這種參數(shù)連規(guī)范都沒法寫,你要寫明白,就要給美術(shù)把前面所有的數(shù)學(xué)公式講明白才行,等美術(shù)理解掌握了,你按照國(guó)內(nèi)一個(gè)項(xiàng)目的周期,可能項(xiàng)目就做完了。
我們看看我們Unity《異教徒》的這個(gè)皮膚3S的改良。Unity實(shí)現(xiàn)了Burley的一個(gè)規(guī)范化的擴(kuò)散模型。我們稱之為迪斯尼3S,它為蒙特卡羅模擬得到的一個(gè)參考數(shù)據(jù)提供了一個(gè)精確的擬合。這意味著同時(shí)要考慮單次和多次的散射。它只有兩個(gè)參數(shù),體積反照率A和形狀參數(shù)S,它們都可以解釋為顏色,這個(gè)形狀參數(shù)與散射距離成反比,這就是我們?cè)赨I中曝露出來的參數(shù)。
?
左邊是我們HDRP中Diffusion Profile的參數(shù),大家可以發(fā)現(xiàn)更簡(jiǎn)單,更符合美術(shù)的理解。同時(shí),我們還做了一個(gè)優(yōu)化,Diffusion Profile這個(gè)擴(kuò)散剖面被歸一化了,并且可以直接做概率密度函數(shù),這也是蒙特卡羅積分中一個(gè)很重要的性質(zhì)。
實(shí)現(xiàn)方面,《異教徒》的3S效果也做了很多的優(yōu)化,為了加強(qiáng)視覺統(tǒng)一性,我們使用Surface albedo作為volume albedo,我們提供兩個(gè)albedo貼圖的選項(xiàng)。第一個(gè)是post scatter模式。當(dāng)這個(gè)albedo紋理和一些由于3S導(dǎo)致的顏色溢出,比如你這個(gè)albedo貼圖是照片掃描或者是采集來的,這種模式下我們就只在出口位置做一次反照率。還有一種是pre-and post scatter模式,這種模式會(huì)有效地模糊albedo貼圖,這個(gè)可能會(huì)導(dǎo)致更柔和、更自然的外觀。比如你的紋理是在DCC工具中制作的,或者是手工制作,你可以使用這種模式。
我們來看一下效果的對(duì)比。這是沒有3S效果,這是我們第一種post scatter的模式。這是第二種模式,就是pre-and post scatter。對(duì)比一下看一眼,這是第一種,更清晰一些。第二種就是會(huì)模糊一些。這是兩種模式的對(duì)比。
?
另外,我們這個(gè)3S還負(fù)責(zé)背光物體半透明的外觀,但是出于效率的原因,我們以一種更簡(jiǎn)單的方式來處理這兩種效果。我們采用了兩種方法,第一種是只適用于薄的物體,通常我們說的葉子。第二種是用來處理通用的半透明物體。兩者之間主要的區(qū)別,賣QQ號(hào)對(duì)于相對(duì)薄的物體,由于幾何體本身是薄的,所以它的正面和背面的陰影是相同的。所以我們?cè)贒CC工具中 烘焙一張厚度圖來獲取,對(duì)于厚的物體重用正面的陰影狀態(tài)顯然是不行的,所以我們使用的是shadowmap和距離參數(shù)結(jié)合的方式來獲取厚度。
這個(gè)優(yōu)化我們同樣為很多移動(dòng)客戶進(jìn)行了定制,后面我們有案例。
我們看一下兩種效果的對(duì)比。第一張圖是薄的物體,可以看到它模擬樹葉透光的效果。后面就是這個(gè)耳朵。我們可以看到這個(gè)厚和薄之間的區(qū)別,兩個(gè)參數(shù)之間的。
再來看一下純效率方面的優(yōu)化。G-Buffer Pass,根據(jù)材質(zhì)類型去標(biāo)記它的stencil,這樣可以減少不必要的3S pass像素的繪制,我們還標(biāo)記次表面照明緩沖區(qū),以避免在3S pass期間執(zhí)行逐像素模板測(cè)試,還實(shí)現(xiàn)了一個(gè)基本的LOD的系統(tǒng)。對(duì)采樣分布進(jìn)行隨機(jī)逐像素的旋轉(zhuǎn)。
?
最后我們?cè)賮砜纯凑麄€(gè)的效率表現(xiàn)。在PS4上,我們限制在每個(gè)像素21個(gè)采樣,使用CS進(jìn)行卷積合并diffuse和specular lighting buffers,GPU整個(gè)耗時(shí)在1.16毫秒左右。由于今天時(shí)間有限,所以我就先講這么多,關(guān)于皮膚這塊。有興趣的同學(xué)可以后面再交流。
?
講了這么多,我們?nèi)绾问褂梦覀冞@個(gè)皮膚材質(zhì)的?很簡(jiǎn)單,現(xiàn)在的主機(jī)項(xiàng)目只要使用我們這個(gè)ShaderGraph就足夠了。在最新的HDRP的渲染管線的ShaderGraph中我們已經(jīng)加入了Stack Lit Master節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)可以說完全基于我們Unity《異教徒》demo開發(fā)的。《異教徒》開發(fā)完成之后對(duì)ShaderGraph進(jìn)行了一次重要的升級(jí)。
我們來看一下這個(gè)Stack Lit這個(gè)Master節(jié)點(diǎn)。主要就是在這個(gè)節(jié)點(diǎn)上勾選surface scatering這個(gè)選項(xiàng),我們就可以看到皮膚的3S相關(guān)的設(shè)置就可以出現(xiàn)了,包括我們前面說的Diffusion Profile的設(shè)置。可以很好地勝任我們皮膚渲染的工作。感興趣的同學(xué)可以自己去嘗試一下。而且我們現(xiàn)在整個(gè)《異教徒》角色的案例官方也在資源商店中免費(fèi)給大家開放學(xué)習(xí)和使用了。
我們看一下最終的效果。這是《異教徒》中的角色皮膚渲染效果。這是《Wind-Up》中小女孩的皮膚渲染效果,我們可以看一下這個(gè)小女孩耳朵3S投射的效果。這是一個(gè)樹葉的效果。它右邊的Diffusion Profile針對(duì)每一個(gè)角色或者是物體都是不一樣的。
?
我們?cè)倏匆幌卵劬Φ淖龇āN覀冋f的眼睛是心靈的窗口,同我們畫人頭像一樣,眼睛是要重要刻劃的,做渲染也是同樣重要的。《異教徒》主角的顏色使用了非常多的技術(shù)。
最主要的是基于物理的折射,但是它與復(fù)雜度成正比的。這個(gè)物理折射雖然給我們帶來了效果好一些,但是它也更費(fèi)一些渲染。這個(gè)代碼我就貼在這兒了,我們可以看一下。主要看最后一行,它有一個(gè)mask的部分,在虹膜坐標(biāo)上進(jìn)行了一定量的偏移,目的就是在虹膜、鞏膜過渡的位置添加異色邊緣的渲染效果。而且整個(gè)texcoard坐標(biāo)位置是為了后面采樣這個(gè)虹膜部分的貼圖做準(zhǔn)備的,我們繼續(xù)往后看。
?
通過剛才的公式可以看到為了實(shí)現(xiàn)這個(gè)物理折射的計(jì)算,我們需要在眼球模型的物體空間進(jìn)行一些對(duì)應(yīng)的計(jì)算。所以說我們要對(duì)這個(gè)眼球模型本身的制作提出要求。這就是主角眼球。我們可以看它主要需要規(guī)范坐標(biāo)系。也就是說眼球的中心作為模型的原點(diǎn),讓眼球縱向朝向Z軸,其次是我們需要做出這個(gè)眼球前方區(qū)的一個(gè)結(jié)構(gòu),這是為了得到更好的物理折射,同時(shí)也可以用來區(qū)分瞳孔的位置。
我們通過一個(gè)圖來說一下這個(gè)shader的計(jì)算。為了更好地獲得這個(gè)物理折射所需要的各個(gè)參數(shù),在眼球渲染的shader中需要通過在物體空間的Z軸取一個(gè)坐標(biāo),來動(dòng)態(tài)地劃分這個(gè)虹膜和鞏膜的shader區(qū)域。大家可以理解為在物體的Z軸投射了一個(gè)平面,像我們示意圖展示的,以此劃分好區(qū)域,并分別處理好兩個(gè)位置的渲染,這樣的坐標(biāo)劃分一舉多得的。
?
在劃分虹膜和鞏膜的同時(shí)也方便我們實(shí)現(xiàn)異色邊緣的效果。這樣的做法大家覺得很復(fù)雜,但是因?yàn)楦鱾€(gè)區(qū)域的采樣坐標(biāo)是在物體空間內(nèi)動(dòng)態(tài)計(jì)算的,所以我們可以將同一套眼球的貼圖配置給不同的眼球模型,也可以進(jìn)行勾畫不同眼球的貼圖。
通過這個(gè)眼球的案例,我相信大家可以發(fā)現(xiàn)其實(shí)一些渲染效果的背后往往都伴隨著特殊制作的流程和規(guī)范,不只是寫個(gè)shader那么簡(jiǎn)單。
這也是現(xiàn)在很多效果,大家用的相同的渲染技術(shù),但是做出來的效果千差萬別。
為了實(shí)現(xiàn)這個(gè)角色的眼睛很好的效果,我們使用了一種Cone Mapping的技術(shù),眼球周圍分布四個(gè)虛擬點(diǎn),根據(jù)這四個(gè)虛擬點(diǎn)計(jì)算,將這個(gè)虛擬點(diǎn)融入到我們蒙皮中,這樣可以很好地使AO匹配我們角色眼睛的動(dòng)畫。
?
我們來看個(gè)視頻。我們這個(gè)眼睛制作完之后,由于上面說的流程,這個(gè)眼睛是可以做到一些程序化的效果,比如我們可以動(dòng)態(tài)地改變異色邊緣的大小,可以改變它的折射效果,包括還可以給瞳孔換顏色,都是可以的。
?
講了這么多,大家可能覺得你做這么個(gè)眼睛有沒有必要?我們看一下這個(gè)對(duì)比。這是我們看到的做了渲染之后的眼睛的效果。這是沒有的效果。這個(gè)就是我們平時(shí)做項(xiàng)目眼睛渲染的效果。如果你不做任何的處理,它就是個(gè)死魚眼,不對(duì)比,你看這個(gè)效果時(shí)間長(zhǎng)了還覺得它挺好,很多人覺得夠用了。但是,你一對(duì)比,這個(gè)效果可能接受不了。所以說做效果一定要找到一個(gè)對(duì)比。我們可以看這兩個(gè)效果的對(duì)比。
?
同樣的我們這個(gè)眼睛在最新的HDRP的ShaderGraph中也可以找到Eye Master這個(gè)節(jié)點(diǎn)來使用。
我們看一下這個(gè)皮膚渲染在手機(jī)上一般怎么做提升的。在移動(dòng)端我們?yōu)榭蛻舳ㄖ频姆桨妇褪怯檬謾C(jī)上的預(yù)積分的皮膚折射技術(shù),這個(gè)方法最早出現(xiàn)在2010年,之后因?yàn)镻C和主機(jī)硬件快速發(fā)展就淡出了人們的視野。但是,現(xiàn)在卻成為了手游皮膚渲染的主流方案。
?
上面這個(gè)鏈接是2001年siggraph上的一篇專門講游戲分皮膚折射的技術(shù),我們可以看一下。左邊是貼圖空間的diffusion,我們剛剛說的Diffusion Profile的方式渲染的效果。右邊是預(yù)積分皮膚折射的結(jié)果,肉眼上很難看出來這個(gè)區(qū)別。
這個(gè)預(yù)積分皮膚折射是一個(gè)從結(jié)果反推實(shí)現(xiàn)的方案,具體思路是把次表面反射的效果預(yù)計(jì)算成一張二維的紋理查找表,這個(gè)查找表的參數(shù)分別是NdotL和曲率,能反映出光照隨著曲率的變化。
看一下左邊這張積分貼圖。它的X坐標(biāo)采樣是我們NdotL后的數(shù)值。重點(diǎn)說一下Y坐標(biāo)。這個(gè)Y坐標(biāo)代表的是曲率。通常曲率和NdotL索引上圖中的預(yù)積分的LUT貼圖就可以了。
中間這張圖是可以用工具bake生成的。NPR的渲染中也可以讓美術(shù)直接畫,還可以在模型上做完效果再用工具去反推這張圖。
?
最右邊是如何使用兩個(gè)導(dǎo)數(shù)同時(shí)繪制曲率的圖式。最終結(jié)果是R越小,這個(gè)法線變化越大,意思就是曲率越大。也就是說我們下面看到的R值越小,皮膚表面更容易產(chǎn)生次表面散射,而類似耳朵邊緣、鼻翼的位置,這種方法非常適合在移動(dòng)游戲上使用,效率高,效果也不差。很多主機(jī)游戲也是使用這個(gè)方案的。比如《最終幻想15》中的人物皮膚渲染就是大量地用到了這個(gè)預(yù)積分的皮膚渲染。還有前一陣子非常火的主機(jī)游戲《對(duì)馬島》也是用了這種方法。
我們看一下,我們還是做了一些優(yōu)化的,比如我們是在URP管線上實(shí)現(xiàn)了這套皮膚渲染的。在URP管線里面加入了PBR的工作流程,使用了cone map去替代(不清楚)的計(jì)算,我們也支持透明物體的厚和薄的物體,我們還使用了Mask Map去區(qū)分這個(gè)皮膚和普通材質(zhì)。
我們看一下在手機(jī)上這個(gè)效果的對(duì)比。這是沒有的效果。這是加入了我們說預(yù)積分3S的效果。可以看到這個(gè)效果還是比較明顯的。特別是背面這塊。
?
然后我們來看一下眼睛的渲染在移動(dòng)端是怎么實(shí)現(xiàn)的。主要是通過移動(dòng)端的優(yōu)化算法來模擬的。我們使用了Parallax Refraction的方法來模擬refraction的效果。可以看到整個(gè)算法比我們《異教徒》眼睛物理折射的算法簡(jiǎn)單很多,主要原因它就是沒有refraction這個(gè)函數(shù)了。這樣就說明了它不是一個(gè)基于物理的方法,其實(shí)是一個(gè)影視差貼圖模擬的方法。
右邊是兩種算法的對(duì)比。我們可以看到Parallax Refraction的方法也能近似地達(dá)到虹膜折射的效果。這也是目前在手機(jī)上模擬眼球最常見的方法。如果一些高端機(jī)的局外選人的界面當(dāng)然也可以用基于物理的算法。
?
左邊是URP管線上我們做了一個(gè)移動(dòng)端的眼球的展示。可以看到這個(gè)眼球的面數(shù)少了很多,眼睛也變成了一個(gè)半球,Parallax這個(gè)參數(shù)的height這個(gè)值從0到3的變化。它這個(gè)值越大,扭曲的效果就越大,模擬折射的效果。
這是我們?cè)谝苿?dòng)端給角色加入了眼睛畫色之后的效果。
?
我們?cè)倏匆幌骂^發(fā)。頭發(fā)現(xiàn)在也是做很多游戲或者虛擬計(jì)算里面用的。現(xiàn)在有很多頭發(fā)的解決方案,有使用動(dòng)態(tài)骨骼的,我見過很多主機(jī)游戲也在用NV的hairworks。我們Unity是將AMD的 TressFX,海飛絲這個(gè)頭發(fā)的效果移植到了我們引擎中,目前支持URP和HDRP的管線。
我們看一下目前測(cè)試的效果。其實(shí)效果還是可以的,跟TressFX官方演示的效果差不多。
?
我們看一下它的效率。剛才看的那個(gè)demo在URP管線上,高通865的芯片,1萬根發(fā)絲能跑60幀,效率還是非常高的。
再看一下皮毛的渲染。我們一般給客戶使用Shell的方式,在URP管線移動(dòng)端為客戶也實(shí)現(xiàn)過絨毛的效果。這里需要注意的是這個(gè)URP管線的shader的實(shí)現(xiàn)是無法直接在shader上寫多pass的,因?yàn)樵赨RP管線上你是需要在render feature中繪制每一步的Shell并且可以很容易地加入LOD,可以根據(jù)距離的遠(yuǎn)近來刪減這個(gè)Shell的部分。
我們還加入了一個(gè)毛發(fā)梳理的流程。這是在Mari中為貓梳毛,會(huì)生成一張flow map,這樣的話你給美術(shù)制作更直觀,而且它上面還有毛的走線都是能看到的。
?
我們來看一下,左邊是沒有梳毛的效果,中間是梳過了,中間這個(gè)毛發(fā)生長(zhǎng)是跟我們?cè)贛ari中梳理的方向是一致的。最右邊的是沒有fur的效果,這應(yīng)該也是現(xiàn)在主流的做法,在Zbrush中刷個(gè)紋理,再插個(gè)片。
?
你們可以看一下左邊這個(gè)是沒梳的,好像這個(gè)毛不順,有點(diǎn)濕了炸毛的感覺,中間的更順滑一些。包括你可以刷它很多的信息,包括它的粗細(xì)、疏密,都可以。
場(chǎng)景方面,今天我們來看一個(gè)現(xiàn)在非常火的效果,就是這個(gè)體積云。我們?cè)谑謾C(jī)上最近這段時(shí)間很多客戶都定制了這種體積云。這個(gè)體積云的效果真的是特別火,很多手游項(xiàng)目都在用了。在主機(jī)和影視渲染中體積云的效果已經(jīng)非常成熟了,2015年Schneider在ZGrapher上的演講。到2017年這個(gè)《地平線》,再到2019年的《荒野大鏢客》,這個(gè)天空體積云的渲染給大家都帶來了非常震撼的效果。主機(jī)或者影視上實(shí)時(shí)渲染的體積云主要的技術(shù)重點(diǎn)就是屏幕空間的ray marching,程序化控制這個(gè)云的形狀和光照三大部分。
?
我們看一下在移動(dòng)端為客戶定制這個(gè)體積云效果的優(yōu)化。我們知道體積云最費(fèi)的就是ray marching,主要就是它這個(gè)Density marching和Shadow marching,主要的影響因素是分辨率。我們看一下是怎么優(yōu)化的。我們主要針對(duì)以下四點(diǎn)進(jìn)行優(yōu)化的。
首先我們來看一下Scale方面的優(yōu)化。《地平線》做法是marching四分之一的分辨率,它是Jitter sample4×4的一個(gè)quard,16幀構(gòu)建一個(gè)云的畫面。《地平線》的做法的優(yōu)點(diǎn),假如這個(gè)鏡頭移動(dòng)很慢,它會(huì)有足夠的細(xì)節(jié),問題就是當(dāng)它這個(gè)幀率過低或者是鏡頭的移動(dòng)速度過慢的時(shí)候會(huì)出現(xiàn)鬼影,這種做法顯然不太適合我們手機(jī)游戲。
我們可以看一下這是《地平線》16幀構(gòu)建一個(gè)云的事例。而我們的做法是使用2×2一半的quard去進(jìn)行Jitter sample,用4幀去構(gòu)建一個(gè)分辨率的云的畫面。優(yōu)點(diǎn)就是它的構(gòu)建速度很快。缺點(diǎn)就是它這個(gè)高頻細(xì)節(jié)不夠,可能會(huì)出現(xiàn)block的現(xiàn)象,一塊一塊的馬賽克。但是有它是手游,一般屏幕像素比較密集,所以很好地規(guī)避掉了這個(gè)問題。這也是我們現(xiàn)在為什么會(huì)采用這種優(yōu)化方案的原因。就是在你手機(jī)上這個(gè)問題它不明顯。
?
還有一個(gè),在手機(jī)上我們也使用了blue noise,很多現(xiàn)在的優(yōu)化都在用,來擾動(dòng)采樣案時(shí)間的起始位置,同樣也使用Tenporal來疊加每一幀采用的結(jié)果。就類似于TAA的一種方式。
?
并且我們?yōu)椴煌钠脚_(tái)設(shè)置了云的IOD,這也可以適配高中低端的手機(jī)設(shè)備。我們看一下右邊。右邊是不同配置下的渲染的結(jié)果,可以看一下它是從上到下,分別是從高到低,我們能明顯地看出來它這個(gè)block的現(xiàn)象越來越重。
左邊是我們目前高中低端手機(jī)的配置,可以看一下Marching Step采樣的部署和Shadow Simple的count是個(gè)陰影采樣的部署,我們會(huì)針對(duì)不同的機(jī)型做定制化的優(yōu)化。
?
然后我們看一下《地平線》它使用了大型三維噪聲和二維噪聲建模云的細(xì)節(jié)。它會(huì)有一個(gè)豐富的外觀。它每一個(gè)marching和Shadow Simple都需要大量的texture fetches,這就帶來了一個(gè)什么問題,在移動(dòng)端這個(gè)帶寬受不了,包括散熱這些是不行的,所以說我們預(yù)先過濾我們這個(gè)perlin和worley的噪聲,不同頻率的噪聲我們把它合并到一個(gè)單一的3D紋理里面,并只在運(yùn)行時(shí)獲取這個(gè)紋理。
?
左邊上面《地平線》運(yùn)用到了3D紋理,這都是3D紋理,不是2D紋理,可以看到這個(gè)數(shù)量還是非常恐怖的。
下面是我們最終用到的只有一張3D紋理和一張2D紋理。
再來看一下光照方面。我們只使用了三次Shadow Simple來降低這個(gè)質(zhì)量,也是為了提升效率。我們只對(duì)基礎(chǔ)的云的形狀進(jìn)行應(yīng)用貼圖的marching,忽略細(xì)節(jié)紋理,主要是為了接受這個(gè)帶寬。
此外,我們還加入了體積光大件散射包括對(duì)云的影響,包括晝夜變換,天氣變換,也會(huì)產(chǎn)生不同的聚散的變換。可以看一下最終的效果。
?
這是我們整個(gè)云,可以看到我們加入了晝夜變換,包括你看這個(gè)云還可以接受到大氣散射的效果。云有一種黃昏、火燒云的效果。其實(shí)這個(gè)云本身是慢慢地在聚合的,只是我們現(xiàn)在看不到這個(gè)效果。
包括我們這個(gè)云還會(huì)有遮擋,它不會(huì)跟天窗盒里面的云一樣。我們可以看左邊這個(gè)星球,它是遮擋在這個(gè)云后面的,這個(gè)星球我們應(yīng)是用一個(gè)feature畫上去的,畫到天空上的,也不需要你美術(shù)去做模型,它是被云遮擋住的,比如有山聳入這個(gè)云中它可以產(chǎn)生體積云遮擋的效果。
可以看到這個(gè)晝夜變換,而且這個(gè)云對(duì)于陽(yáng)光遮擋的效果也非常好。我們可以快進(jìn)地看一下這個(gè)云聚合的效果。
這是大氣散射對(duì)這個(gè)云的影響。
我們看一下它的效率。我們是在iPhoneX上測(cè)試的,分辨率是1125×2436,標(biāo)準(zhǔn)的分辨率,整個(gè)的云我們marching step的數(shù)量是64步,shadow sample采樣數(shù)是6,整個(gè)GPU耗時(shí)6.54毫秒,就是說這個(gè)消耗還是比較大的。但是由于現(xiàn)在很多的高端手機(jī),尤其是iPhone12也出來了,這個(gè)東西在場(chǎng)景優(yōu)化比較好的情況下也是可以用的,是完全沒問題的。
可能今天講得有點(diǎn)快,但是內(nèi)容就講完了。
總結(jié)
以上是生活随笔為你收集整理的Unity TA总监王靖:Unity如何实现美术画质升级?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做过《战神》《死亡搁浅》的光子动捕专家,
- 下一篇: Pawel wojs:《全面战争:三国》