Houdini技術體系 過程化地形系統(一):Far Cry5的植被系統分析

背景

    在大世界遊戲裏,植被(biome)是天然環境很是重要的組成部分,雖然UE4裏的也有比較不錯的地形+植被系統,但相比國外AAA級遊戲的效果,仍是有很多的差距,簡介以下:
  • UE4的植被分爲(Folige Type)和(Grass Type),都是經過HierarchicalInstancedStaticMeshComponent來進行實例渲染,但生成方式不一樣
    • Folige Type能夠帶有碰撞信息,經過Foliage Paint tool或Procedural Foliage Volumes 預先生成和放置,再跟隨場景讀取時加載。
    • Grass Type本身不帶碰撞,根據所在的Material Layer和設置預生成密度圖,在運行時根據攝像機來生成視野周圍的Grass。
  • 兩種方式在擺放上都會有很多的限制
    • 當一塊地表上出現多種Foliage或Grass時,仍是會產生不一樣類型植被之間的競爭和重疊的狀況
    • Folige Type在特別是石塊,樹木,草體都存在的狀況下,增減修改都會變的很麻煩
    • 佈局上仍是要人爲的控制,一旦場景地形要修改,就要從新各類刷新或配置Foliage Type,Grass Type也要跟着刷Material Layer來改變。
    • Procedural Foliage Volumes能夠必定程度上減小Paint的工做量,但可控的參數過少。
 
    因此植被的過程化系統不管是表現上,性能上,仍是迭代的便利性上,都是很是重要的部分。近兩年GDC上,Ubisoft在 Tom Clancy’s Ghost Recon: Wildlands和Far Cry 5(後簡稱FC5)的過程化植被生成上都有不錯的分享。這裏我把Houdini的植被系統實現分爲三部分來分享,在基礎管線部分主要是Houdini的植被系統與UE4的植被系統如何作銜接,過程化地形部分本節先會分析FC5的實現機制,下一節介紹如何在Houdini和UE4環境下實現相似功能。

Far Cry 5的植被系統概述

  • 植被的分層結構:每一個地塊有一個生態組(Main Biome),而主生態組又包含若干的子生態組(Sub Biome)。FC5裏把一個Sub Biome結構稱爲Recipes,每一個Recipes由表明不一樣的區域和種類來命名,好比biome_moutiain_forest,表明的是山上的樹林。而一個Recipes裏則是若干個Species組成,每一個Species表明的是Recipes對應區域和生態裏一個植物或物件種類的生成。
  • Houdini與分層的聯繫:每一個Species其實都是一個Generate Terrain Entities的Houdini HDA節點,把HDA節點一個接一個的連在一塊兒組成Recipes(Sub Biome),而全部的Recipes再鏈接在一塊兒成爲一個Main Biome。每一個HDA能夠讀取地形Mask信息和它的配置參數,輸出本身對應的植被的擺放信息,而連在後面的HDA會根據前面HDA留下的信息,經過HDA內置的參數和算法,肯定是否會覆蓋前一個HDA的生成信息。
 
  • 地形數據信息:根據地形的高度信息,生成不一樣的Mask信息,以及用戶手繪的數據
    •  包括Occlusion,Flow,Slope,Curvature,Illumination等經過高度生成的信息,以及海拔,經緯度,風向等人工輸入的信息
    •  湖泊,道路,柵欄,電線杆,峭壁等其餘過程化生成的Mask信息也會被導出保存爲2D貼圖,確保植被不會生成到這些區域。
 
每一個Speicies對應的 Generate Terrain Entities都是同一個HDA節點,只是根據對應不一樣植被實體有不一樣的參數設置,除了實體擺放功能外,還能夠根據擺放後的實體信息影響地形並輸出到地形數據上,以及定義每一個Speicies的生存能力(Viability):
  • SpeciesEntities功能 :生成地形上特定種類的實體,包括樹,灌木,花草,岩石等等
    • Viability : 每種物體在根據區域有本身的生存力,以及對應的生存範圍和生存優先度,來避免物件之間重疊和穿插。
    • Age:樹木有本身的Age(年齡),根據Viability生成SDF的來決定。根據Age來控制樹的高低。
    • Size : 同一種類的樹木有幾種不一樣的Size,小樹傾向在外圍,大樹傾向在中心,同一Size能夠這種植被的變化(枯樹等)。也能夠用Age來替代Viability來控制Size
    • Scale:在不一樣的Size等級之間裏經過Scale來平滑過渡。
    • Color: 每一個植被實例能夠根據地形或自身屬性來改變的顏色變化,好比經過水體的SDF來控制草體Species的顏色。
    • Density:樹木密度,能夠根據樹的大小設置不一樣密度。
    • Rotation:根據地形坡度,水源信息以及風力來改變草體的旋轉和方向。
    • Transform : 沒有特地講到,應該就是Transform信息
    • Group : 一樣沒有特地講到,可能就是Houdini的Group信息。
  • Species的寫回Terrain功能 : 佈置的資源也能夠影響到地形的信息。
    • Terrain Color:地表植被信息能夠給予地形貼圖一個Tint Color,這個顏色也會經過shader影響到表明上草體的顏色,在地形貼圖有限的狀況下增長變化。
    • Terrain Textures : 輸出樹根部分的貼圖ID,以及混合係數,配置到Terrain Material的Layer Texture上,作到地表和樹根的融合效果。
    • Terrain Data Output : 能夠把Species的數據包裝輸出,好比把Age或Viability寫入到一個屬性,再由後面的Species讀取。
    • Terrain Deformation:植被信息會影響到地形HeightMap的變化,好比樹根部分會讓周圍地表隆起。
 
