2018年8月6日 星期一

死者之書:(四)Quixel、風、場景地形和優化技巧

作者:Julien Heijmans 原文
潤稿:Wei J


系列作品:
死者之書:(一)概念美術
死者之書:(二)角色資源製作
死者之書:(三)環境資源與特效製作
死者之書:(四)Quixel、風、場景地形和優化技巧


揭秘《死者之書》之Quixel、風、場景製作及優化技巧

嗨!我是Julien Heijmans,在Unity Demo團隊中擔任環境藝術家,我去年才加入Unity不過我已在遊戲產業待了約七年。這篇文章將會從我以《死者之書》的觀點來介紹內容創造者及環境藝術的部分。

攝影製圖對我來說是新的領域,但我清晰地記得多年前Quixel發佈他們用Megascans製作的成果,從那之後我就一直試圖取得使用他們的資源來工作的機會,而加入Unity Demo團隊一起製作《死者之書》使這一切成真了。

如果你想試驗文章裡提到的諸多工具,可以前往AssetStore下載『《死者之書》: 環境』專案。

Unity與Quixel的合作




當我參與進專案後才理解到我們不只是使用Quixel的Megascans資料庫,而是與Quixel公司緊密的合作來進行創作。

在製作過程中,Unity Demo團隊創建了一個所需資源的列表,如果現有的掃描庫中缺少合適的對應資源,Quixel則會為之採集新資源。這其中的不少資源都是植物類型,例如:草地、植栽和灌木叢,這些資源需要合適的設備和佈置來進行掃描。

Quixel不僅為我們提供了資源的紋理集,還創建了相應的幾何體(geometry),帶有LOD(level of detail)和頂點色設置(vertex color),以支持我們的風著色器。



在開發過程中,我們收到了超過50個高質量資源,這些資源較為複雜,我們不得不依靠著團隊中為數不多的藝術家努力在有限的時間中處理完畢。

在製作期間,我們快速的將資源載入到Unity中,得到不錯的外觀效果。我們經常會調整紋理(大多是反光材質(albedo)、亮度/等級/曲線以及修改色彩使它們與場景效果更為統一),重新調整LOD到所希望的等級,並且將紋理指定給一個新的HDRP光照材質。

幸運的是,Quixel發佈了一個工具Megascans Bridge,它能完成之前大量我們需要手工完成的輸入工作。Megascans Bridge為HDRP重打包紋理貼圖節省了大量時間。




如果你對Megascans中資源感興趣,想要獲取更多這類資源, 可以訪問Asset Store獲取。所有這些資源都能夠直接輸入到專案配置中,無論專案使用的是HDRP還是LWRP。






為植被資源及整個管線建立風系統永遠是一個非常棘手的過程。 在場景中,許多不同種類的植被資源需要以不同的方式進行動畫處理,例如:二種不同的樹或許需要完全不同的設置和不同的著色器複雜度。

因此我們決定為了對植被資源產生風效果,做一個基於自訂頂點著色器的程序化動畫。它經過量身打造,適合我們的專案中的樹木或灌木叢。

技術主管Torbjorn Laedre開發了一個著色器,能夠支持多種植被,這個著色器使用了三個不同的技術:

  • 階層軸心(Hierarchy Pivot):應用於樹木和一些擁有非常明確結構/階層的植物。
  • 單一軸心(Single Pivot):應用於草地、小型植物和帶有不確定結構/階層的大型灌木。
  • 程序動畫(Procedural Animation):應用於無法確定軸心點的植被資源。



樹木是準備起來更為複雜的資源,它們使用的是階層軸心類動畫,並且依賴三個不同的層級的階層(levels of hierarchy):


  • 樹幹(Trunk):根植於地面的部分。
  • A級樹枝(Branches Level A):與樹幹相連。
  • B級樹枝(Branches Level B):與A級樹枝相連。

著色器需要知道樹木在階層中的層級和樹木每個頂點的軸心點。首先,我們要編輯樹木本身的幾何圖形,然後使用綠色頂點顏色通道為樹木的每個多邊形指定階層的層級。




  • 頂點顏色的綠色通道數值為0時,表示這個部分是樹幹。
  • 數值在0和1之間則是A級樹枝。
  • 數值為1則是B級樹枝。

我使用了Maya完成這部分任務,通過使用一些小腳本,可以在10-15分鐘內設定好一個資源的所有LOD。

除此之外,我們還使用了飄動遮罩(Flutter Mask)。飄動遮罩是紋理遮罩,能夠幫助判斷樹枝的軸心在幾何體上的位置。下圖是這個遮罩的圖示。


