1992 年,多数游戏还不能指望 GPU 加速。NovaLogic 发布《Comanche》时,却做出了当时很扎眼的地形效果:山谷、河流、坡地、阴影,都不像几块硬邦邦的单色多边形。

这篇网页 Demo 有意思,就在于它把那套 Voxel Space 拆开了。看完会发现,《Comanche》领先约 3 年的观感,不是靠“全能引擎”硬冲出来的,而是靠一条很窄的路:只把飞行视角下的地貌做得足够可信、足够快。

这件事对今天仍然有用。尤其是写游戏引擎、做图形编程、研究复古技术的人。它不是让你复刻老技术,而是让你重新看一遍:在限制很硬的时候,工程判断到底怎么下刀。

Voxel Space 画的不是完整 3D,而是高度场幻觉

Voxel Space 这个名字容易把人带偏。它不是现代意义上的 voxel engine,也不是能自由堆方块、挖洞、搭楼的体素世界。

更准确地说,它是高度场地形的 2.5D 技术,思路接近 ray casting。地图上每个位置只有一个高度,再配一个颜色值。摄像机飞过去时,程序把这些高度投到屏幕上,用一列列竖向像素线拼出地貌。

核心数据很小,也很干净:一张 1024×1024 的一字节高度图,一张 1024×1024 的一字节颜色图。颜色图里提前烘好了阴影,渲染时就不用再算复杂光照。

组件 / 做法它解决什么它放弃什么
1024×1024 高度图快速取得地形起伏一个坐标只能有一个高度
1024×1024 颜色图直接取地表颜色动态材质和实时光照很弱
预烘焙阴影少算光照,画面更稳光影变化不自由
竖向像素线绘制适合远景地形和飞行视角不是真正自由 3D 几何
painter algorithm / y-buffer处理遮挡复杂物体表达能力有限

基本流程也不神秘:按距离扫描地图上的线段,做透视投影,再按屏幕列画竖线。遮挡可以从远到近盖过去,也可以从近到远画,并给每列维护一个 y-buffer,避免画已经被挡住的部分。

它强在大地形。山坡、谷地、河床、远近透视,都适合这种表达。

它弱在复杂几何。同一个地图位置只能有一个高度,所以建筑、树木、桥洞、洞穴、悬空结构都不好做。它能骗过飞行视角,但骗不了完整世界。

这点很关键。把它说成真正体素渲染,会高估它;把它说成落后小把戏,又低估了它。

受影响的是谁:图形读者看算法,工程团队看取舍

对游戏引擎和图形编程读者,Voxel Space 最值得拆的是“为什么它快”。不是因为算法神秘,而是因为它把问题砍小了。

你如果在做地形、远景、低配设备或 Web Demo,这个案例的动作意义很直接:先判断视角是不是固定,场景是不是主要由高度场构成,光照能不能预计算。能,就别急着上完整 3D 管线。先用更窄的表达方式试原型。

对复古技术和工程取舍感兴趣的读者,它的价值在另一层:别只盯着画面老不老。要看它当年怎么把预算花在刀刃上。

同期的通用 3D 路线要处理更多自由度:任意几何、摄像机、遮挡、光照。能力更完整,成本也更重。Voxel Space 反过来,只服务一个高价值场景:从空中看连续地貌。

这不是全面胜利。它只是局部打穿。

接下来如果继续看这类复盘,最该观察三件事:它的视角限制有多硬,预计算承担了多少工作,遮挡方案是不是只对特定场景成立。看清这三点,就不会把一个漂亮 Demo 误读成万能引擎。

好工程不是堆满能力,而是少交没必要的税

我更在意的是这次取舍背后的工程观。

很多技术叙事默认“更通用”就是更先进。但真实工程里,通用性常常是一种税。你要自由摄像机、任意几何、动态光照、复杂遮挡,就要交计算税、内存税、开发税。

1992 年的机器交不起这么多税。Voxel Space 的做法是把世界缩小:不做完整世界,只做飞行时最重要的地形幻觉。

颜色图把阴影提前烘进去。高度图把地形压成二维数据。屏幕列承担遮挡。每一步都在说同一句话:别解决你暂时不需要解决的问题。

这让我想到铁路。铁路不自由,不能随便转弯、随便停靠;但在固定线路上,它的效率极高。Voxel Space 也一样。路线窄,速度快。

这个类比不完全一样。铁路是基础设施,Voxel Space 是渲染技巧。但重复的是同一种结构:牺牲一部分自由度,换取确定场景里的高效率。

“有所不为”,不是偷懒。很多时候,它才是工程能力的分水岭。

今天算力便宜了,行业反而更容易犯另一种错:把问题做大,再用硬件填坑。模型更大、画面更满、参数更多,最后产品判断却变虚。用户需要的是结果,不是你烧掉了多少预算。

《Comanche》的画面已经老了,像素感一眼能看出来。但那套选择没老:在约束里找捷径,在捷径里保真实。

回到开头那个反常点。它不是用 1992 年的硬件做出了完整未来,而是把未来感限制在最该出现的地方。刀口对了,窄路也能跑赢大路。