【UE4+Houdini+Bridge】程序化地形生成——山谷環境製作思路

B站展示製作過程: Houdini To UE4 程序化地形生成製作過程與效果展示

最終效果圖

目錄

一、簡單介紹

二、製作步驟

2.1 Houdini製作步驟

2.1.1 地形創建

2.1.2 層級劃分

2.1.3 點雲生成

2.2 UE4製作步驟

2.2.1 地形材質

2.2.2 點雲模型替換

2.2.3 光源調整

2.2.4 內置的程序化植物生成器測試


一、簡單介紹

一直以來對於開放世界程序化生成比較感興趣,各種原因選擇了程序化野外山谷作爲第一個研究目標。

實現的效果還算達到預期,但是性能還是不滿意,修改參數後需要計算一些時間,可能是因爲用了Erode計算侵蝕的原因吧。

後續仍需要不少優化,也希望大佬能指導指導,暫想通過分Tile,重構Houdini與UE4的基礎管線方式提升,具體參考自該技術大佬分享

二、製作步驟

這裏僅將最終的製作思路作講解,期間零碎的測試不再贅述。

2.1 Houdini製作步驟

2.1.1 地形創建

通過學習與研究,我決定採用擅長製作程序化地形的Height Field節點,在該領域花費了較多的時間,首先創建一個默認大小的Height Field高度圖區域,大小剛好是題目要求的1k x 1k。Grid Spacing網格上兩點之間的距離,相當於這塊高度圖的分辨率大小,設置爲2。

使用Height Field Noise節點對高度值添加噪聲模擬地形,我將噪聲振幅、大小與模式參數暴露在了HAD中,使得在UE4中能夠進行進一步調整。

爲了使地形形狀能夠更加真實,我使用了Height Field Erode節點模擬自然中的雨水、風力侵蝕,這裏需要通過時間軸模擬侵蝕隨時間的變化,時間越久越耗費性能,我將幀數鎖在了20幀左右,這樣即使不小心移動了時間軸也不會對已經調整的效果產生影響,也避免了耗時的計算;緊接着通過Height Field Distort對地形進行扭曲,添加更多的細節,得到了不錯的山地與平原輪廓;最後通過Transform節點對地形整體進行了適度的擡升,方便後續的高度蒙版值設置。

2.1.2 層級劃分

雖然創建好了地形,但我們需要讓程序能夠知道樹木、草地或是石塊應該放置在哪,或是地表的材質會根據地區的不同而有所變化。Houdini提供了一個強大的節點Height Field Mask By Feature,它能夠根據一些參數的設置對當前地形進行分區。比如我通過坡度篩選,將20-80度的山地標記出來用於生成樹木。

使用Height Field Blur模糊上方的蒙版,讓過渡區域別那麼銳化明顯。

通過Height Field Copy Layer對當前創建的Mask區域進行重命名,這可以讓我們在UE4地形材質中能夠更容易的對各地形進行區分與關聯。

我們將山地與平原區分開來,爲之後UE4中設置不同的地形材質做準備。通過Mask By Height得到山脈部分,同時我也將該參數暴露了出去,當您高度超過上限時也可以自行調整。

這時我們通過Height Field Layer,將以上兩種不同的蒙版選擇Add模式進行疊加。同時你也可以根據情況,選擇其他的合成方式。

通過類似的方式,我又製作了坡度較爲平緩的地形蒙版,爲一些石塊的生成做準備。

疊加目前三種蒙版區域。

下面通過一個很特殊的節點Height Field Remap,將輸出最大、最小值倒置的方法,我們得到了與之前蒙版相反的區域,以此來代表平原生成草地。

2.1.3 點雲生成

Height Field Scatter節點讓我能夠通過設置Mask Layer針對特定的蒙版區域進行隨機撒點,通過覆蓋率等參數的調整達到了我期望的效果,將Tag Name命名爲tree,這樣能夠在Geometry Spreadsheet中看到這些參數的各種屬性數據。

同時需要注意的是,對於樹這種豎直生長的植物,我們需要去掉勾選Match Normals with Terrain是,這樣才能夠讓樹不沿着地形表面的法線生長。

 與此同時,我想創建兩種不同類型的樹木,並能通過權重控制其生成是數量。因而通過attribcreate創建class與weight兩個屬性來標記,記得將Class修改爲Primitive否則無效。