準備好所有資訊後,就可以使用C#腳本來輸入樹木的Prefab,並產生一個新的Prefab,這個Prefab中包含每個頂點的軸心資訊。將WindControl物件加入到場景後,便可以將樹木輸入到場景中,並開始處理材質屬性。



我們可以看到,每個階層層級都具有一個範圍屬性(基本上是樹幹或樹枝長度)和彈性屬性。

還有一些屬性用來設置風抖動(wind flutter )動畫。它們給頂點位置添加了一些程序化的雜訊,用來模仿當風吹到樹幹時的振動效果。

然後我們還需要使風的音效對動畫產生影響。音效的音量會驅使動畫的風力。這是個簡單的想法但加入成果非常驚人,你可以打開專案,然後在場景中四處走動,當聽到大風吹過身邊時,你會發現樹木和周圍的草地都在震動。


佈局

在處理《死者之書》這類專案的細節和密度時,思考如何構層級十分重要,如此能避免在製作中出現的效能問題。其中一個需要顧慮的是關於限制場景中的遠景距離。我們可以通過在場景佈局中放置「過道」(corridor)和「障礙」(bottleneck)來實現這個想法。



這些佈局結合正確設置「Occluder static」和「Occludee static」flag的資源後,會使Unity的遮罩剔除(occlusion culling )更為高效。



上面的影片展示了遮罩剔除的視覺化功能,我們可以看出攝影機是從頂部視圖進行觀察的。在影片結尾,啓用/禁用了遮罩剔除,然後查看哪些物件被遮罩剔除功能所剔除。

我們也能看到一些沒被剔除的物件,這些物件大多是非常高大的樹木,有些超過25米高,這些樹有很大的邊框,因此很難在峭壁後剔除。


使用Unity傳統地形系統(Legacy Terrain)

在《死者之書》預告片發佈後,我們看到有些評論說:這個專案中絕對不可能使用了傳統地形系統。但實際上我們使用的就是傳統地形系統,並且我們修改了HD渲染管線的Layered Lit著色器來支援它。HDRP Layered Lit著色器允許使用高度圖紋理來混合layer,所以得到的結果會比傳統地形著色器的線性混合功能更好。


在此動畫中,僅修改了不同layer的高度偏移(height offset)

當然,這是一種臨時的解決方案,不能在UI中恰當地集成。為了修改地形,我們需要編輯材質用來適用於它,而不是使用在地形物件中Paint Texture tab下的「Edit Texture」按鈕來處理。


這些layer主要是為了幫助繪製地形上的不同layer。它們不是用來渲染地形的,除非是使用平鋪(tiling)設定。


與此相反,尋找適用於地形的材質,我們會發現所有紋理和材質屬性都會影響地形。

如果要創建新地形並在其上應用不同紋理,則需要複製TerrainLayeredLit材質,並將其指定到新地形上。還需要在Paint Texture tab中創建4個紋理集合。指定的紋理不會用來渲染地形,但它們會讓我們在地形上繪制不同的layer,還可以修改不同layer的平鋪設定。

此外,為了能夠充分使用LODGroup功能,所有在地形上放置的資源都會設置為樹木而不是具體的資源。



但實際上,這個專案中有大量零散的資源散布在地面上:草、灌木叢、植物、小樹枝、岩石等。即使有那麼多零散資源,地形仍可以是簡單的,在下一部分我們可以瞭解到,在這個畫面中地形只是一個簡單的平鋪材質。


零散的細節資源

當在關卡中移動時,我們會注意到在地上散落了大量的小樹枝和松果。



如果只是在關卡中隨意移動時,這些並不顯眼,但我們開始注視地面時,這些小樹枝和松果給場景帶來了細節。

有時候地面會有數百根細小的樹枝,分散在岩石和枯萎樹幹之間,這感覺就像它們自然從樹上脫落在這些位置。手工放置它們是不可能的,所以Torbjorn Laedre製作了一個工具幫助我們將這些小型物件分散這些關卡中。

小樹枝是帶有Alpha材質的簡單挖剪(cutout)平面。我們給這些小樹枝添加了膠囊碰撞體(capsule collider)。



腳本首先會在指定位置周圍產生需求數量的零散物件,然後進行落到地面的物理模擬,它們落下後會與地形、其它資源岩石、枯萎樹幹等相互碰撞。然後按下按鈕「Bake」,小樹枝的碰撞體會被移除,合併成單一物件,然後指定給一個帶有特定剔除距離的LODGroup。




