最近項目需求制作一個場景的遠景部分。正好可以嘗試使用一下UE4的 Landscape。不過直接在 Editor 里刷地形工作量太大,刷出的地形也不真實,最關鍵的是 Landscape 的工具並不是那么好用。
所以我們決定使用 WorldMachine 作為地形的生成工具,將地形的高度圖導入 Editor,再在 Editor 中對細節進行修改。WorldMachine 生成的高度圖相對人工算出來的要真實,最重要的是快,用它找坡度,溝壑更加准確。
在 UE4 中使用 WorldMachine 還要解決幾個問題。官方有篇 wiki 將的很清楚。World Machine to Unreal Engine 4 - In Depth Guide
問題1:高度圖尺寸
UE4 的高度圖有一些限制,這與 UE4 地形系統的組織有關。高度圖中每一個像素對應着地形系統的一個頂點。UE4 的地形組織分為3層:組件 component
,分段 section
,四邊形 quads
。Landscape Technical Guide
四邊形是地形系統最小單位,每個四邊形對應4個頂點。
分段由四邊形組成,是 drawcall 和 LOD 的最小單位。因為要對每個分段單獨做 LOD,高度圖需要做 mipmap,所以每個分段的高度圖都是2的整數次冪,可以是 8x8 到 256x256 中間的一個。分段中每個四邊形共享頂點,所以每邊四邊形的個數是 x-1。
組件由分段組成,每個組件只能有 1x1 個或者 2x2 個分段。組件是渲染、可視性和碰撞的基本單元。每一邊組件的數量可以是1到32中的一個,長和寬可以不相同。組件越多,CPU 消耗越大。
了解了以上的關系,高度圖的尺寸就可以計算出來了。但是這里推薦的方法是在 Editor 里調整組件和分段的選項,來得到高度圖的尺寸。

上圖中的高度尺寸就是 505x505。
問題2:世界尺寸
第二個問題就是要弄清地形系統中的距離表示的實際世界尺寸。正常地形系統中頂點之間距離是1ued,代表實際中的1cm,但是在創建時可以看到 Scale 是 (100, 100, 100)。所以頂點間距離是1m。地形系統的高度范圍是 -255 到 257,同樣在 Scale = 100 時,單位是 m。如果希望上圖中的設置,高度圖1像素對應1m,那么 WorldMachine 的設置是,分辨率 505x505,寬是505m,高是505m。海拔的設置,由於world machine從0開始,所以要設成512m。


之后的操作就是在 WorldMachine 里做圖並導入 Editor。WorldMachine 默認都是 km 級別的,可以放大 100 倍,方便在 WorldMachine 里操作。
問題3:地形材質
地形材質方面主要要搞清 LayerInfo 的2兩種混合模式和材質中的3種混合類型的含義。
LayerInfo 的2兩種混合模式:Weight-Blend(normal), No Weight-Blend

Weight-Blend 的層權重和為1,增加一個層的權重,其他層的權重就會減少。No Weight-Blend 的層單獨計算權重,不對其他層有影響。

圖中,紅色和藍色部分為 Weight-Blend,綠色部分為 No Weight-Blend。先刷紅色,再刷藍色,綠色。藍色部分覆蓋紅色部分的區域,紅色部分的權重變成了0。而綠色部分覆蓋的區域紅色部分權重沒有變。
LB_WeightBlend,LB_AlphaBland,LB_HeightBland
WeightBlend 和 HeightBland 都是權重混合。在同一像素上不同層的權重和為1。但是 HeightBland 提供高度圖。在邊界產生下圖效果。

WeightBlend 和 HeightBland 都是無序的, 減少一個層的權重,其他層的權重會增加,但是增加那個並不確定。
AlphaBland 是有序的,好像一層覆蓋一層,減少一層會露出下一層。這里官方文檔說的也不詳細。查了一下代碼int32 UMaterialExpressionLandscapeLayerBlend::Compile(class FMaterialCompiler* Compiler, int32 OutputIndex, int32 MultiplexIndex)
他們的關系應該是這樣的。

w是權重,color 是這個點的顏色, AlphaBland 在最后才混合,每個 Alpha 層都會 lerp 一次,順序不定。