Hotdry.

Article

逆向工程 Test Drive III 地图格式:DOS 时代 Voxel Space 地形渲染解析

解析1990年DOS赛车游戏Test Drive III的二进制地形数据结构、高度图编码与实时渲染管线,提供可落地的逆向工程参数与验证方法。

2026-06-03systems

1990 年,当 Accolade 发布《Test Drive III: The Passion》时,个人计算机的 CPU 性能尚不及今日千分之一,GPU 加速更是闻所未闻。在这样的硬件约束下,开发团队采用了一种被称为 Voxel Space 的 2.5D 地形渲染技术,以纯 CPU 运算实现了令 contemporaries 惊叹的纹理山脉与峡谷效果。本文将深入解析该游戏世界地图的二进制存储格式,从逆向工程视角拆解其高度图编码、颜色映射与实时渲染管线的工程实现。

双层数据结构:高度图与颜色图的分离存储

Test Drive III 的地形数据采用经典的分离式存储策略,由两个 1024×1024 字节的二维数组构成:高度图(Height Map)与颜色图(Color Map)。这种设计源于 Voxel Space 引擎的核心假设 —— 每个地图位置仅承载单一高度值,复杂几何体如建筑物或树木无法直接表达,但换来了极高的渲染效率。

高度图中每个字节(0-255)直接对应该位置的地形海拔,颜色图则存储预计算的光照与阴影信息。值得注意的是,这两张地图具有周期性边界(Periodic Boundary),即地图边缘无缝衔接,使车辆可无限延伸行驶而不受边界限制。这种周期性设计在二进制层面表现为数组索引的模运算处理:当采样坐标超出 [0, 1023] 范围时,引擎通过位掩码(coord & 0x3FF)实现快速回绕。

高度图编码:单字节海拔的透视投影数学

在逆向工程过程中,通过 hex 编辑器观察原始数据文件,可发现高度值以无符号单字节形式顺序存储,采用小端序(Little-Endian)字节排列。这意味着在文件中看到的字节序列78 56实际表示 16 位整数值0x5678,而非0x7856

Voxel Space 渲染的核心数学在于透视投影变换。对于每个地形采样点,其在屏幕上的垂直位置由以下公式决定:

screen_y = (camera_height - terrain_height) / distance * scale + horizon_line

其中distance表示该采样点到相机的深度距离,scale为高度缩放因子,horizon_line为地平线屏幕坐标。这一公式揭示了为什么远处山脉显得矮小 —— 除法运算自然地实现了透视缩短效果。

逆向验证时,可通过修改特定偏移处的高度值(如将 0x20 改为 0x80),观察游戏中对应位置是否出现地形隆起,从而确认高度图的存储位置与编码方式。

实时渲染管线:画家算法与 Y-Buffer 优化

Test Drive III 的渲染管线遵循经典的画家算法(Painter's Algorithm),即从最远端向最近端逐行绘制地形。具体流程为:对于每个深度层级z,计算视锥体在该深度处的地图采样线,将其等分为屏幕宽度数量的段,每段对应一个屏幕列。

对于每个列,引擎从高度图读取海拔值,执行透视投影计算得到屏幕 Y 坐标,然后绘制一条从该 Y 坐标延伸至屏幕底部的垂直线段,颜色取自颜色图对应位置。由于绘制顺序从远到近,后绘制的近处地形自然覆盖远处地形,无需显式深度测试。

为进一步优化性能,Voxel Space 支持反向绘制策略(从近到远)配合 Y-Buffer。Y-Buffer 是一个一维数组,记录每列已绘制的最高 Y 坐标。当从近向远绘制时,每个新像素只需绘制到 Y-Buffer 记录的高度为止,避免重复填充被遮挡区域。这种优化在 DOS 时代的低性能硬件上尤为关键。

逆向工程实践:从 Hex 编辑器到格式验证

针对 Test Drive III 地图文件的逆向工程遵循 ModdingWiki 推荐的经典方法论。首先,通过文件大小与命名模式识别潜在的地形数据文件 —— 原始游戏中通常为.MAP.DAT扩展名的较大二进制文件。

使用 hex 编辑器打开候选文件后,观察字节分布模式。高度图数据通常呈现连续性渐变特征(山脉与山谷的平滑过渡),而颜色图则可能包含更多高频变化(纹理细节)。通过将 hex 编辑器视图宽度调整为地图维度(如 100 或 1024 字节),有时可直接在十六进制视图中辨认出地形轮廓。

验证阶段采用修改 - 观察法:修改特定字节后启动游戏,观察地形变化。若将某字节从 0x00 改为 0xFF 后游戏中出现突兀山峰,则确认该偏移对应高度图数据。通过系统性扫描与标记,可逐步重建完整的文件格式规范。

可落地参数清单

基于上述分析,若需为 Test Drive III 编写地图解析器或编辑器,以下参数可作为实现基准:

  • 地图维度:1024×1024 像素(单字节每点)
  • 高度范围:0-255(无符号字节)
  • 字节序:小端序(x86 原生格式)
  • 周期边界:坐标模 1024 回绕
  • 渲染视距:典型值 300-800 单位
  • 高度缩放因子:120(根据屏幕分辨率调整)
  • 地平线位置:屏幕 Y 轴约 1/3 处
  • 视场角:90 度(简化投影计算)

对于现代复刻项目,建议将原始字节数据导入 NumPy 数组进行处理,利用向量化运算实现实时地形编辑与预览。颜色图可映射为 8 位调色板索引或扩展为 24 位 RGB 以支持现代显示设备。

结语

Test Drive III 的地图格式是 DOS 时代游戏开发者在极端硬件约束下智慧的结晶。通过分离存储高度与颜色、采用周期性边界、以及精心设计的透视投影算法,开发团队以极低的计算开销实现了令人信服的三维地形效果。对于今天的系统程序员而言,逆向工程这类经典格式不仅是技术考古,更是理解图形渲染底层原理的绝佳途径 —— 在 GPU 将一切细节隐藏于驱动层之下时,这些原始的 CPU 渲染管线提醒我们:每一帧画面背后,都是数学与工程的精密协作。


资料来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com