像 1993 年那样做图形
文章摘要
这是开发者 Marko Stanic 关于其复古风格游戏《Catlantean 3D》的开发笔记。这是一款第一人称射击游戏,计划于 2027 年第一季度登陆 Steam,目标是”用 90 年代初常见的技术,做出一款完整、可发行的 FPS”。
“像 1993 年那样做图形”意味着作者刻意施加了一系列模仿 90 年代 PC 游戏的约束:
- 320x240 分辨率,仅 256 色调色板。
- 全手写渲染(不使用着色器),手动混音。
- 遵循 VGA Mode-X 图形原则。
- 游戏逻辑使用定点数运算以保证确定性。
文中重点介绍了几项技术:基于调色板的渲染——每个像素引用 256 色调色板而非千万色,这迫使开发者做出”审慎而克制”的配色,营造出类似 Doom 与 Duke Nukem 的视觉清晰度;colormap(颜色映射表)——一个预处理的二维矩阵,用于快速光照:引擎不再逐像素计算明暗,而是对每个屏幕列(墙)、行(地板)或精灵只计算一次”colormap 行索引”,随后做 O(1) 的调色板查表,并用 Oklab 色彩空间保证感知上准确的变暗效果。
资源制作采用三种方式并存:用 Python 脚本从 Blender 模型预渲染精灵;在 Aseprite 与 Affinity Photo 中手绘元素;以及用 Python 脚本结合高度图、噪声与污渍叠加来程序化生成纹理。作者还用 wxPython 自制了地图编辑器,原生支持光照等级绘制与属性编辑,并随游戏一同发布以支持用户创作。核心感悟是:限制催生创意——技术约束反而逼出审慎的设计决策与更佳的美学;混合式自动化在迭代速度与手工质感间取得平衡;公开开发过程也有助于建立玩家信任。
HN 评论精华
sklopec 回忆自己在 90 年代中期做过类似的技术演示,并补充了文中未提到的技巧:在纹理上使用 8x8 或 16x16 的光照贴图(lightmap),从而轻松实现闪烁的火炬、飞过走廊时照亮墙壁的火箭等效果;由于光照贴图很小,还能对每个 luxel 做一些距离与视线计算,甚至把光照”烘焙”进去。
Teslazar 感叹定点数运算被严重低估:”有大量应用场景它都是更好的选择,更别说性能优势了。”
pragma_x 补充道,Knuth 在 TeX 与 Metafont 中正是选择了定点数,部分原因是 70 年代末/80 年代初各平台的浮点实现差异太大,无法满足他”所有平台输出完全一致”的要求。
dhosek 则提出反驳:在现代硬件上,整数只在单周期加减法上占优,乘法、除法、开方等运算浮点往往更快,有时快很多。
Const-me 指出,这款引擎更像 Doom 的前辈 Wolfenstein 3D(垂直墙、恒定地板天花板高度),而非用 BSP 引擎的 Doom;rob74 进一步纠正,Duke Nukem 的 Build 引擎并不用 BSP,而是把扇区间连接当作 portal 处理,从而支持移动的火车、旋转灯具乃至”房间叠房间”的伪 3D 空间。