理解 Voxel Space:定義 90 年代初期地形的 2.5D 引擎

在 1990 年代初期,3D 遊戲的景觀與今日截然不同。CPU 的速度比現在慢了幾個數量級,且對於一般消費者而言,GPU 加速的概念幾乎不存在。當時大多數的 3D 遊戲依賴於渲染單一顏色的填充多邊形——這個過程在計算上非常昂貴,且視覺效果往往十分簡單。

在這種環境下,NovaLogic 於 1992 年發行了 Comanche。這款遊戲展現了令人驚嘆的地形,其紋理、著色與陰影看起來比當時領先了數年。這得益於一種稱為 Voxel Space 的技術,這是一種 2.5D 渲染方法,彌補了傳統 2D 精靈與完整 3D 多邊形環境之間的差距。

核心概念:高度圖與顏色圖

與使用複雜網格與著色器的現代 3D 引擎不同,Voxel Space 依賴於兩個主要的數據結構:高度圖 (height map) 與顏色圖 (color map)。

  • 高度圖 (Height Map): 一個 2D 網格,其中每個值代表該特定座標處的地形高度。在 Comanche 中,這通常是一個 1024x1024 的單位元組地圖。
  • 顏色圖 (Color Map): 對應的 2D 網格,用於儲存地形的顏色。

這種方法最巧妙的面向之一是,顏色圖通常包含「預烘焙」的著色與陰影。正如社群成員所指出的,這創造了一種 3D 斜角效果,而不需要引擎進行即時著色計算,從而顯著降低了 CPU 負載。

然而,這個系統有一個根本性的限制:它在每個位置僅允許一個高度值。這意味著雖然山脈與山谷很容易表示,但像懸崖、建築物或樹木等複雜幾何形狀無法使用這種特定方法進行渲染。

渲染演算法如何運作

Voxel Space 引擎的功能與光線投射 (ray casting) 類似。它不是計算三角形,而是對高度圖與顏色圖進行光柵化,並在螢幕上繪製垂直線。

基本流程

  1. 清除螢幕: 重置影格。
  2. 繪圖者演算法 (Painter's Algorithm): 為了確保正確的遮擋關係(即較近的物體遮住較遠的物體),引擎傳統上是從場景的後方向前方進行渲染。
  3. 透視投影: 引擎會確定地圖上的哪一條線對應觀察者的距離,並考慮視野 (FOV) 以使物體在遠處看起來較小。
  4. 垂直線繪製: 對於線段的每個部分,引擎會從地圖中檢索高度與顏色,並在螢幕上根據投影高度繪製一條垂直線。

加入旋轉

為了讓玩家可以朝向北方以外的方向觀察,引擎會對座標進行三角函數旋轉。透過計算觀察角度 ($\phi$) 的 sincos,引擎可以確定要採樣的高度圖正確片段,無論攝影機的朝向為何。

效能優化

由於這些引擎運行在有限的硬體(例如 80286 CPU)上,開發者必須採用幾種聰明的技巧來維持可玩的影格率。

從前向後渲染與 Y-緩衝區

雖然基本演算法使用繪圖者演算法(由後向前),但一種更效率的方法是從前向後進行渲染。這可以消除繪製那些最終會被較近的地形所覆蓋的像素的需要。為了防止視覺錯誤,會使用一個 Y-buffer 來儲存每個欄位繪製出的最高 Y 軸位置。如果新線段的高度沒有高於該欄位先前繪製的線段,則會將其捨棄。

細節層次 (LOD)

為了進一步節省週期,引擎可以實施變動的步長大小來表示距離 ($z$)。透過隨著與攝影機的距離增加而增加步長,引擎在遠處渲染較少的細節,同時在維持前景的高精確度。

歷史背景與技術爭議

Voxel Space 的遺產是一個懷舊與技術好奇心的主題。一些開發者回憶起,使用查表法來避免緩慢的浮點數乘法,從 16MHz 處理器中「榨取每一滴效能」的成就感。

然而,在術語上存在技術上的細微差別。正如一位貢獻者所指出的:

技術上這與 voxels(「體素」,即在三個軸向上均等分割 3D 空間的「體積像素」)無關。這只是一個高度圖,一組稜柱...與 Doom 地圖不完全相同。

儘管存在術語爭議,這項技術的影響力是不可否認的。有趣的是,據報導,Comanche 的開發受到了程式設計師在醫療產業的經驗影響,特別是 CT 與 MRI 掃描,這些技術利用了真實的體積數據。

Voxel Space 方法的總結

特徵 Voxel Space (2.5D) Modern 3D (Polygonal)
數據源 高度/顏色圖 頂點網格/紋理
渲染方式 垂直線投射 三角形光柵化
著色 預烘焙於顏色圖中 即時著色器/光線追蹤
複雜度 $O(Distance imes Width)$ $O(Polygons)$
限制 每個 X,Y 座標單一高度值 任意幾何形狀

Sources