如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)

引擎全開的發表於2022-03-07
以下文章來源於NExT Studios ,作者引擎全開的

上篇文章中,我們從地形、崖壁、植被、河流、道路五個方面介紹了NExT Studios 在使用虛幻引擎4開發《重生邊緣》的過程中,過程化內容生成的一些嘗試。

本篇將針對工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及分享一些試驗性工作。

直達現場


我是進度條

過程化內容生成中容易遇到哪些流程問題?

比如生成的效果達不到美術的要求;工具的使用門檻太高,他們不想用;工具不夠穩定,他們覺得折騰的成本太高;或者涉及多人協作的問題,這個事情到底是程式設計師做、TA做、還是關卡美術做?多個關卡美術的協作需求如何解決?等等。只有解決了這些問題才算是一個合格可用的工具鏈。

基於前面的分享,相信大家也能看出,我們的目的是:並不追求全地圖自動化生成,而是根據需求做一些定製,提高製作效率。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
過程化內容生成管線

自動生成內容和人工編輯內容之間的衝突問題如何解決?生成內容之間的關卡切分問題如何考慮?不同子關卡的生成限制如何保證結果的穩定性?

我們總結出來兩個原則,第一是生成的內容不能覆蓋人工編輯的內容。第二是各個子關卡之間儘量地獨立地編輯和生成。就像 Unreal 大世界裡的地圖,通常會編輯成多個子關卡,方便多個美術協作,然而對於過程化生成的內容,也需要去做這樣的支援。比如可以對world composite做一個支援,支援地形自動切分到子關卡。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
自動切分到子關卡

關於生成的內容(大量貼花、崖壁、河流等)之間,也都需要切到子關卡。只有切分了子關卡,才能做獨立地剔除和 level streaming,同時也能支援不同的人來編輯和生成不同的子關卡。

對於不同的子關卡,我們生成的限制是需要保證結果的穩定性:不管是多塊一起計算出來的結果,還是單塊單獨計算出來的結果,應該是一致的。這樣才能夠保證按照子關卡的方式去工作。

地形和建築的穩定性如何解決?

對於地形來說,我們沒辦法很好地解決。因為關卡與關卡之間會有一道必然的交界,如果只更新了其中的一塊,另外一塊就接不上了。

雖然可以對整個地形做整體的侵蝕或美化,做一次全量更新,但這對於整個開發來說是非常不友好的行為,因為需要協調所有人,把所有的關卡檔案都解鎖。我覺得更實用的做法是做區域性的更新,比如只更新刷過mask的區域。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
區域性更新mask

對於有些建築區域,比如某處建了一棟房子,要求地基是平的,我們不想在生成地形的時候改變地表,很可能房子就懸空了。我們可以使用volume把區域框起來,跳過這個區域的侵蝕生成。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
volume排除侵蝕區域

跟美術編輯的衝突問題如何解決?

有時候過程化生成的內容跟美術編輯的內容在同一個資料集裡面,就會產生衝突問題。到底用誰的呢?Unreal提供了Edit Layer的功能,它跟Photoshop的圖層一樣,可以把生成的單獨放一層,人工編輯的單獨放一層,甚至還可以開更多的層,這樣就可以混合人工編輯和我們生成的資料,得到想要的效果。但有的時候可能並不想要混合效果,而想要替換效果(比如說河流河道可以替換掉原有的地形)。我們又開發了一個Edit Layer的覆蓋混合模式,用來支援這樣的需求,同時也擴充套件了Unreal權重繪製的工具,用來繪製mask,支援這種覆蓋混合和很多層的表現。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
Edit Layer覆蓋混合模式

還有一種衝突比較常見,比如說美術在某處放棵樹,只是用來做裝飾的,但是我們生成植被的時候很可能就把這棵樹給生成沒了,那這不是他們想看到的。所以我們針對生成的樹都會打標記,每個instance上都會有一個特殊的屬性,這樣就能夠區分出來到底哪些樹是我們生成的,哪些樹是美術編輯的。再重新生成的時候,就可以把原來生成的樹全部刪掉,做一次全量更新,但美術擺的樹並不會被刪掉,而且也可以選擇避開他們。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
很容易樹沒了