整個FC5 Biome的核心就是這個名爲Generate Terrain Entities的HDA節點。
 
  • 輸出到編輯器:全部實體的信息會以Entity Point Cloud的方式輸出到引擎編輯器,每一個Point除了位置信息屬性,還有對應的實體實例引用,以及前面提到的HDA中生成的相似Size,Scale,Color等信息傳送到編輯器,編輯器裏再根據這些信息在場景裏生成對應的資源。
 
因此,要實現FC5相似的植被系統,Houdini和UE4裏須要作的功能主要有:
  • 根據地形的HeightData生成各類Mask信息,以及其餘過程化工具生成Mask的回讀功能
  • 相似Generate Terrain Entities裏的HDA功能
  • HDA所生成的點雲和Terrain信息回讀到UE4裏改變以前的配置
本節會先對FC5的文檔作需求分析,在下節提供具體的Houdini的實現方法。基礎篇裏涉及如何在UE4裏把HDA輸出的數據運用到場景裏。

地形數據生成

上文提到,過程和生成Biome使用的地形數據主要來源有如下兩個部分:
  • 在Houdini裏基於Heightmap生成
  • 遊戲編輯器中輸出的2D Mask數據
    基於Heightmap生成各類特性Mask的功能,在使用WorldMachin作地形時就常常被使用,Houdini做爲WM的替代品也有對應的節點。使用這下圖這3個節點,或者基於他們的內部實現本身整合一個節點就能夠生成 Occlusion,Flow,Slope,Curvature,Illumination等信息了。
 
    而像在編輯器裏過程化生成的湖泊,電線杆等信息,就是設置一個公共的資源目錄保存對應的Mask,在每次編輯器裏調用過程化工具生成時,使用Python腳本加載對應Mask圖,使用Mask By Object節點生根據場景成Mask,再用Python把過程化場景的信息做爲Mask保存起來。或者是把每次過程化生成的信息保存,而後在統一Cook時輸出Mask信息到2D貼圖裏。
整體來講,地形數據的生成和導入,都是比較成熟技術,沒有太大的難度,後面仍是聚焦在植被的生成方法上。

地形的植被實體生成

下圖是FC5的層級結構示意
實際整個Main Biome,就像下圖這樣一個個的表明特定植被的Species的鏈接在一塊兒。
每一個Species都是一個Generate Terrain Entiies的HDA節點
    
接下來經過文檔裏HDA的截圖分析需求。下圖是HDA的主面板。
圖上半部分是植被,地形數據列表和顯示選項等,生成參數的配置在下半部分,有Entities和Terrain兩個頁籤。裏面有擺放植被和輸出地形信息的功能。
  • Viability
     Entities頁簽上首先就是Species的Viability的設置, Main Biome就是大量Species節點串連起來的結果,下圖的示例是兩個Species串聯,Viability的值則是從Terrain Attribute Data裏讀取的,也就是以前生成和導入的Terrain Mask。下圖SpeciesA的Viability是從Occlusion的mask取值,他的Viability值的倍數爲1,而SpeciesB是從Flow Mask裏作Viability的取值,Viability的值的倍數爲2。並使用Ramp圖標來作漸變和裁剪效果。最後途中樹木的擺放效果也是由於B的Viability值比A的Viability高,因此Mask重合的部分的B樹會替換掉A樹。
 
     由於SpeciesA和B在樹的種類,密度,大小上並不同,Point Cloud並不會徹底重疊在一塊兒,而是相似下圖這樣的分佈關係,因此不能只經過的植被對應的Point的位置信息和Viability來作判斷,還須要讓每一個Entity Point有Viability Radius,下圖中,由於B的Viability值比 A低,因此當他們的範圍有重疊時,B的樹就會被A替換掉。
