为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器


机器之心报道
机器之心编辑部
无 CPU、无操作码、无指令计数器纯 FPGA 实现 , 图形学大神 Sylvain Lefebvre 为经典射击游戏 Doom 打造打造了一款芯片 。
为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

毁灭战士系列(Doom)是由 id Software 开发的第一人称射击电子游戏系列 。 在电子游戏界中 , 人们普遍认为 Doom 系列是第一人称射击游戏的开拓者之一 。 自 Doom 于 1993 年发布以来 , 该系列已有 4 部续作、无数的扩展关卡以及同名电影《毁灭战士》 。
作为经典的射击游戏 , Doom 拥有大量拥趸 , 它能够在大量设备上运行 , 如数码相机、旧版诺基亚手机等等 。 在强化学习领域 , Doom 也被用作策略训练环境之一 。
最近 , 计算机图形学大神级人物、法国国家信息与自动化研究所(INRIA)研究总监、MFX 团队负责人 Sylvain Lefebvre 在新的设备上运行 Doom 游戏 , 并放出了一段视频 , 展示他自制的无 CPU、无操作码、无指令计数器 , 仅靠纯 FPGA 实现的芯片运行 Doom 的效果 。

为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

使用 Altera CycloneV FPGA 运行 Doom 游戏 。
为 Doom 游戏而生:DooM-chip
Sylvain 在推特上介绍了该芯片 DooM-chip 的具体细节:
为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

DooM 芯片可以运行 E1M1 直到世界末日(或者电量耗尽) 。 代码烧写到了 FPGA 的 LUTs 及触发器中 , 其中无 CPU , 无操作码 , 无指令计数器 , 可以说是纯硬件实现 。
简而言之 , DooM 芯片的运行只需要:SDRAM 控制器、分隔符、BSP 遍历、纹理单元等 。 主渲染器(没有数据)有 666 行代码!
下图展示了一个不错的测试用例 , 我们可以看到它做出了一些改进 , 修复了一些问题 , 并在 CycloneV + Quartus 上学到了很多 。
为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

渲染使用的是原始 BSP 树 , 不过为了配合硬件实现 , Sylvain 对其进行了修改 。 所有列经过光影投射 , 并立即从前向后绘制 , 直到被完全填充 。
当 BSP 从前向后遍历时 , 列总是自顶部或底部向中间生长 。
为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

据介绍 , 该芯片的制作利用了多个信息源:
Fabien Sanglard 写的「Doom 黑皮书」(Game Engine Black Book DOOM);
Doom Specs v1.666 的非官方版本及其源代码(https://github.com/id-Software/DOOM) 。
此外 , Sylvain 还利用了真实的游戏数据:在编译过程中 , 使用 Lua 预处理器从 Doom WAD 中抽取数据 , 并基于此写表和硬件 。
由于计算会随着游戏中墙的不同而发生变化 , 因此获得天花板和地板的纹理并非易事 。 Sylvain 提供了一个 debug 视图 , 可以帮助确保计算与天花板和地板的纹理相匹配 。
为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

在介绍完 DooM-chip 的基本细节后 , Sylvain 还说明了一些有待改进和优化的地方:并行化列 , 隐藏绘制、纹理映射和 BSP 树遍历之间的延迟;有一些纹理没有对齐 , 一些小问题还有待修复(下图即为 debug 展示图);以 320x200 60Hz 运行 , 而不是 70Hz 。
为Doom而生!大神纯FPGA实现Doom游戏芯片,无CPU、无指令计数器
本文插图

Sylvain 表示 , Doom 诞生的时候自己还在学习如何编码图形 。 不管是那时 , 还是现在 , Doom 都是其灵感和动力的来源 。


推荐阅读