基于 Unity 6 引擎制作的 demo 《Time Ghost》
開始《Time Ghost》項目時的目標之一是提升在 Unity 中構建大型戶外環境的構建標準。為了實現這一目標,我們要有處理更為復雜的場景的能力、有足夠的工具支持,同時它對引擎的核心圖形、光照、后處理、渲染和性能也提出了更高的要求。雖然我們能夠預見到 Unity 6 的圖形改進能滿足大部分需求,但工具方面仍面臨挑戰。
隨著游戲世界變得越來越復雜,高效的工具對于管理自然資產的放置和渲染變得至關重要。我們需要一個智能系統來確保環境資產的真實分布與多樣性。同時,由于計劃使用大量的植被,因此渲染方面的技術解決方案,既要具備擴展性,也要在運行時保持較高的性能。
本文將分享構建《Time Ghost》場景環境中的一些做法,并解析我們所用的工作流程和工具。
生成散布數據
第一步,我們將構成環境基礎的網格導入 DCC 軟件(本例中是 Houdini)。這些網格可以是激光雷達(LiDAR)掃描、無人機掃描或在 Unity 中手動雕刻的地形。對于 Houdini,我們開發了散布分析工具。 這些工具可以根據地形屬性自動放置資產,幫助我們設計和生成細節豐富、多種多樣的連貫的逼真環境。
此外,通過采用SpeedTree 和標準攝影測量工作流程,我們還創建了高質量的植被預制件并將其散布在網格上。 散布系統允許對隨機性和密度進行微調,確保植被的自然分布和多樣性。
接下來,我們將散布數據從 Houdini 導出為點緩存/點云,使用的是 Unity 在 GitHub 上提供的VFX Toolbox 中的 Point Cache Exporter HDA 稍加改動的版本。這個工具可以保存每個散布實例的位置,同時保存其縮放、方向、顏色、年齡和健康屬性,并為散布數據中的每種模型生成一個點緩存。
Unity 集成
利用DOTS(面向數據技術棧)和ECS(實體組件系統),我們可以創建包含成千上萬個實體的場景,同時保持性能穩定。這是通過實體實例化和資源分配的精細管理實現的。
每個從 Houdini 導出的點云資產實際上只是由位置、方向、縮放等信息組成的集合,可能還包括一些額外的數據(例如年齡、健康狀況、顏色等)。我們將所有 Houdini 導出的點云匯集到一個名為PointCloudFromHoudiniAsset的資源中。這個資源讀取原始點云,根據命名規則找到要與每個點云搭配的預制件,并創建數據的內部表示形式。這些數據被存儲在 PointCloudFromHoudiniAsset 中,隨后在烘焙過程中被劃分為多個空間分區,以便更快速地進行數據流式加載。
下一步是在 ECS 子場景中添加一個創作組件(authoring component),名為ScatterPointCloudAuthoring。該組件將 PointCloudFromHoudiniAsset 和一些參數作為輸入數據,這些參數可用于控制何時加載和卸載數據,以及如何對點云數據進行細分。
為了高效地流式傳輸數據,我們將點云數據細分為場景區塊(scene sections),這些區塊可以單獨加載和卸載。這樣,我們就可以根據距離視角的遠近來加載和卸載不同的區塊。區塊的大小由創作組件中的 ScatterSceneSectionSize 屬性控制。
然而,這些場景區塊相對較大,如果一次性實例化所有數據,將導致 CPU 負載驟增。每個場景區塊可能包含數十萬個點,因此,這些區塊會進一步細分為更小的圖塊(tile),稱為“散布圖塊”(由創作組件中的 ScatterTileSize 屬性控制)。實例化邏輯會根據重要性規則,選擇接下來需要實例化的散布圖塊以及需要卸載的圖塊。
圖塊替身
即便可以高效地流式加載和卸載實例,我們依然面臨需要渲染大量實例的問題。許多實例的體積較小,如草叢,在遠處移動時僅覆蓋屏幕的小塊區域。因此,我們將部分散布實例烘焙為圖塊替身(tile impostor)。圖塊替身覆蓋特定區域,并模仿該區域散布實例的外觀。
數據直接從點云資產中獲取,因為我們希望控制圖塊包含的植被類型。在本例中,我們僅關注草地資產,忽略同一區域內的樹木。
圖塊替身(tile impostor)生成器從上方渲染屬于該圖塊的所有實例,生成包含每個圖塊的近似顏色、法線和深度信息的低分辨率紋理。此外,一些最重要的植物類型被選中并從側面和上方渲染到圖集上。這個圖集被所有圖塊共享,并用于為每個圖塊的低分辨率紋理數據生成細節。生成器還創建了一個由多個四角面組成的網格,代表圖塊并讓四角面朝向視角。
在運行時,我們將每個圖塊的低分辨率紋理信息與更詳細但通用的植被紋理集條目,投射到圖塊替身網格上,從而生成圖塊的近似外觀。
隨著攝像機逐漸遠離某個區域,單個實例首先會切換到較低的細節級別(LOD),最終被圖塊替身所取代。圖塊替身也有多個細節級別,隨著攝像機進一步遠離,四角面的分布會變得更為稀疏。
提升大型場景性能的替身系統
對于場景中非常遠的對象,我們使用八面體替身(octahedral imposters)。這種方法可以顯示距離攝像機較遠物體的簡化版本,從而在視覺效果與性能之間取得平衡。我們開發了一個簡單的工具,可以直接在 Unity 中生成并集成這些替身。這個工具簡化了工作流程,提供了優化性能的同時保持高視覺標準的高效方法。
植被控制系統
我們的植被控制系統提供了復雜的配置設置,可以調整風速、風的變化和頻率等環境效果,確保環境中動畫元素的真實感和性能。
植被著色器接收健康和年齡屬性,用以實現自然的顏色變化和更真實的風相應效果。比如,一株干燥的植物會更僵硬,擺動幅度小于綠色的植物。
場景中的實體也經過設計,可與角色進行逼真的交互。例如,植被會對角色的存在和移動做出動態響應。這個系統采用基于 GPU 的方法來處理與植被的交互(如碰撞),并通過簡化的彈簧物理(spring physics)來計算和模擬角色與環境元素交互的效果。
高質量的環境光照
自適應探針體積(APV)
為了獲得高質量的光照效果,場景通常需要在不同區域使用不同的光照設置。對于光線會在各種不規則表面上反彈的狹小空間,和光照相對均勻的開闊平原上,往往需要采用不同的處理方法。
Unity 6 引入了新的“自適應探針體積”功能,它會自動在最需要光照探針的地方放置探針。
(注:通過可視化工具展示光照探針的位置時,可以明顯看出壕溝里的探針比平原上的更密集,可以捕捉到更為細致的光照變化。)
場景混合
場景混合(Scenario Blending)讓我們可以烘焙不同的光照設置狀態,并在這些狀態之間進行平滑過渡。
這樣就可以為同一環境的不同時間創建不同的光照場景。太陽角度和環境色的變化可以通過實時光照來實現,而烘焙的光照場景讓間接光照也能夠相匹配。
接下來的計劃
在當今先進的數字環境創建中,實現大量自然資源的自然連續分布和光照處理(無論是細致的近景還是寬廣的遠景,)都是至關重要的。基于ECS的處理方法不僅提升了畫面質量,還在數據處理和解讀方面提供了極大的靈活性,同時考慮了大型實時3D項目的性能需求。
我們已經在Unity Asset Store中發布了《Time Ghost》demo 的兩個 Unity 項目——一個是環境場景,另一個是角色。 如果你想親自體驗上述流程的效果,可以下載《Time Ghost: Environment》項目,其中包含我們用 Unity 6 為《Time Ghost》創建的一個環境場景。
示例旨在展示我們使用的技術和方法,幫助你評估是否可以將類似的思路應用到自己的項目中。
Unity 6 現已發布,點擊回顧。歡迎下載體驗 Unity 6 眾多新工具和功能,體驗更快的渲染速度與更先進的光照選項。
Unity 官方微信
第一時間了解Unity引擎動向,學習進階開發技能
每一個“在看”,都是我們前進的動力
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.