此外,每一個 Species還有Priority和Priority Radius的設置,計算最終的擺放前,先會用Priority作比較,當Priority同樣時再用Viability值作比較。
 
     有些植被還有它特定的生存習性,地形數據除了從Heightmap計算或外部讀取外,還須要能夠人工的在houdini裏控制生成範圍,再把多個地形數據的混合出結果,例以下圖獲得就是在必定海拔高度範圍內,沿着flow Line生長的植被Mask。也能夠把以前編輯器導出或保存的例如湖泊,道路,懸崖等Mask信息導入Specie的地形數據裏做爲剔除Mask使用,確保植被不會生成到這些不該該生成的位置上。
經過在每 Species的Terrain Attribute裏增長不一樣的數據來混合,就能夠獲得相似特定位置的Sub Biomes的生成位置信息了。
 
  • Size和Scale
    即使是同一個 Species裏的同一種植被,由於生長環境和時間的不一樣,也會有大小(Size)的區分。天然界中,一般小樹會長在樹林的邊緣,而大樹更傾向在樹林的中央。須要用Size來控制不一樣生長程度的植被的大小,再使用Scale增長一些隨機的變化,讓整個森林更加天然。下圖增長了5級的Size後,雖然有了必定的變化,但仍是會有階梯狀的感受。
 
在Size級別之間增長了Scale後,階梯感就消失了。
使用Size和Scale設置,有了不一樣比例的同種類樹木後,就要想辦法把合適大小(Age)樹木佈置到場景裏。
  • Age
如何在正確的位置擺放對應Size和Scale的植被,是經過讓植被的Age與Size對應,來選擇擺放多大尺寸的樹木。前文也提到,天然的樹林是邊緣的樹齡小,中心的樹齡大的分佈。經過面板上的Age Max Distance的值,基於Viability的Volume值收縮必定距離後再生成SDF,做爲Age使用。再根據Age對Size的Influence和Age Ramp,獲得對應樹木的Size。
經過Age Ramp對應不一樣的Size的分佈
 
  • Density
一般是使用Houdini的Scatter設置必定的密度值,再將Viability的Mask轉爲Point Could。但默認的方式轉換,每一個Point自身沒有Size信息,當密度過大,或者Scatter不一樣Size的植被時,很容易會出現同一種植被相互疊加的狀況。因此這裏要將Size轉算爲Density值,Size越大,Density越小。
以下圖所示,Size越小, Density越大。同時也能夠讀取其餘的Terrain Data來影響Density值。
 
  • Color
    地形信息也會對植被的顏色產生影響,例如讀取水的SDF值,根據顏色的Ramp來對水塘附近的植被產生顏色變化。
 
  • Rotation
天然界植被還會受到環境的影響,產生必定的旋轉效果。好比在斜坡上的植被會沿着坡度有必定傾斜和旋轉,河邊的草體會更朝向水的方向,以及會受到風力的影響傾斜等等。這個在Houdini裏實現比較簡單。
 
 

植被對地形的影響

Species HDA的另一個功能就是能夠根據植被來影響地形數據。這些功能和地形制做部分比較類似。
  • Terrain Defromation
植被的Mask能夠影響到對應地形的高度,這樣能夠模擬出樹根隆起的效果。
 
  • Terrain Texture
能夠將與樹根部分貼圖對應的Terrain Texture ID輸出給地形材質,讓地形圖層部分使用的貼圖與樹根貼圖對應,而作出融合效果。
 
  • Terrain Data Output:
向下圖這種在黃鬆( Ponderosa)周圍擺放石塊(Rock)的效果,是後面的Rock的Species依賴前面Ponderosa  Species的生成結果。
 
實現方式就是把 Ponderosa的viability值輸出,再Rock Species裏再讀取。
根據 Ponderosa的Viability Mask Scatter獲得Rock的Entity Point。
除了V iability外,也支持Age的輸出。
 
FC5的每平方千米的場景有60w左右顆植被。整個遊戲有100平方千米。
 
  • Terrain Color
因爲Terrain Texture總數有限制,須要根據 經過地形數據生成Tint Color,在地形渲染時讓Tint color做用到 Terrain Texture上產生地表變化。
一樣,在地表上擺放的植被的shader,也能夠受到Tint color的影響。

總結

經過植被系統輸出下圖中數據到編輯器,不但能夠自動化的生成植,還能夠根據植被信息進一步加強地表渲染效果。
FC5的整個植被系統的需求分析就到這裏,除了一些細節功能外,Houdini方面並無太多的技術難點,下一節,會針對UE4 Houdini Engine對應UE植被系統的管線,以及如何在Houdini裏實現相關功能進行展開。
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">算法

相關文章
相關標籤/搜索