Blender 3D:從新手到專業/景觀建模 III:匯出為高度圖
|
|
適用 Blender 版本:2.44。 |
在本教程中,我將向您展示如何將您美麗的 terrain 匯出為高度圖,該高度圖可以在大多數 3D 圖形引擎中使用。與直接匯出網格相比,這樣做的好處是,許多引擎都具有處理 terrain 的特殊過程,而不是常規網格,它將 terrain 分成不同的部分,以便它可以更細化地細分更靠近攝像機的區域以獲得更多細節,並且還可以剔除(不渲染)不在攝像機視野範圍內的區域,從而節省寶貴的處理時間。這種結構稱為八叉樹,它是渲染大型網格(如 terrain)的一種高度最佳化的方式。
在我開始之前,我必須感謝 從平面建立高度圖 Blender wiki 上的教程。這是我學會使用這個技巧的方法,我將要介紹的大部分內容都來自這個教程。我只是為了方便將其包含在我的其他景觀教程中。
我將簡要介紹高度圖是什麼以及它為什麼有用,以供那些可能不知道的人。如果您熟悉高度圖,您可以跳過下一部分。

高度圖是一個灰度影像,它使用不同的灰色陰影來表示地圖上的不同海拔。由於這些影像是 8 位(除了某些 16 位的 RAW 格式),因此您有 256 種不同的灰色陰影,從純黑色 (0) 到純白色 (255)。黑色表示地圖上的最低海拔,而白色表示最高海拔。許多 3D 圖形引擎已經具有讀取高度圖並從中生成 terrain 的功能。它執行此操作的方式是建立一個頂點網格(就像我們將在 Blender 中馬上要做的),並使用高度圖來確定網格上每個點的海拔。畫素顏色越強烈(越接近白色),該頂點的高度就越高。在大多數情況下,如果高度圖的解析度小於 terrain 的解析度,引擎將對高度圖設定的頂點之間的頂點進行插值。例如,如果您的高度圖是 256x256,而您的 terrain 是 1024x1024,則您的高度圖將確定每四個頂點的海拔,而中間的三個頂點將被插值。
請注意,這些值不代表任何給定畫素的絕對高度,而是代表相對於地圖其餘部分的高度。也就是說,您的高度圖不代表一個海拔範圍從 0 到 256 的景觀。匯入高度圖時,您可以指定地圖的最小和最大海拔,然後整個地圖將被縮放。例如,假設您決定最小值為 1000 英尺,最大值為 5000 英尺。當渲染 terrain 時,黑色畫素將表示 1000,白色畫素將表示 5000,而正好位於黑色和白色之間的畫素 (128) 將表示 3000 英尺(最小值和最大值總和的一半)。這使高度圖相對靈活。
不幸的是,您可能已經注意到,使用高度圖有一個限制。由於您只有 256 種灰色陰影,因此您只有 256 種可能的海拔。這會造成一個問題。無論您在建模的網格中頂點多麼精確,無論您讓它看起來多麼光滑,每個點都將被舍入為介於 0 和 255 之間的整數值。當用於渲染 terrain 時,這會導致“階梯效應”,因為 terrain 從一個離散的海拔到下一個離散的海拔,而不是平滑過渡。但是,有一些方法可以避免這種情況,我將在後面介紹。
如果您現在正在撓頭說“嗯?”,請檢視 高度圖 上的維基百科頁面,以獲取更詳細的解釋和示例。

要開始本教程,我將假設您已經擁有一個要建立高度圖的景觀。如果沒有,請閱讀我的第一個教程,景觀建模 I:基礎 Terrain,以快速建立一個。警告!!!如果您已經建立了一個景觀,請儘量記住您使用的平面的確切大小。如果您要建立一個,可以使用更大的平面來進行縮放,但要記住您縮放了多少倍。這將在以後使事情變得更容易。我建議您使用預設的 2x2 平面或網格,然後放大它。您可能還需要備份您的場景,因為我們將更改一些內容
要建立所需的材質,請執行以下步驟
- 刪除可能應用於 terrain 的所有現有材質。
注意:要刪除材質,我認為您需要轉到著色器部分中的連結和管道視窗,然後單擊“連結到物件”下方的“X”。
- 在著色選項卡(F5)中新增一個新材質。
- 轉到紋理選項卡(F6)並新增一個新紋理。這應該是您材質上的唯一紋理。
- 從紋理型別下拉選單中,選擇“混合”。
- 在同一個視窗中,找到“顏色”選項卡並選擇“顏色帶”。這將讓我們定義混合模式,預設情況下,它從全透明的黑色漸變到實心青色。為什麼是青色?我不知道。這是一個奇怪的預設設定。
- 透過單擊顏色帶的左側選擇黑色。您應該看到一個小的黑色和白色條被選中。
- 透過調整標記為“A”的滑塊,將 Alpha 調整到 1。
- 選擇青色並將其更改為純白色。
- 您現在應該看到與我下面的顏色帶類似。
- 返回到材質選項卡(位於乳酪圖示旁邊的紅色球形圖示)。
- 在材質窗格中,選擇“無陰影”選項以停用材質上的光照。
- 在右側,找到標記為“對映輸入”的窗格。在該窗格的底部是一個網格,預設情況下顯示
XYZ
XYZ
XYZ
- 將所有三行都設定為Z,這樣紋理將完全對映到 Z 座標。
- 在左側的預覽視窗中,如果您選擇球體或立方體,您應該會看到它從底部的黑色變為頂部的白色。這就是我們對 terrain 所需的效果。請記住,在高度圖中,黑色表示最低點,白色表示最高點。
- 最後,切換回編輯選項卡(F9)並單擊“設定平滑”按鈕以啟用Gouraud 著色,這樣一切都將顯得光滑。
這就是我們對 terrain 本身需要做的所有事情。現在我們將要做的是設定相機,以便當我們渲染場景時,我們將獲得一個正對 terrain 的正交投影,以便我們可以將其儲存為高度圖。
- 如果您在場景中還有任何燈光或相機,請將其刪除。
- 切換到頂檢視(NUM7)並將 3D 游標放置在原點 (0, 0, 0) 上,方法是在原點附近左鍵單擊,然後按 SHIFT+SKEY 並選擇游標到網格。(更簡單的方法是:按“SHIFT+SKEY”並選擇“游標到中心”)
- 新增一個新相機,Space->新增->相機。這將新增一個新的相機到場景中,該相機正對下方。

