如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
以下文章來源於NExT Studios ,作者引擎全開的
上篇文章中,我們從地形、崖壁、植被、河流、道路五個方面介紹了NExT Studios 在使用虛幻引擎4開發《重生邊緣》的過程中,過程化內容生成的一些嘗試。
本篇將針對工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及分享一些試驗性工作。
直達現場
我是進度條
過程化內容生成中容易遇到哪些流程問題?
比如生成的效果達不到美術的要求;工具的使用門檻太高,他們不想用;工具不夠穩定,他們覺得折騰的成本太高;或者涉及多人協作的問題,這個事情到底是程式設計師做、TA做、還是關卡美術做?多個關卡美術的協作需求如何解決?等等。只有解決了這些問題才算是一個合格可用的工具鏈。
基於前面的分享,相信大家也能看出,我們的目的是:並不追求全地圖自動化生成,而是根據需求做一些定製,提高製作效率。
自動生成內容和人工編輯內容之間的衝突問題如何解決?生成內容之間的關卡切分問題如何考慮?不同子關卡的生成限制如何保證結果的穩定性?
我們總結出來兩個原則,第一是生成的內容不能覆蓋人工編輯的內容。第二是各個子關卡之間儘量地獨立地編輯和生成。就像 Unreal 大世界裡的地圖,通常會編輯成多個子關卡,方便多個美術協作,然而對於過程化生成的內容,也需要去做這樣的支援。比如可以對world composite做一個支援,支援地形自動切分到子關卡。
關於生成的內容(大量貼花、崖壁、河流等)之間,也都需要切到子關卡。只有切分了子關卡,才能做獨立地剔除和 level streaming,同時也能支援不同的人來編輯和生成不同的子關卡。
對於不同的子關卡,我們生成的限制是需要保證結果的穩定性:不管是多塊一起計算出來的結果,還是單塊單獨計算出來的結果,應該是一致的。這樣才能夠保證按照子關卡的方式去工作。
地形和建築的穩定性如何解決?
對於地形來說,我們沒辦法很好地解決。因為關卡與關卡之間會有一道必然的交界,如果只更新了其中的一塊,另外一塊就接不上了。
雖然可以對整個地形做整體的侵蝕或美化,做一次全量更新,但這對於整個開發來說是非常不友好的行為,因為需要協調所有人,把所有的關卡檔案都解鎖。我覺得更實用的做法是做區域性的更新,比如只更新刷過mask的區域。
對於有些建築區域,比如某處建了一棟房子,要求地基是平的,我們不想在生成地形的時候改變地表,很可能房子就懸空了。我們可以使用volume把區域框起來,跳過這個區域的侵蝕生成。
跟美術編輯的衝突問題如何解決?
有時候過程化生成的內容跟美術編輯的內容在同一個資料集裡面,就會產生衝突問題。到底用誰的呢?Unreal提供了Edit Layer的功能,它跟Photoshop的圖層一樣,可以把生成的單獨放一層,人工編輯的單獨放一層,甚至還可以開更多的層,這樣就可以混合人工編輯和我們生成的資料,得到想要的效果。但有的時候可能並不想要混合效果,而想要替換效果(比如說河流河道可以替換掉原有的地形)。我們又開發了一個Edit Layer的覆蓋混合模式,用來支援這樣的需求,同時也擴充套件了Unreal權重繪製的工具,用來繪製mask,支援這種覆蓋混合和很多層的表現。
還有一種衝突比較常見,比如說美術在某處放棵樹,只是用來做裝飾的,但是我們生成植被的時候很可能就把這棵樹給生成沒了,那這不是他們想看到的。所以我們針對生成的樹都會打標記,每個instance上都會有一個特殊的屬性,這樣就能夠區分出來到底哪些樹是我們生成的,哪些樹是美術編輯的。再重新生成的時候,就可以把原來生成的樹全部刪掉,做一次全量更新,但美術擺的樹並不會被刪掉,而且也可以選擇避開他們。
資料匯入匯出的問題如何處理?
我們沿用了Unreal Landscape Spline曲線生成,這些資料需要匯出到Houdini當中進行運算,其實這也是為編輯的操作習慣而做的妥協,也避免了再開發全新的一套曲線編輯工具。
我們把Unreal Landscape Spline重新做了演算法量化,匯出成一個 JSON,然後在Houdini當中提取這些關鍵點做重建,這樣就可以基於這條曲線去做演算法實現。我們也加了各種各樣的自定義屬性,比如說曲線的型別,因為它會有不同的內容(路、護欄、河等),他們是屬於不同曲線的。曲線的寬度還有優先順序也都是通過這種方式新增到 JSON 檔案裡。
針對生成的內容。我們也做了一個簡單的熱力圖掃描工具,可以選擇任意一個Unreal當中的某個stat,比如針對面數去做統計,生成視覺化的表現,方便美術在生成完或者關卡編輯完後去做效能自查。
一些試驗性的探索
如果只是針對之前提的那幾個功能的話,可能整個工作流是大同小異的,但是每個專案其實需求都不一樣。比如說有的專案完全不用Houdini,生成演算法全在Unreal里程式設計師自己實現。還有的專案可能因為不喜歡資料互相導來導去,選擇整個的關卡布局是在Houdini當中進行製作,然後再匯入Unreal,這個時候就不能改了。還有的像我們一樣,頻繁匯入匯出,需要很多資料交換,那我們需要程式設計師不斷地處理這些特殊的需求。
所以我們在把這種工具推廣到不同專案的時候,就需要重構整個管線。我們支援了藍圖節點編輯,讓原來Houdini的HDA檔案生成一個藍圖的非同步節點,其所需要的資料準備是通過藍圖來進行的(包括資料輸出的後處理),這樣就具備了非常高的靈活性,能滿足很多奇奇怪怪的需求。
我們生成完,可以給它打個 tag 或者設定一些類似 virtual texture的屬性,然後生成一個actor,甚至改變它的材質。在這套機制下,解放了程式設計師的生產力,不用他們專門開發特性。因為有的時候我發現不是這些功能實現不了,而是美術等不了,或者使用者等不了,反覆折騰的時候他們就不想用了。
另外,我們把資料的輸入輸出做了抽象,比如抽象成圖,或者曲線,或是一些點,然後把這些資料做了抽象之後,甚至可以通過網路來傳輸這些資料,把生成的服務放到一臺更強健的GPU工作站上。而且把資料做完抽象之後,也不限於只用Houdini來做,可以搭建一些自己的服務,用 Maya或Blender也都可以,因為資料的交換變得非常簡單。
我們也做了些機器學習的一些嘗試,比如說基於GAN演算法的現實世界生成,或者是地表地形的風格化遷移等。還有一個很常見的問題是在用Houdini做這些工作的時候,資料的匯入匯出和計算都需要非常長的等待,有些團隊會傾向於在引擎中自己實現生成演算法,我們在這方面也做了一些簡單的嘗試,參考了《地平線:零之曙光》(Horizon Zero Dawn)的做法,使用GPU加速的方式做地表地形的生成和植被的分佈。
應用探索
過程化內容生成的技術除了應用在遊戲開發中,還有其他應用場景。例如NExT跟新華社合作的數字航天員小諍的火星視訊中,我們使用了過程化內容生成的技術模擬火星的地貌。UE5的Nanite可以在不限制三角形數量的情況下做大量的幾何細節,這應該也是後續遊戲製作的趨勢之一。
來源:NExT Studios
上篇文章中,我們從地形、崖壁、植被、河流、道路五個方面介紹了NExT Studios 在使用虛幻引擎4開發《重生邊緣》的過程中,過程化內容生成的一些嘗試。
本篇將針對工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及分享一些試驗性工作。
直達現場
我是進度條
過程化內容生成中容易遇到哪些流程問題?
比如生成的效果達不到美術的要求;工具的使用門檻太高,他們不想用;工具不夠穩定,他們覺得折騰的成本太高;或者涉及多人協作的問題,這個事情到底是程式設計師做、TA做、還是關卡美術做?多個關卡美術的協作需求如何解決?等等。只有解決了這些問題才算是一個合格可用的工具鏈。
基於前面的分享,相信大家也能看出,我們的目的是:並不追求全地圖自動化生成,而是根據需求做一些定製,提高製作效率。
過程化內容生成管線
自動生成內容和人工編輯內容之間的衝突問題如何解決?生成內容之間的關卡切分問題如何考慮?不同子關卡的生成限制如何保證結果的穩定性?
我們總結出來兩個原則,第一是生成的內容不能覆蓋人工編輯的內容。第二是各個子關卡之間儘量地獨立地編輯和生成。就像 Unreal 大世界裡的地圖,通常會編輯成多個子關卡,方便多個美術協作,然而對於過程化生成的內容,也需要去做這樣的支援。比如可以對world composite做一個支援,支援地形自動切分到子關卡。
自動切分到子關卡
關於生成的內容(大量貼花、崖壁、河流等)之間,也都需要切到子關卡。只有切分了子關卡,才能做獨立地剔除和 level streaming,同時也能支援不同的人來編輯和生成不同的子關卡。
對於不同的子關卡,我們生成的限制是需要保證結果的穩定性:不管是多塊一起計算出來的結果,還是單塊單獨計算出來的結果,應該是一致的。這樣才能夠保證按照子關卡的方式去工作。
地形和建築的穩定性如何解決?
對於地形來說,我們沒辦法很好地解決。因為關卡與關卡之間會有一道必然的交界,如果只更新了其中的一塊,另外一塊就接不上了。
雖然可以對整個地形做整體的侵蝕或美化,做一次全量更新,但這對於整個開發來說是非常不友好的行為,因為需要協調所有人,把所有的關卡檔案都解鎖。我覺得更實用的做法是做區域性的更新,比如只更新刷過mask的區域。
區域性更新mask
對於有些建築區域,比如某處建了一棟房子,要求地基是平的,我們不想在生成地形的時候改變地表,很可能房子就懸空了。我們可以使用volume把區域框起來,跳過這個區域的侵蝕生成。
volume排除侵蝕區域
跟美術編輯的衝突問題如何解決?
有時候過程化生成的內容跟美術編輯的內容在同一個資料集裡面,就會產生衝突問題。到底用誰的呢?Unreal提供了Edit Layer的功能,它跟Photoshop的圖層一樣,可以把生成的單獨放一層,人工編輯的單獨放一層,甚至還可以開更多的層,這樣就可以混合人工編輯和我們生成的資料,得到想要的效果。但有的時候可能並不想要混合效果,而想要替換效果(比如說河流河道可以替換掉原有的地形)。我們又開發了一個Edit Layer的覆蓋混合模式,用來支援這樣的需求,同時也擴充套件了Unreal權重繪製的工具,用來繪製mask,支援這種覆蓋混合和很多層的表現。
Edit Layer覆蓋混合模式
還有一種衝突比較常見,比如說美術在某處放棵樹,只是用來做裝飾的,但是我們生成植被的時候很可能就把這棵樹給生成沒了,那這不是他們想看到的。所以我們針對生成的樹都會打標記,每個instance上都會有一個特殊的屬性,這樣就能夠區分出來到底哪些樹是我們生成的,哪些樹是美術編輯的。再重新生成的時候,就可以把原來生成的樹全部刪掉,做一次全量更新,但美術擺的樹並不會被刪掉,而且也可以選擇避開他們。
很容易樹沒了
資料匯入匯出的問題如何處理?
我們沿用了Unreal Landscape Spline曲線生成,這些資料需要匯出到Houdini當中進行運算,其實這也是為編輯的操作習慣而做的妥協,也避免了再開發全新的一套曲線編輯工具。
我們把Unreal Landscape Spline重新做了演算法量化,匯出成一個 JSON,然後在Houdini當中提取這些關鍵點做重建,這樣就可以基於這條曲線去做演算法實現。我們也加了各種各樣的自定義屬性,比如說曲線的型別,因為它會有不同的內容(路、護欄、河等),他們是屬於不同曲線的。曲線的寬度還有優先順序也都是通過這種方式新增到 JSON 檔案裡。
針對生成的內容。我們也做了一個簡單的熱力圖掃描工具,可以選擇任意一個Unreal當中的某個stat,比如針對面數去做統計,生成視覺化的表現,方便美術在生成完或者關卡編輯完後去做效能自查。
熱力圖效能分析皮膚
一些試驗性的探索
如果只是針對之前提的那幾個功能的話,可能整個工作流是大同小異的,但是每個專案其實需求都不一樣。比如說有的專案完全不用Houdini,生成演算法全在Unreal里程式設計師自己實現。還有的專案可能因為不喜歡資料互相導來導去,選擇整個的關卡布局是在Houdini當中進行製作,然後再匯入Unreal,這個時候就不能改了。還有的像我們一樣,頻繁匯入匯出,需要很多資料交換,那我們需要程式設計師不斷地處理這些特殊的需求。
所以我們在把這種工具推廣到不同專案的時候,就需要重構整個管線。我們支援了藍圖節點編輯,讓原來Houdini的HDA檔案生成一個藍圖的非同步節點,其所需要的資料準備是通過藍圖來進行的(包括資料輸出的後處理),這樣就具備了非常高的靈活性,能滿足很多奇奇怪怪的需求。
可定製的生成流程
我們生成完,可以給它打個 tag 或者設定一些類似 virtual texture的屬性,然後生成一個actor,甚至改變它的材質。在這套機制下,解放了程式設計師的生產力,不用他們專門開發特性。因為有的時候我發現不是這些功能實現不了,而是美術等不了,或者使用者等不了,反覆折騰的時候他們就不想用了。
另外,我們把資料的輸入輸出做了抽象,比如抽象成圖,或者曲線,或是一些點,然後把這些資料做了抽象之後,甚至可以通過網路來傳輸這些資料,把生成的服務放到一臺更強健的GPU工作站上。而且把資料做完抽象之後,也不限於只用Houdini來做,可以搭建一些自己的服務,用 Maya或Blender也都可以,因為資料的交換變得非常簡單。
生成伺服器
我們也做了些機器學習的一些嘗試,比如說基於GAN演算法的現實世界生成,或者是地表地形的風格化遷移等。還有一個很常見的問題是在用Houdini做這些工作的時候,資料的匯入匯出和計算都需要非常長的等待,有些團隊會傾向於在引擎中自己實現生成演算法,我們在這方面也做了一些簡單的嘗試,參考了《地平線:零之曙光》(Horizon Zero Dawn)的做法,使用GPU加速的方式做地表地形的生成和植被的分佈。
應用探索
過程化內容生成的技術除了應用在遊戲開發中,還有其他應用場景。例如NExT跟新華社合作的數字航天員小諍的火星視訊中,我們使用了過程化內容生成的技術模擬火星的地貌。UE5的Nanite可以在不限制三角形數量的情況下做大量的幾何細節,這應該也是後續遊戲製作的趨勢之一。
來源:NExT Studios
相關文章
- 如何用UE高效生成細節豐富的《重生邊緣》野外場景(上)
- 邊緣叢集場景下的映象快取快取
- 安全容器在邊緣計算場景下的實踐
- 使用嚮導介面 豐富細節的移倉助手
- OpenYurt:延伸原生 Kubernetes 到邊緣場景下的落地實踐
- 兩年過去了,《重生邊緣》正在經歷自己的重生
- 邊緣應用場景需求興起,FusionCube解碼智慧邊緣!
- 邊緣計算場景下雲邊端一體化的挑戰與實踐
- 史上最全的邊緣計算應用場景
- Spring IoC註解式開發無敵詳細(細節豐富)Spring
- 在邊緣計算場景中使用Dapr
- 打破邊界,邊緣計算有何應用場景?
- 數年磨礪,《重生邊緣》正式上線!
- 邊緣雲端計算典型應用場景
- SuperEdge: 使用WebAssembly擴充套件邊緣計算場景Web套件
- 不斷豐富“VR+健康醫療”應用場景YDVR
- 中秋活動專場!獎金翻倍+豐富周邊,玩轉PSRC
- OpenYurt v0.3.0 重磅釋出:全面提升邊緣場景下應用部署效率
- 對話《重生邊緣》製作人:國內做3A如苦行僧,但是一件很有意義的事情
- 另闢蹊徑的《重生邊緣》,不一樣的PvPvE體驗
- 聚焦邊緣計算場景,打造雲邊端一體化容器雲平臺
- 廣告場景下雙邊市場的實驗設計
- 《重生邊緣》正式黎明公測,顛覆傳統的射擊體驗
- NExT工作室射擊端遊《重生邊緣》夏季上線
- 《重生邊緣》亮相遊戲之夜,WeGame宣佈開放預約遊戲GAM
- Vue 常見業務場景以及細節心得Vue
- 使用 Linux cowsay 製作豐富多彩的節日問候Linux
- 豐富 pytest 的 assert
- 戴文軍:如何用邊緣計算+邊緣儲存打造新一代智慧影片雲
- 阿里雲 肖文鵬:邊緣雲創新場景探索與實踐阿里
- 對話《重生邊緣》製作人:為什麼要做3A遊戲遊戲
- StringBuilder在高效能場景下的正確用法UI
- 戴文軍:如何用邊緣計算+邊緣儲存打造新一代智慧視訊雲
- 如何實現邊緣計算中的節點自治
- 基於邊緣雲業務場景,深析阿里雲的“前端智慧化”實踐阿里前端
- 和《重生邊緣》製作人聊了聊 從2A到3A的漫漫長路
- KubeEdge邊緣計算在順豐工業物聯網中的實踐
- Kotlin邊用邊學:Inline Functions的適用場景KotlininlineFunction