資料匯入匯出的問題如何處理?

我們沿用了Unreal Landscape Spline曲線生成,這些資料需要匯出到Houdini當中進行運算,其實這也是為編輯的操作習慣而做的妥協,也避免了再開發全新的一套曲線編輯工具。

我們把Unreal Landscape Spline重新做了演算法量化,匯出成一個 JSON,然後在Houdini當中提取這些關鍵點做重建,這樣就可以基於這條曲線去做演算法實現。我們也加了各種各樣的自定義屬性,比如說曲線的型別,因為它會有不同的內容(路、護欄、河等),他們是屬於不同曲線的。曲線的寬度還有優先順序也都是通過這種方式新增到 JSON 檔案裡。

針對生成的內容。我們也做了一個簡單的熱力圖掃描工具,可以選擇任意一個Unreal當中的某個stat,比如針對面數去做統計,生成視覺化的表現,方便美術在生成完或者關卡編輯完後去做效能自查。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
熱力圖效能分析皮膚

一些試驗性的探索

如果只是針對之前提的那幾個功能的話,可能整個工作流是大同小異的,但是每個專案其實需求都不一樣。比如說有的專案完全不用Houdini,生成演算法全在Unreal里程式設計師自己實現。還有的專案可能因為不喜歡資料互相導來導去,選擇整個的關卡布局是在Houdini當中進行製作,然後再匯入Unreal,這個時候就不能改了。還有的像我們一樣,頻繁匯入匯出,需要很多資料交換,那我們需要程式設計師不斷地處理這些特殊的需求。

所以我們在把這種工具推廣到不同專案的時候,就需要重構整個管線。我們支援了藍圖節點編輯,讓原來Houdini的HDA檔案生成一個藍圖的非同步節點,其所需要的資料準備是通過藍圖來進行的(包括資料輸出的後處理),這樣就具備了非常高的靈活性,能滿足很多奇奇怪怪的需求。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
可定製的生成流程

我們生成完,可以給它打個 tag 或者設定一些類似 virtual texture的屬性,然後生成一個actor,甚至改變它的材質。在這套機制下,解放了程式設計師的生產力,不用他們專門開發特性。因為有的時候我發現不是這些功能實現不了,而是美術等不了,或者使用者等不了,反覆折騰的時候他們就不想用了。

另外,我們把資料的輸入輸出做了抽象,比如抽象成圖,或者曲線,或是一些點,然後把這些資料做了抽象之後,甚至可以通過網路來傳輸這些資料,把生成的服務放到一臺更強健的GPU工作站上。而且把資料做完抽象之後,也不限於只用Houdini來做,可以搭建一些自己的服務,用 Maya或Blender也都可以,因為資料的交換變得非常簡單。

如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
生成伺服器

我們也做了些機器學習的一些嘗試,比如說基於GAN演算法的現實世界生成,或者是地表地形的風格化遷移等。還有一個很常見的問題是在用Houdini做這些工作的時候,資料的匯入匯出和計算都需要非常長的等待,有些團隊會傾向於在引擎中自己實現生成演算法,我們在這方面也做了一些簡單的嘗試,參考了《地平線:零之曙光》(Horizon Zero Dawn)的做法,使用GPU加速的方式做地表地形的生成和植被的分佈。

應用探索

過程化內容生成的技術除了應用在遊戲開發中,還有其他應用場景。例如NExT跟新華社合作的數字航天員小諍的火星視訊中,我們使用了過程化內容生成的技術模擬火星的地貌。UE5的Nanite可以在不限制三角形數量的情況下做大量的幾何細節,這應該也是後續遊戲製作的趨勢之一。


來源:NExT Studios

相關文章