此腳本在場景中被用在名為「UberTreeSpawner」的物件上,你可以根據需求隨意使用。

關於此工具的附註:為了使其它零散對象適當地落在地面和其他資源上,在場景中的所有資源皆需要有較高密度的網格碰撞體(mesh collider)。並且在遊戲執行時,這些笨重的碰撞體不能被使用。 出於這個原因,場景中的多數資源帶有兩組不同的碰撞體:一個是輕量的,會被PlayerController用在運行模式的實時環境中,指定在預設的layer。另一個則用於小樹枝的物理效果模擬上,指定於GroundScatter layer。


光照

《死者之書》:環境』專案使用烘焙的間接全域光照(baked indirect global illumination),並帶有即時運算的方向光(real-time direct lighting)

來自太陽的間接光照和來自天空的直接加間接光照都被烘焙到光照貼圖(lightmaps)和光照探針(probe)中。反射探針、遮蔽探針和其它遮蔽來源也會被烘焙。另一方面,直接太陽光直射也是即時光照。在使用即時直接光照時,在HD渲染管線中的著色效果最好,它也能讓我們執行時能自由調整光的方向、強度和色溫。



由於間接光照已被烘焙,我們不能對方向光的強度和顏色進行太多調整,否則它會無法與烘焙光照相符合。儘管樹林能夠掩蓋不符合的間接光照,是個容忍度較大的環境,但我們還是不能在這個設置中脫離完整的晝夜循環。

已烘焙光照貼圖大多用於地形和少數其他資源,但我們更喜歡為專案中的石塊和峭壁使用光照探針和遮蔽探針,因為它們有尖銳的角度和捲曲的法線貼圖,能得到更好的結果。


遮蔽探針(Occlusion Probes)

在即時環境中,難以對茂密的森林進行照明。 樹木的樹葉和樹枝都有巨大的表面積和複雜的幾何形狀,因此給它覆蓋上光照貼圖很不切實際。為每棵樹使用單個光照探針可以從下至上給它一致的光照效果。光照探針代理體積(Light Probe Proxy Volume)能實現更接近我們想要的效果,但通過提高網格解析度來採集精良細節的做法並不實際。

因為這些因素,我們的高級圖形程式設計師Robert Cupisz開發了遮蔽探針。

從美術的角度來看,這是個非常不錯而簡易的功能:只需將物件加入到場景中,它就會顯示一個體積輔助圖示(gizmo)用來縮放,從而覆蓋想要的區域,接著以X、Y、Z來設定它的解析度參數即可。



如果希望場景中某些區域擁有更高密度的探針,它還能允許創建「細節」遮蔽探針。設置完成後,需要烘焙整個場景的光照。遮蔽探針會在這個過程中被烘焙。

通過在上半球發射射線(ray),3D網格中的每個探針會對天空可見度進行採樣,並將其存儲為從完全遮蔽的0到完全可見的1的8位元值。這使得有更高濃度的樹葉和樹枝的地方顯得更黑暗,即使那裡只有幾棵樹聚集在一起也會如此。

落到樹幹或石塊中的探針會完全是黑的。為了避免黑色洩露出來,它們會被標記為無效,並被周圍的有效探針覆寫。

由於探針會對天空的可見部分進行採樣,它們應該要減弱直接來自天空的光照計算部分(direct sky contribution)。所以,光照貼圖會設定成從常規光照探針中排除直接光照(direct light contribution)的計算,然後探針光照由光照探針加上直接天空探針組成,並且都被遮蔽探針所遮擋。

這樣一來我們就獲得了大量低成本的遮蔽探針,會對葉子遮擋天空的細節進行採樣,為圖像帶來深度,我們也得到了少量效能消耗較大的光照探針,用來採集緩慢變化的間接光照。



如果想要更清楚地瞭解它們如何影響場景,可以使用SkyOcclusion Debug視圖進行查看。



這個遮蔽探針API已經加入到Unity 2018.1中,它可以用於烘焙遮蔽探針並從光照探針中排除天空的直接光照計算,專案中的提供了所有腳本和著色器。


大氣散射(Atmospheric Scattering)

我們移植並重新使用了為《Blacksmith》展示Demo所開發的大氣散射(Atmospheric Scattering)解決方案。

我們的高級程式設計師 Lasse Jon Fuglsang Pedersen 對其進行了擴展,讓它可以利用暫時超級採樣(temporal supersampling)功能,使外觀更為平滑。 




HD渲染管線穿透