- 切換到側檢視(NUM1 或 NUM3)並將相機沿 Z 軸向上移動,使其位於 terrain 的最高點上方。即使檢視將是正交的,因此距離無關緊要,整個 terrain 仍然需要位於相機前面。
- 現在,選擇相機後,轉到編輯選項卡(F9)並選擇“正交”按鈕。這將更改相機為正交投影,它基本上會忽略所有頂點的 z 座標(除了確定哪些畫素應該在其他畫素前面)。
- 正交按鈕上方有一個名為“Scale”的值。還記得我之前讓你記住地形的大小嗎?這就是原因。
- 更改鏡頭比例(預設值:6)以匹配地形的大小。如果你保留了預設大小的飛機,這個值應該為 2。如果你按照“景觀建模 I:基本地形”教程的建議將飛機放大 20 倍,這個值應該為 40(飛機最初是 2 個單位的正方形)。
- 現在轉到場景選項卡(F10),在“Format”下,將“SizeX”和“SizeY”更改為所需的高度圖大小。對於大多數圖形引擎,這需要是 2 的冪(2^n)或 2 的冪加 1(2^n+1)。所以嘗試類似 256(或者如果你需要 2^n+1,則嘗試 257)。

- 現在,如果你切換到相機視角(NUM0),你應該看到一個“扁平”的正方形,它完全填滿了表示相機視野的點線框。

- 渲染場景(F12)。你應該看到你的高度圖。按F3儲存渲染的影像,你就可以開始使用了!
由於這個影像沒有顏色,並且一些引擎要求你的高度圖是灰度影像(只有一個顏色通道而不是三個),所以在渲染之前,在“Format”窗格中選擇“BW”按鈕。這將把它渲染為灰度影像而不是彩色影像。 
如前所述,將高度圖匯出為 8 點陣圖像(據我所知,Blender 不支援任何 16 位格式)有一個缺點,即你只有 256 個離散的高度值,當地形細分時會導致階梯效應。理想情況下,你可以使用一個應用程式,它可以將影像匯出為 16 位原始格式,例如 Terragen。但這是一篇 Blender 教程,所以我們不會深入討論它。=P
你可以“平滑”渲染的地形的一種方法是實際上降低高度圖的解析度。這可能聽起來違反直覺,但請耐心聽我解釋。假設你有一個高度圖,它從左到右從黑色到白色簡單地混合。如果你的高度圖是 1024x1024,由於你只有 256 個不同的值,你將獲得每種高度的 4 列。換句話說,你的灰度圖將類似於這樣
00001111222233334444...
00001111222233334444...
00001111222233334444...
00001111222233334444...
00001111222233334444...
00001111222233334444...
如果你嘗試從這個高度圖渲染地形,你將得到 4 個高度為 0 的點,4 個高度為 1 的點,4 個高度為 2 的點,以此類推,從而產生階梯效應。
現在假設你建立了相同的高度圖,但將大小縮減為 256x256。現在你將有 1 列對應於每個高度,你的灰度圖將類似於這樣
012345678...
012345678...
012345678...
012345678...
你可能在想,“但這會導致我的地形更小,或者更不詳細”。但事實恰恰相反。考慮將上述高度圖應用於 1024x1024 的地形。來自你的高度圖的值將應用於每 4 個頂點,而其間的值將被插值。因此,你將得到類似於這樣
0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0
這與使用 1024x1024 高度圖得到的結果一致,你實際上將得到類似於這樣
0.0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0
其中整數是來自你的高度圖的值,而分數是插值值。這是假設你使用的任何引擎都會對從高度圖讀取的高度值之間的值進行插值。
目前,這是我驗證過的唯一有助於減少階梯效應的方法。當我嘗試不同的技術時,我將在這個頁面上更新它們。例如,我知道 Adobe Photoshop 可以將影像匯出為 16 位原始格式,但我還沒有嘗試過,所以我不想把它作為解決方案建議。

