您當前的位置:首頁 > 攝影

[Unreal4]基於GPU的實時植被生成

作者:由 V.c 發表于 攝影時間:2022-03-10

一、前言

之前研究PCG的時候看到了Horizon:Zero Dawn的實時植被編輯系統,而自己接觸Unreal也有段時間了,但還沒做過比較完整的工程,於是想著造個玩具練練手,也作為自己的畢設了。

二、效果演示

先上效果~寫了一套簡單的編輯系統,編輯方案參考了Horizon:Zero Dawn,可以繪製PlacementMap指定群落的分佈範圍,也可以透過繪製CleanMap來對指定的物種進行擦除。

[Unreal4]基於GPU的實時植被生成

群落繪製

https://www。zhihu。com/video/1485169939069313024

[Unreal4]基於GPU的實時植被生成

物種擦除

https://www。zhihu。com/video/1485170081646247936

在地形上的生成效果,目前的植被生成邏輯並沒有做的比較複雜,只是簡單地對斜率、水源作出反應,讓植被不會生在在較陡的斜坡上以及水體上。

[Unreal4]基於GPU的實時植被生成

在地形上的生成效果

https://www。zhihu。com/video/1485222436581400576

三、工具實現

1。總體流程

每個群落之間互不影響,群落內每個物種各自生成對應的密度圖,再將密度圖轉換為點雲,最後合併各物種點雲並剔除掉點雲中發生穿插的植株,作為群落的植被輸出。

[Unreal4]基於GPU的實時植被生成

一個群落的點雲生成流程

2。密度圖生成

密度圖生成的所使用的輸入紋理可以分為兩種,第一種是環境資料,如地形法線(用來計算坡度)、水源SDF。另外一種是人工編輯的紋理PlacementMap、CleanMap。每個物種可以使用不同的材質來自定義密度圖生成的邏輯,我這裡只是簡單的按照坡度來生成密度,並剔除了水面下的範圍,再對人工編輯的紋理做出響應。也可以透過取樣水源SDF來判斷離水源的大小,以此做到沿水源分佈。

[Unreal4]基於GPU的實時植被生成

物種密度生成

[Unreal4]基於GPU的實時植被生成

植被沿水邊生成效果

https://www。zhihu。com/video/1485103802033954816

3。單一物種生成

獲得密度圖後,考慮如何按照密度圖來生成隨機的點雲。先考慮如何在一個平面內塞入儘可能多的同等大小植株而植株之間又不會發生重疊,也就是如何生成泊松分佈。樸素的泊松分佈生成演算法的時間複雜度為

O(n)

,且該演算法無法並行化。最佳化的方法便是先預計算一個Tile內的泊松分佈,然後使用這個Tile對平面進行平鋪來得到總的點雲。

點雲的位置確定後,每個點取樣對應位置的密度圖,並以密度作為機率隨機決定是否保留該點,以此讓點雲的分佈符合密度圖。

[Unreal4]基於GPU的實時植被生成

單一物種的點雲生成

4。合併與剔除

在上一步我們保證了同一個物種的植株之間不會發生穿插,接著要防止不同物種之間的穿插。本文按照物種的大小半徑從大到小來生成點雲,新物種中的植株如果與舊物種中的植株發生穿插,則剔除掉髮生穿插的新物種。本文使用SDF紋理來檢測植株之間的穿插,該SDF紋理中的每個畫素中的值代表著其與最近的植株表面的距離。對於新物種的每個植株,取樣對應位置的SDF來獲得距離,如果該距離小於半徑,則說明該植株與舊物種中的植株發生穿插,應當剔除。並將剔除後的點雲與原點雲合併,並更新SDF,並接著繼續與新的物種點雲進行剔除與合併。

[Unreal4]基於GPU的實時植被生成

兩個不同物種的點雲合併過程

那麼如何生成SDF呢?本文采用的是Jump Flood Algorithm(JFA),該演算法可以在GPU上實現,能在

log_2W

個Pass內求出紋理中每個畫素到被標記畫素中的最近的畫素。根據生成的點雲,標記每顆植株對應位置的畫素,接著使用JFA求得每個畫素最近的被標記植株,並在其之間的距離上減去植株對應的半徑,即可獲得該點雲對應的SDF紋理。

5。計算著色器上的實現

計算著色器中的一個執行緒組對應著一個Tile,一個執行緒對應著一個點。對於每個執行緒,如果保留該點,則將點的位置資訊寫入Buffer,同時需要使用原子操作來防止寫入衝突。最後再從GPU回讀點雲的生成結果。由於使用者在繪製Mask時只會更新紋理的一小部分,所以可以只執行對應區域的生成來加速生成。

[Unreal4]基於GPU的實時植被生成

計算著色器中執行緒、執行緒組的對應關係

四、結語

在最開始研究PCG的時候簡單走過一遍基於Houdini的植被生成流程,意識到除了生成效果以外工具的反饋速度對於程式化工具也是極為重要的。目前該工具的效能也稱不上完善,在要生成的物種較多,地圖較大的時候掉幀嚴重,之後要進一步最佳化的話可以考慮參考SE的夜光引擎的World Editor,採用非同步計算的方式分攤計算任務。

五、參考

Procedural World Generation of Far Cry 5

GPU-Based Run-Time Procedural Placement in Horizon: Zero Dawn

夜光引擎World Editor

神棍趙:經驗分享|UE4版GPU植被生成工具

徐凱鳴:【UE4】給Landscape加一點料 - 植被篇

標簽: 生成  物種  點雲  植株  sdf