HD渲染管線的預設發光著色器支援多種漫反射效果。它能讓你得到帶有表面下(sub-surface)散射效果的材質,或就如本專案中為植物所使用的效果,一個更為簡單的只帶有透光性的半透明材質。



此效果設定在兩個不同位置:


  • 我們需要選擇「Translucent」材質類型的材質上,輸入一個厚度(Thickness)貼圖,然後選擇漫反射配置,這個配置文件在第二個位置。
  • 第二個位置是漫反射配置文件設定,我們可以編輯透光效果的其它參數。


注意:我們增加了額外的slider來分別控制直接和間接透光,讓最終結果有更好的可控性。但這個改動並不遵循PBR原則,所以不會被加入HD渲染管線。


Area Volumes

Area Volumes被構築在由SRP提供的核心volume系統上,與Post Process Volumes非常相似。它們的功能根據主攝影機物件的位置修改對象屬性。

包括定向光源、大氣散射、自動聚焦和WindControl在內的多個對象都能受Area Volumes控制屬性,因此,如果想要修改當前的光照設置,則需要在對應Area Volumes中進行操作。那些Area Volume物件在主場景中,位於_SceneSettings > _AREASETTINGS目錄下,帶有「_AV」的後綴字尾。


除錯器視窗

針對不常使用HD渲染管線的使用者,現在有一個特定的SRP除錯視窗,你可以通過選單Window > General > Render Pipeline Debug打開它。





通過這種方式,你可以看到獨立的GBuffer layer、光照組件或是材質中的特定紋理貼圖,甚至是覆寫反光率(albedo)/平滑度(smoothness)/法線(normal)。當一些物件沒正確渲染或是有其它視覺bug時,這是個非常有用的工具。它會幫助你更快找出問題的源頭。

最棒的是這些除錯視圖是從著色器自動生成的,編碼器能夠非常輕鬆地創建新的除錯視圖。


有一些除錯視圖能夠從渲染管線除錯視窗中打開

我們使用這些除錯視圖來創建在場景背景中使用的樹狀billboard。過程很簡單,僅需把資源放到空白場景中,然後進行截圖,截圖時畫面上帶有可見的反光率、粗糙度和法線Gbuffer layer等屬性,然後將它們用來創造自訂的紋理貼圖。


優化

雖然優化的大部分內容屬於程式碼部分,但如果你想要擁有合適的幀率,合理設置好資源和場景也很重要。下面是一些為項目優化內容的方法:


  • 所有的材質都使用了GPU Instancing。
  • 場景中的多數資源都使用了LOD。
  • LOD交叉淡入淡出(The LOD Crossfade)功能很棒,它能夠給不同細節等級的物件帶來好看又平滑的混合效果。但這個功能極度消耗效能,大量提升專案的draw call。因為這個原因,我們大部分的資源都盡可能的禁用。
  • 為了避免LOD之間的過渡區域太過明顯,我們在大型石塊和峭壁資源上使用物件空間(Object Space)法線貼圖。





注意:這裡使用的是物件空間法線貼圖,而不是切線空間(Tangent Space)法線貼圖,這樣做會降低法線貼圖的精確度。實際上,這在我們那些粗糙雜亂的資源上並不明顯,但你或許不會想要把它用在有菱角表面的資源上。


  • 儘管通過建構場景及遮蔽剔除來限制視野距離很重要,同樣值得一提的是,這其中的不少用於渲染場景的draw call消耗實際上來自渲染每個陰影圖的串聯(each cascade of shadow maps),在此專案中特別是來自定向光源(directional light )。
  • 我們有大量draw call來自散落在地形的小型植被資源,有些位置會有上百個draw call。通過將草和植物資源打包,我們減少了大量draw call,現在只剩下15-20。請注意:這會對視覺效果有影響,如此龐大的資源,很難避免草與岩石及其它地上的資源不互相裁切。
  • 我們使用了layer剔除功能,這是Unity中已有的功能,但卻沒有任何UI。此功能允許你根據對象與攝像機之間的距離,剔除被指定為特定layer的對象。Torbjorn擴展了這項功能,使之能夠剔除這些物件在不同距離的陰影投射。例如:我們的大部分小型植被資源會在15米左右停止投射陰影,由於有地面上的草叢和其它植物,這個效果並不明顯,在25米左右的物件會被完全剔除,無它們的LODGroup如何設定。



小結


我們將繼續分享《死者之書》的創作過程,在下篇文章中我們將探索《死者之書》中創建著色、光照和後期處理等內容,盡情關注。

1 則留言:

著作人