您當前的位置:首頁 > 繪畫

地形生成技術(一)

作者:由 Shader實驗室 發表于 繪畫時間:2021-07-23

地形生成需要大量的矩陣協同工作,來生成地形的高度,紋理等資訊,這在引擎或遊戲生成地形的模組中都是基本前提。

表面上看地形是由等距離的頂點構成的簡易網格,但是實際的地形生成需要的網格頂點更加複雜。地形網格是用一種

連續細節層次演算法

構造的,也稱為

CLOD(

Continuous Level of Detail

)

,可以簡單認為這是一個動態的多邊形網格,它提供了更多頂點的區域,有更多的細節。透過這種技術,地形的儲存就得到了最佳化,使得平坦的區域可以用相對較少的頂點來表示。如下圖所示:

地形生成技術(一)

上圖為Unity中的地形刷繪,可以看到平坦區域網格會更加稀疏,而山坡等複雜位置,網格與頂點會更加密集。這就是CLOD技術在地形上的應用。根據CLOD的定義來講,可能會覺得技術細節實現起來比較複雜,但是我們可以把複雜問題簡單化,如何做呢?可以把整塊地形當作一個2D區域,如下圖所示:

地形生成技術(一)

接下來需要做的就是將地形作為包含高度值的2D矩陣來看待。如下圖:

地形生成技術(一)

這樣的矩陣叫做

HeightMap

(高程圖),通常會看到它們以這樣的灰度圖表示。

地形生成技術(一)

有點像噪聲圖有沒有?圖中的顏色越白,那個區域的頂點就越高。如下圖所示:

地形生成技術(一)

而黑色代表的就是低窪的地形點。黑白只是HeightMap的感官表現,內部表示就是我們看到的2D數值矩陣,矩陣中的每個值(浮點數或整數)對應了可視高度圖灰度的大小,正常情況下這些值的範圍在0~1之間,0代表最低點,1代表最高點。他們代表著一種可以與最大高度值組合,來設定地形實際物理高度值比例的方式。例如,如果HeightMap中的某個值是0。5,而最大地形高度是500,那麼地形網格,代表對應那個點的頂點將被設定為250。如下圖:

地形生成技術(一)

因此,我們可以定義不同的地形最大高度並使用相同的HeightMap,來建立不同的地形景觀,如圖所示:

地形生成技術(一)

使用相同的HeightMap定義不同的最大地形物理高度

注意:雖然使用了相同的HeightMap,但是由於實際的最大地形物理高度不同,所以CLOD所計算生成的網格並不一致。但是無論地形多大都還是應該視為一個正方形的2D矩陣。

地形生成技術(一)

因為地形網格是呈方形的,所以HeightMap的解析度寬和高是一致的,而地形解析度的計算方式是沿地形邊沿的方格數來計算的。一般為了提高效率,解析度的值一般為2的倍數,但是比較令人迷惑的一點是地形HeightMap的解析度是1加上地形解析度512,所以HeightMap解析度的最終結果是(513,513)。如下圖所示:

地形生成技術(一)

為了理解這一點,假設有個小地形,是兩兩成對的,所以地形解析度為(2,2),如圖所示。

地形生成技術(一)

但是HeightMap的解析度並不能直接等同於(2,2)。是因為方塊網格是由頂點所組成的,也就是它的寬和高各自都有3個頂點,如下圖:

地形生成技術(一)

上面說到HeightMap矩陣中的每個值對應的是地形網格中的頂點,所以(2,2)的網格數對應的(3,3)的頂點數,最終HeightMap的解析度也就等於(3, 3)。

地形生成技術(一)

上圖可以看到,高度圖中的值必須與每個維度中的頂點數對齊。

另外再來看看影響地貌的其它方式。比如,我們有下面幾張植被圖,它們需要在不同的地形區域顯示不同的植被外貌,並展示他們混合的方式,實現方式在這一章中不會做過多的介紹,這些內容將會在後面做詳細講解。

地形生成技術(一)

標簽: 地形  HeightMap  網格  頂點  解析度