赫德拉计划(Project Hedra)是一款雄心勃勃的开放世界低多边形 RPG。在游戏中,玩家可以选择职业,探索无尽的由程序生成的世界,解锁不同技能,并完成同样由程序生成的任务。作者在高中(约15岁)时启动了这个项目,最初是为了学习 O 如何……
正文
Project Hedra 是一款野心十足的开放世界低多边形(low-poly)RPG。选择你的职业,探索无尽的、程序化生成的世界,解锁不同技能,完成程序化生成的任务。
更多截图见(Screenshots)。
时间线/背景
我在高中(大约 15 岁)时启动了这个项目,目的是学习 OpenGL 的工作原理。
项目范围很快扩大,几年后它变成了一个完整的 3D 游戏和游戏引擎。代码库大约有 10 万行代码,游戏对 Linux 和 Windows 都有完善支持。
功能
这些上百万行代码没有白费。游戏和引擎都充满了各种功能 :)
游戏功能
- 美丽的程序化生成世界
- 任务和 Boss
- 100 多种带稀有度系统的物品
- 技能和技能树系统,包含 N 多种技能
- 4 个不同职业,每个有 2 种专精()
- 动态生成、程序化放置的建筑
- 钓鱼、制作等
- 交易和 NPC
- 同伴和宠物
- 优美的原声音乐
- 导航、地图
- 不同的维度
- 更多我记不清的东西 :)
引擎功能
- 基于现代 OpenGL 的完整渲染器
- 蒙皮网格渲染
- 支持加载和播放通用动画
- Collada(.dae)解析器
- 静态网格渲染
- 屏幕空间反射(SSR)
- 屏幕空间环境光遮蔽(SSAO)
- 泛光(Bloom)、FXAA 和 MSAA
- 模组支持
- 用于自动部署到 Steam 测试分支的 CI
- 本地化支持
- 使用 OpenAL 的声音支持
- Python 脚本支持
- 用于加载面向数据对象的模块系统
- Steam 集成
- 用原始 OpenGL 编写的完整 UI 和控件系统(下拉框、按钮等)
- 支持运行时重新加载的动态着色器系统
- 视锥剔除、遮挡剔除
- 用于运行时细节层次(LOD)的网格简化
- 天空盒支持
- 阴影
- 3D 拖尾渲染支持
- 在 OpenGL 中使用对象实例化的粒子系统
- bulletphysics 物理集成
- 支持无限世界的区块系统
- .ply 解析支持
- 使用 MarchingCubes 的动态网格生成支持
- 自定义实现的基本 C# 原语和分配器(如 List),支持栈分配列表,并尽量减少运行时自动分配(从而减少 GC)。
- 1000 多个测试用例
- 用于模拟游戏组件并进行游戏集成测试的框架
- 图像和资源压缩,以加快加载并减小体积
- 实体组件系统(ECS)
- 更多我记不清的东西 :)
有趣的部分
- WorldRenderer.cs。使用 glMultiDrawElements,仅用 3 次绘制调用(水体、地形、实例化)就渲染整个世界(实际上取决于数据缓冲区的分区方式,但设计目标是 3 次)。
- Block.cs。世界的核心组件。详见 https://maxilevi.com/blog/procedural-meshing-hedra。
- Fishing.py。用 Python 编写的模组脚本,基于 IronPython,直接与 C# API 交互。
- NativeArray.cs。使用自定义分配器实现的数组原语。同一项目还提供基于堆的分配器,以及使用
stackalloc的基于栈的分配器。其思路是尽量减少游戏帧期间的自动堆分配(从而避免 GC)。
有趣的事实
- 世界完全程序化生成,没有世界存档文件。只保存玩家内容和世界种子,其余都在运行时生成。
- 世界基于体素,但应用了名为 Marching Cubes 的等值面提取算法,从离散体素中提取出隐式连续表面。
- “Hedra”这个名字来自 tetrahedra(四面体),这是我最初实现的等值面提取算法 Marching Tetrahedra 所使用的形状。
- 游戏只支持加载 .PLY 和 .DAE 模型,两者都是纯文本,且模型没有纹理。因此,换个角度看,这意味着我写了一堆文本,由它读取文本并据此创建可交互的图像。我觉得这挺酷的。
截图
待补充更多。
代码结构
总体架构
游戏是基础引擎的一个模组。采用这种架构思路,是为了迫使自己保持模组 API 的更新,从而鼓励大家制作模组。
Hedra
基本上是整个游戏。包括 AI 逻辑、组件、世界生成、模块系统、对象放置和许多其他东西。
Hedra.Engine
引擎的核心部分,定义了对世界的所有抽象。它处理渲染、声音、各种基础系统,以及通用的窗口、游戏循环和平台功能。由于一开始并没有做拆分,所以有些东西可能仍在外部。
Framework
引擎中使用的核心原语。包括堆和栈分配器、自定义的列表和数组实现,以及指向原生指针的包装器和其他一些有用的原语。
HedraTests
测试套件,用于(原文句子不完整)。
Asset Builder
命令行工具,用于将游戏资源压缩为便于使用的二进制文件。它把图像、模型、声音文件、着色器合并成一个二进制文件,其结构专为快速数据检索而设计。
Server
很久以前,Hedra 曾支持多人游戏。其原理是使用 UDP 打洞 并让客户端进行 P2P 通信,这个服务器就负责此事。你可能还会在引擎代码中看到一些网络遗留代码。
如何构建
构建过程非常简单直接。
- 检出所有子模块
- 运行构建依赖脚本
- 编译 C# 解决方案
你可以查看 GitHub Actions 工作流,获取在 Linux 和 Windows 上的一些示例。
评论
讨论气氛友好且充满怀旧,多数人称赞作者高中时期手写十万行代码做出完整 3D 引擎与游戏的完成度,欣赏其低多边形美术,并有人将其与 CubeWorld 相提并论。真正的讨论主轴不在于项目优劣,而是「手写」与「从零开始」在 AI 时代的定义——是毫无自动补全、只依赖少量库,还是仅仅意味着没有使用 AI。
认为低多边形美术与高中手写十万行代码的完成度值得称赞
- 许多评论者欣赏低多边形画面并期待它进一步完善,认为作者从高中学习 OpenGL 起步、最终手写约十万行代码完成支持 Linux 和 Windows 的完整 3D 游戏及引擎(含动画、渲染特效与动态地形)十分惊人;有人将其加入 Steam 愿望单,也有人觉得它让人想起 CubeWorld,并把这种联想视作赞美。(较多人) > 我欣赏你的低多边形美学,敢说你和本网站一半的人一样都在高中写过游戏,你可算找对听众了。(@skyberrys)
认为围绕 Mod API 构建游戏值得所有游戏借鉴
- 有评论者特别称赞项目以 Mod API 为核心来构建,认为所有游戏都应该采用这种做法,并表达对这种纯粹出于对手艺的热爱而完成的作品的喜爱。(少数人) > 我觉得围绕 Mod API 来构建游戏真的很酷,所有游戏都该这样,而且我热爱这种为工艺本身而做的项目。(@chrysoprace)
认为项目唤起了对早期 3D 图形技术与自制引擎年代的怀旧
- 有人看到项目中的 Collada 后十分感慨,称那是许久未听到的名字,并回忆起 Ogre3D 和 Sauerbraten(Cube)等老工具;这与作者感叹“在 AI 编程时代,十万行手写代码像另一个时代的遗物”形成呼应。(少数人) > 天哪,Collada?真是好久没听到这名字了,我至今仍对 Ogre3D 和 Sauerbraten(Cube)留有美好回忆。(@deadhntheory)
认为「手写」与「从零开始」在 AI 时代的定义已经模糊
- 有人追问作者所说的“手写”究竟是指完全没有任何自动补全或内联文档,还是仅指没有 AI 参与;也有评论者指出,到 2026 年这类说法已被用来指代各种情况:可以是从头到尾全部自己写,也可以是自己写核心引擎再辅以 SDL,而如今甚至可能只表示“完全没用 AI”。这一语义漂移成为帖内最主要的讨论点。(较多人) > 看到这个在高中、且没有 AI 参与的情况下做出来真的很让人自愧不如;顺便说,到 2026 年“从零开始”或“手写”这种说法很有意思,有人用它指所有代码都自己写,有人指核心引擎加一点 SDL,而现在它甚至可能只表示“完全没用 AI”。(@panza)