如何用UE高效生成細節豐富的《重生邊緣》野外場景(上)
以下文章來源於NExT Studios ,作者引擎全開的
“過程化內容生成”也叫“程式內容生成”(Procedural Content Generation=PCG),是一種自動為遊戲、模擬或電影建立數字資產的方式,可以大大提高內容生成的效率。
NExT Studios 在使用虛幻引擎4開發《重生邊緣》(SYNCED:Off-Planet)的過程中,在過程化生成場景方面進行了一些嘗試:除了介紹各種生成內容的思路外,還分享了針對過程化生成工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及一些實驗性工作分享。
主地圖曝光!最初只有3個場景美術,作為中途加入者,會遇到哪些問題?如何提高過程化生成工具的工作效率
主地圖3x3公里,大約有 20 個 POI、16 層地表、9 萬多棵樹、30 多種植被、 20 公里長的路和 6 公里的河流。最初除了Unreal Editor之外,我們沒有過程化生成的積累,在加入過程化生成內容的時候,也不能覆蓋已有的 prototype 關卡,同時需要兼顧關卡美術和關卡策劃的操作習慣(他們在Unreal Editor中進行資料編輯工作,但過程化生成演算法是在Houdini中實現,需要匯入匯出資料),各個生成元素之間有一定資料依賴關係(比如河流改動會影響地形的高度圖和材質層,地形高度圖改動也會影響到植被的分佈等)......我們面臨許多挑戰。
我們開發了約30個工具,但因為場景中每個 POI 的風格和設計都非常不一樣,較難提取統一的理性規律,所以工具的目的是調整關卡布局時,加速周邊環境的修改,大部分的生成內容集中在野外區域。
地表侵蝕的作用?地表材質層的權重分佈如何計算?
把mask轉成地形後做侵蝕美化是基礎功能,侵蝕會改變高度圖的表現,也會生成地表材質層的權重分佈。
地表權重圖是在Houdini當中進行計算的,大概原理是:根據高度圖的斜率計算出大體分佈,然後配合例如雨水沖刷的效果,根據每一層的石頭和沙地的規則,定義出不同的權重圖,然後匯入引擎,就可以得到混合好的地表效果。
垂直面地表崖壁岩石如何生成?如何在地表上呈現更豐富的細節?人物卡進mesh裡如何處理?
我們當時參考了一些業界資料,比如《孤島驚魂5》(Far Cry 5)、《刺客信條》(Assassin's Creed)。一開始我們根據地形的坡度,提取它的區域轉成mesh,然後生成UV,貼上我們想要的紋理後,用displacement map模擬了岩石表面的凹凸,但是近看的效果不理想。於是我們嘗試了另外一種方案——mesh貼片。像貼瓦片一樣,把固定的mesh往所需區域裡重複貼上,這樣可以用比較低的面數達到更好的效果,因為它的幾何細節會更多一些。
在生成崖壁的mesh的時候,崖壁下方和與地表過渡的地方,可以用與岩石紋理類似的地表材質來表現,因此生成了相應的地表材質權重層。還需要處理生成的岩石與地表的過渡:生成mesh的時候,把權重寫到了頂點色裡面,然後取樣地形的紋理做柔和地過渡。岩石下方我們可以生成一些碎石或砂石,這樣會有更具細節的地表表現。
在實際運用中還會遇到一些尷尬的問題,例如人物有時會卡在生成的mesh裡。這是因為Unreal根據不規則的mesh預設生成的碰撞體有很大瑕疵,這時我們會針對這些不是閉包類的mesh生成特殊碰撞體,然後再一起匯入引擎。
如何計算獲得視覺均勻的植被分佈?植被間距如何考量?如何進行撒點操作?
我們參考了《孤島驚魂5》(Far Cry 5),這幾乎是業界最詳細的分享。我們的整體生態和植被組成是不一樣的,我們選擇的是溫帶針葉林。具體做法是:我們根據高度圖生成各種各樣的mask,再配合噪聲模擬隨機分佈。在此之上,我們可以把光照、風向和氣候影響也考慮在內,生成更多的mask,通過運算得到我們想要的分佈。
有了植被的區域後,我們可以在區域中進行撒點操作:一種操作是直接在區域中進行隨機撒點,另一種是圍繞某個目標點周圍進行隨機撒點。我們可以在第二種情況下生成伴生的灌木,一般情況下我們不可能一次只生成一種植被。
我們針對每種植被定義了三種半徑,用來防止樹與樹之間的重合。根據這些規則,我們量化這些點的位置,讓離得較近的點更易被判斷。如果這些點都被包圍的時候,我們無法移動把它排除掉,我們就刪掉它。
通過這樣不斷迭代,我們可以獲得非常均勻、沒有互相穿插的效果。但在不同的樹種之間(例如高大的樹木和低矮的灌木間),其實可以有一定的穿插,這是我們定義外半徑和內半徑的原因。對於大地圖上的不同的區域,會有不同的生態分佈。我們可以通過全地圖刷mask來區分我們每一部分使用怎樣的生成規則。比如說在海邊,我們會以一些草地沙石為主,山上則以森林為主。
河流如何生成?下游比上游還要高如何處理?轉折度大的河流如何處理平滑?生成完河道之後,地表的紋理細節如何調整?
在《重生邊緣》中,河流是表現類的效果,不影響遊戲的玩法,所以過高的高度差、過深的水面都是策劃和美術不想要的,所以我們希望做很淺的溪流。我們演算法上也學習過《地平線》(Horizon)的分享,整個生成過程大概分成:
• 我們先有大概的曲線,根據地形高度圖做自然滑落。相當於把一條繩子扔在地表上,它會自然地彎曲;
• 有些地方地勢比較高,我們可以挖一條河道,這時會改變地形的高度;
• 因為我們不想生成過大高度差,從高地往低地過渡時,我們需要形成多級小瀑布;
• 然後我們根據河流的地形地勢分佈和彎曲度,生成河面河道寬度的變化。
• 最後我們在河道里撒上一些碎石和水花去裝飾,並生成河流的流向。
河道生成的其他問題:
• 支流跟主流交叉的地方,可能高度並不一樣,我們需要對齊高度;
• 有可能下游高於上游高度,這時候需要用下游的高度去往上游去做修正;
• 轉折度較大和多個支流交叉的區域,我們不可能生成很多層的河面的mesh,所以做平滑處理,從平滑後的河道形狀提取出河面,再對河面mesh進行切割和減面,這樣對效能的優化很有幫助。
如何減少河面流向圖的記憶體佔用?如何編輯河流的走向和效果?
對於河面的流向圖,如果用全地圖的flow map一張紋理來覆蓋的話,會浪費非常多的UV空間。考慮到更高效效能和更低記憶體佔用,我們把流向資訊寫到頂點色裡,只需佔用兩個通道。
生成完河道後,地表的紋理會隨之變化,我們可以鋪設鵝卵石,或在河岸邊緣生成潮溼泥沙的效果增加河岸表現,生成相應的植被分佈增加細節等。
我們使用Unreal Landscape Spline的內建功能來對河流進行曲線編輯,因為它比較符合美術的操作習慣。我們先拖拽出河流經過的區域,然後編輯各個支流大致的路徑,設定每條支流的起始點,之後一鍵生成。這時候我們可以根據地勢做自然彎曲,挖出河道、生成地表的紋理,生成河面的mesh,還有河面流向的資料,包括水花、石頭等等。
裂縫長草、土路破損、路口過渡、車輪印記等道路上的“細節加分項”如何實現?多層貼花的優先順序如何制定?
遊戲當中的道路基本是關卡策劃在編輯,它對玩法是有一定影響的,當我們加入做生成工具的時候,路網已有大約百分之八九十的完成度,所以我們並不是生成道路本身的路網,而是選擇去增加一些細節“加分項”。比如裂縫長草、公路破損、不同道路之間的過渡、交叉口的車輪印記等。
實現的思路就是使用海量貼花(在 GDC 2017 的 Ghost Recon Wildlands: Terrain Tools and Technology 中有類似分享)來實現,包括路面的破損、道路中間的車輪印、車道標記、水跡效果、路邊的落葉的塵土的效果,都是通過貼花的方式來實現的。但裂縫裡長的草不是貼花,是在生成裂縫貼花的時候,順便把裂縫草的位置一起計算出來。
還有一個比較實用的功能,用Unreal Landscape Spline做道路的時候並不能很好地處理交叉口,我們生成了任意角度交叉口的貼花,掩蓋了銜接處的接縫問題。
有了多層貼花,我們需要定義呈現層次的優先順序問題,所以我們制定了“同級融合,高階覆蓋低階”的貼花規則。全體的半透明材質的貼花數量加起來有數萬個,有很重的overdraw,會帶來非常嚴重的效能問題。所以我們使用了 Unreal 的Runtime Virtual Texture 來進行優化,把地表混合的結果跟道路和貼花混合的結果快取到了一張巨大的虛擬紋理上面,可以大大降低地表繪製的開銷。
另外我們在道路曲線計算完畢之後,可以根據道路曲線的分佈來調整地表的權重分佈。比如我們可以在道路的周邊去生成相應地表的過渡效果(裂縫、草、破損塵土、水跡、路口交叉口車輪的印記),另外還有道路的附屬物(比如護欄、電線杆)等。
針對工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及更多實驗性工作的分享,敬請期待下期推送!
來源:NExT Studios
原文:https://mp.weixin.qq.com/s/50f9AUIs3sAY-zBnCil2PQ
“過程化內容生成”也叫“程式內容生成”(Procedural Content Generation=PCG),是一種自動為遊戲、模擬或電影建立數字資產的方式,可以大大提高內容生成的效率。
NExT Studios 在使用虛幻引擎4開發《重生邊緣》(SYNCED:Off-Planet)的過程中,在過程化生成場景方面進行了一些嘗試:除了介紹各種生成內容的思路外,還分享了針對過程化生成工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及一些實驗性工作分享。
《重生邊緣》主地圖
主地圖曝光!最初只有3個場景美術,作為中途加入者,會遇到哪些問題?如何提高過程化生成工具的工作效率
主地圖3x3公里,大約有 20 個 POI、16 層地表、9 萬多棵樹、30 多種植被、 20 公里長的路和 6 公里的河流。最初除了Unreal Editor之外,我們沒有過程化生成的積累,在加入過程化生成內容的時候,也不能覆蓋已有的 prototype 關卡,同時需要兼顧關卡美術和關卡策劃的操作習慣(他們在Unreal Editor中進行資料編輯工作,但過程化生成演算法是在Houdini中實現,需要匯入匯出資料),各個生成元素之間有一定資料依賴關係(比如河流改動會影響地形的高度圖和材質層,地形高度圖改動也會影響到植被的分佈等)......我們面臨許多挑戰。
我們開發了約30個工具,但因為場景中每個 POI 的風格和設計都非常不一樣,較難提取統一的理性規律,所以工具的目的是調整關卡布局時,加速周邊環境的修改,大部分的生成內容集中在野外區域。
場景結構
地表侵蝕的作用?地表材質層的權重分佈如何計算?
把mask轉成地形後做侵蝕美化是基礎功能,侵蝕會改變高度圖的表現,也會生成地表材質層的權重分佈。
侵蝕前後地形對比
地表權重圖是在Houdini當中進行計算的,大概原理是:根據高度圖的斜率計算出大體分佈,然後配合例如雨水沖刷的效果,根據每一層的石頭和沙地的規則,定義出不同的權重圖,然後匯入引擎,就可以得到混合好的地表效果。
混合好的地表效果
垂直面地表崖壁岩石如何生成?如何在地表上呈現更豐富的細節?人物卡進mesh裡如何處理?
我們當時參考了一些業界資料,比如《孤島驚魂5》(Far Cry 5)、《刺客信條》(Assassin's Creed)。一開始我們根據地形的坡度,提取它的區域轉成mesh,然後生成UV,貼上我們想要的紋理後,用displacement map模擬了岩石表面的凹凸,但是近看的效果不理想。於是我們嘗試了另外一種方案——mesh貼片。像貼瓦片一樣,把固定的mesh往所需區域裡重複貼上,這樣可以用比較低的面數達到更好的效果,因為它的幾何細節會更多一些。
mesh貼片效果
在生成崖壁的mesh的時候,崖壁下方和與地表過渡的地方,可以用與岩石紋理類似的地表材質來表現,因此生成了相應的地表材質權重層。還需要處理生成的岩石與地表的過渡:生成mesh的時候,把權重寫到了頂點色裡面,然後取樣地形的紋理做柔和地過渡。岩石下方我們可以生成一些碎石或砂石,這樣會有更具細節的地表表現。
增加細節前後的巖壁對比
在實際運用中還會遇到一些尷尬的問題,例如人物有時會卡在生成的mesh裡。這是因為Unreal根據不規則的mesh預設生成的碰撞體有很大瑕疵,這時我們會針對這些不是閉包類的mesh生成特殊碰撞體,然後再一起匯入引擎。
如何計算獲得視覺均勻的植被分佈?植被間距如何考量?如何進行撒點操作?
我們參考了《孤島驚魂5》(Far Cry 5),這幾乎是業界最詳細的分享。我們的整體生態和植被組成是不一樣的,我們選擇的是溫帶針葉林。具體做法是:我們根據高度圖生成各種各樣的mask,再配合噪聲模擬隨機分佈。在此之上,我們可以把光照、風向和氣候影響也考慮在內,生成更多的mask,通過運算得到我們想要的分佈。
有了植被的區域後,我們可以在區域中進行撒點操作:一種操作是直接在區域中進行隨機撒點,另一種是圍繞某個目標點周圍進行隨機撒點。我們可以在第二種情況下生成伴生的灌木,一般情況下我們不可能一次只生成一種植被。
兩種撒點方法
我們針對每種植被定義了三種半徑,用來防止樹與樹之間的重合。根據這些規則,我們量化這些點的位置,讓離得較近的點更易被判斷。如果這些點都被包圍的時候,我們無法移動把它排除掉,我們就刪掉它。
通過這樣不斷迭代,我們可以獲得非常均勻、沒有互相穿插的效果。但在不同的樹種之間(例如高大的樹木和低矮的灌木間),其實可以有一定的穿插,這是我們定義外半徑和內半徑的原因。對於大地圖上的不同的區域,會有不同的生態分佈。我們可以通過全地圖刷mask來區分我們每一部分使用怎樣的生成規則。比如說在海邊,我們會以一些草地沙石為主,山上則以森林為主。
河流如何生成?下游比上游還要高如何處理?轉折度大的河流如何處理平滑?生成完河道之後,地表的紋理細節如何調整?
在《重生邊緣》中,河流是表現類的效果,不影響遊戲的玩法,所以過高的高度差、過深的水面都是策劃和美術不想要的,所以我們希望做很淺的溪流。我們演算法上也學習過《地平線》(Horizon)的分享,整個生成過程大概分成:
• 我們先有大概的曲線,根據地形高度圖做自然滑落。相當於把一條繩子扔在地表上,它會自然地彎曲;
• 有些地方地勢比較高,我們可以挖一條河道,這時會改變地形的高度;
• 因為我們不想生成過大高度差,從高地往低地過渡時,我們需要形成多級小瀑布;
• 然後我們根據河流的地形地勢分佈和彎曲度,生成河面河道寬度的變化。
• 最後我們在河道里撒上一些碎石和水花去裝飾,並生成河流的流向。
河流生成過程
河道生成的其他問題:
• 支流跟主流交叉的地方,可能高度並不一樣,我們需要對齊高度;
• 有可能下游高於上游高度,這時候需要用下游的高度去往上游去做修正;
• 轉折度較大和多個支流交叉的區域,我們不可能生成很多層的河面的mesh,所以做平滑處理,從平滑後的河道形狀提取出河面,再對河面mesh進行切割和減面,這樣對效能的優化很有幫助。
如何減少河面流向圖的記憶體佔用?如何編輯河流的走向和效果?
對於河面的流向圖,如果用全地圖的flow map一張紋理來覆蓋的話,會浪費非常多的UV空間。考慮到更高效效能和更低記憶體佔用,我們把流向資訊寫到頂點色裡,只需佔用兩個通道。
生成完河道後,地表的紋理會隨之變化,我們可以鋪設鵝卵石,或在河岸邊緣生成潮溼泥沙的效果增加河岸表現,生成相應的植被分佈增加細節等。
我們使用Unreal Landscape Spline的內建功能來對河流進行曲線編輯,因為它比較符合美術的操作習慣。我們先拖拽出河流經過的區域,然後編輯各個支流大致的路徑,設定每條支流的起始點,之後一鍵生成。這時候我們可以根據地勢做自然彎曲,挖出河道、生成地表的紋理,生成河面的mesh,還有河面流向的資料,包括水花、石頭等等。
裂縫長草、土路破損、路口過渡、車輪印記等道路上的“細節加分項”如何實現?多層貼花的優先順序如何制定?
遊戲當中的道路基本是關卡策劃在編輯,它對玩法是有一定影響的,當我們加入做生成工具的時候,路網已有大約百分之八九十的完成度,所以我們並不是生成道路本身的路網,而是選擇去增加一些細節“加分項”。比如裂縫長草、公路破損、不同道路之間的過渡、交叉口的車輪印記等。
實現的思路就是使用海量貼花(在 GDC 2017 的 Ghost Recon Wildlands: Terrain Tools and Technology 中有類似分享)來實現,包括路面的破損、道路中間的車輪印、車道標記、水跡效果、路邊的落葉的塵土的效果,都是通過貼花的方式來實現的。但裂縫裡長的草不是貼花,是在生成裂縫貼花的時候,順便把裂縫草的位置一起計算出來。
還有一個比較實用的功能,用Unreal Landscape Spline做道路的時候並不能很好地處理交叉口,我們生成了任意角度交叉口的貼花,掩蓋了銜接處的接縫問題。
道路交叉口貼花
有了多層貼花,我們需要定義呈現層次的優先順序問題,所以我們制定了“同級融合,高階覆蓋低階”的貼花規則。全體的半透明材質的貼花數量加起來有數萬個,有很重的overdraw,會帶來非常嚴重的效能問題。所以我們使用了 Unreal 的Runtime Virtual Texture 來進行優化,把地表混合的結果跟道路和貼花混合的結果快取到了一張巨大的虛擬紋理上面,可以大大降低地表繪製的開銷。
另外我們在道路曲線計算完畢之後,可以根據道路曲線的分佈來調整地表的權重分佈。比如我們可以在道路的周邊去生成相應地表的過渡效果(裂縫、草、破損塵土、水跡、路口交叉口車輪的印記),另外還有道路的附屬物(比如護欄、電線杆)等。
針對工具加入場景製作後,如何解決新的工具在實際工作中遇到的各種問題,以及更多實驗性工作的分享,敬請期待下期推送!
來源:NExT Studios
原文:https://mp.weixin.qq.com/s/50f9AUIs3sAY-zBnCil2PQ
相關文章
- 如何用UE高效生成細節豐富的《重生邊緣》野外場景(下)
- 數年磨礪,《重生邊緣》正式上線!
- 使用嚮導介面 豐富細節的移倉助手
- 兩年過去了,《重生邊緣》正在經歷自己的重生
- 邊緣應用場景需求興起,FusionCube解碼智慧邊緣!
- 史上最全的邊緣計算應用場景
- 邊緣叢集場景下的映象快取快取
- Spring IoC註解式開發無敵詳細(細節豐富)Spring
- NExT工作室射擊端遊《重生邊緣》夏季上線
- 在邊緣計算場景中使用Dapr
- 打破邊界,邊緣計算有何應用場景?
- 邊緣雲端計算典型應用場景
- 安全容器在邊緣計算場景下的實踐
- SuperEdge: 使用WebAssembly擴充套件邊緣計算場景Web套件
- 不斷豐富“VR+健康醫療”應用場景YDVR
- OpenYurt:延伸原生 Kubernetes 到邊緣場景下的落地實踐
- 中秋活動專場!獎金翻倍+豐富周邊,玩轉PSRC
- 對話《重生邊緣》製作人:國內做3A如苦行僧,但是一件很有意義的事情
- 邊緣計算場景下雲邊端一體化的挑戰與實踐
- 另闢蹊徑的《重生邊緣》,不一樣的PvPvE體驗
- 聚焦邊緣計算場景,打造雲邊端一體化容器雲平臺
- 《重生邊緣》正式黎明公測,顛覆傳統的射擊體驗
- 《重生邊緣》亮相遊戲之夜,WeGame宣佈開放預約遊戲GAM
- Vue 常見業務場景以及細節心得Vue
- 使用 Linux cowsay 製作豐富多彩的節日問候Linux
- 豐富 pytest 的 assert
- 戴文軍:如何用邊緣計算+邊緣儲存打造新一代智慧影片雲
- 阿里雲 肖文鵬:邊緣雲創新場景探索與實踐阿里
- 對話《重生邊緣》製作人:為什麼要做3A遊戲遊戲
- 戴文軍:如何用邊緣計算+邊緣儲存打造新一代智慧視訊雲
- 如何實現邊緣計算中的節點自治
- fortune-sheet: 功能豐富的ReactJS線上Excel庫ReactJSExcel
- 基於邊緣雲業務場景,深析阿里雲的“前端智慧化”實踐阿里前端
- 和《重生邊緣》製作人聊了聊 從2A到3A的漫漫長路
- KubeEdge邊緣計算在順豐工業物聯網中的實踐
- 使用 Prometheus 在 KubeSphere 上監控 KubeEdge 邊緣節點(Jetson) CPU、GPU 狀態PrometheusGPU
- Kotlin邊用邊學:Inline Functions的適用場景KotlininlineFunction
- 利用非對話語料來豐富對話生成模型模型