如果Box默認設置你會發現一半模型會在地底下,這是因爲軸心位於Box中心,因而複製Size的Y值引用,在Center的Y值中粘貼引用併除以2,能夠讓Box 的軸心始終位於底部。

類似的方法,在Big Rock Layer蒙版下爲石塊進行撒點,使用一個球模型進行標記,最後在UE4中替換石塊模型。

最後創建unreal_material屬性用於關聯UE4中的地形材質,這樣導入HAD後會根據String中的路徑自動對地形材質賦值。

String通過如下方式獲取,並在複製後刪除掉/Game以前,LandscapeMaster以後的內容。

最後將所有節點封裝成一個subnet用於導出HDA,通過菜單列表可管理該HAD文件。

通過拖拽節點中的變量到參數欄,即可綁定變量到HAD文件中,實現在UE4中實時對部分參數實時調整。這裏通過文件夾進行了分類。

這是最後暴露出來的所有可修改的參數。

2.2 UE4製作步驟

首先學習了官網的開放世界場景工具入門,瞭解了一些小技巧與開發的方法。

2.2.1 地形材質

首先我選擇製作已經關聯好的地形材質,通過Quixel Bridge可以獲取高逼真的地形掃描材質,並能直接導入UE4創建好材質,這裏我選擇了三種不同的地形材質,用於平原、山地以及石塊蒙版區域,用來營造不同的地貌來增加真實度。將這三種地形材質創建爲材質函數,然後新建LandscapeLayerBlend節點,將Houdini中的Layer名稱與之對應,這樣才能起到作用。

LandscapeGrassOutput結合LandscapeLayerSample可以爲我們生成一些地表植被,這裏必須保證LandscapeLayerSample中的名稱與你想要在哪個Layer上生成的同名,否則草地生成不會生效。

     然後通過Landscape Grass Type工具在它其中添加靜態網格體,可以是草、花、灌木叢或是碎石,最後添加在上圖中的LandscapeGrassOutput參數中由於距離較遠的地方草地會被剔除來優化性能,但爲了美觀我暫時修改了End Cull Distance來使平原能夠顯得富有生機一些。

效果如圖(燈光後期後的效果),嘗試了好多草模型,這個還是很滿意的。

2.2.2 點雲模型替換

對於導入的樹、石塊的點雲,之前在Houdini中是通過Box與Sphere模型代表的。現在我們可以在HDA中的Houdini Instanced Inputs中對其進行替換,並且你可以通過+號添加更多的插槽,供我們添加多種不同樣式的靜態網格體資源,這樣能夠更真實的模擬自然環境,石塊添加也是如此。

通過HAD中的參數權重值Weight我可以對兩種類型的樹木進行撒點比例調節,比如我的場景中有松樹和樺樹兩種樹木,我想讓松樹多一點,於是將Weight Tree 1設置爲0.7,Tree2設置爲0.3。你也可以對一些覆蓋率與大小隨機區間進行調節。

2.2.3 光源調整

添加了指數級高度霧,並開啓了體積霧,讓遠處能夠產生一些模糊感不至於那麼的鮮豔。

添加大氣霧前

 

添加大氣霧後

調整直射光、天空光源爲可移動,實時預覽光源調整結果,並對光的顏色、強度進行了微調(結合後期盒子)。同時也對天空球的雲朵進行了調整。

 

後期盒子中禁用了自動曝光,調整到了合適的曝光強度。

對屏幕鏡頭飽和度與對比度適度的加強。

2.2.4 內置的程序化植物生成器測試

在開發過程中,我發現了UE4正在試驗性的一個功能,也能夠實現程序化搭建森林樹木植被,同時支持很多參數的設置,比如是否對其表面法線、生成在多少坡度或高度區域、樹木最大年齡、樹木大小、碰撞半徑等。也非常適合開放世界的創建,但題目要求使用Houdini生成模型點雲,而且試驗性功能不穩定,因而未使用該方法,下面是一開始我使用該工具簡單的用本地資源創建的森林。

具體使用通過偏好器設置勾選Procerual Foliage即可開啓,結合程序化植物生成器與植被類型即可快速模擬,生成森林。

下面是植被類型設置,我簡單的調整了法線不對齊表面與撒點的程度。

這是程序化植物生成器的設置,草地使用的是Grass節點。

最後附上一張UE4可實時調節各參數的截圖。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章