Aether Engine Phase 5:当 AI 开始看图验收
Phase 5 的代码已经合进 main 了。地形、大气、水体、CSM、GPU Timer,这一串功能清单全打上了勾。
要是放在以前,这篇文章大概会是一堆技术细节:Gerstner 波浪怎么实现、大气散射用了哪个模型、CSM 的分裂策略是什么。但这次我不太想这么写。因为 Phase 5 最让我印象深刻的,不是这些效果本身,而是我第一次让 AI 参与了"看图验收"。
Phase 5 先快速看一眼
水体效果:

大气散射:

水体和大气看起来还行,但说实话,这些效果本身不是 Phase 5 最让我兴奋的地方。
更让我兴奋的是,这一阶段我开始让 AI 参与验收——不是只看代码,而是直接看渲染结果。每次改完场景,把截图丢给 Kimi,问它"这看起来对不对",成了我新的日常。所以接下来想聊的,不是某个具体效果怎么实现,而是我最近摸索出来的这套 AI 视觉回归工作流:

技术上没什么要特别颠覆的,该写的 ADR 之前都写了。Phase 5 更像是一个大拼图——把前面搭好的 Deferred PBR、SSAO、SSR、Bloom,和新加入的地形、大气、水体拼到一块儿,看它们能不能不打架。欣慰的是管线还算稳,加一个 Pass 就是声明一下 reads/writes,PipelineBuilder 自己会找位置。
| 阶段 | 内容 | 状态 |
|---|---|---|
| Phase 0 | 窗口、三角形、egui | ✅ 已完成 |
| Phase 1 | Deferred PBR + Shadow + IBL | ✅ 已完成 |
| Phase 2 | SSAO + SSR | ✅ 已完成 |
| Phase 3 | ECS 编辑器 + Picking + Gizmo | ✅ 已完成 |
| Phase 4 | Bloom + Tone Mapping + FXAA | ✅ 已完成 |
| Phase 4.5 | 场景扩展 + AABB + 视锥裁剪 | ✅ 已完成 |
| Phase 5 | 地形 + 大气 + 水体 + CSM + GPU Timer | ✅ 已完成 |
| Phase 5.x | 体积云 + God Rays | ✅ 已完成 |
| Phase 6 | 光线追踪 | 🔲 当前 |
接下来就聊聊这张图背后的故事。
我开始让 AI 看图了
之前 AI 帮我写代码,但验收这步一直是我自己来的。每天早上花十分钟跑一遍测试场景,肉眼对比截图:水面反射有没有过曝、地形阴影有没有断层、大气颜色是不是发紫。能跑,但慢,而且真的会漏。
Phase 5 做到一半的时候,我突发奇想:既然 Kimi 能看图,为什么不把截图对比也丢给它?
做法其实挺糙的:每次改动完,我用 launcher 跑一遍 14 个测试场景,把新截图和 tests/reference/ 里的参考图一起贴给 Kimi,问它"有没有可见的回归"、“差异是不是预期内的”。它返回一个带说明的列表,我再决定哪些需要返工。
水体效果就调了三四轮。Gerstner 波浪的高度、菲涅尔反射的强度、折射偏移的系数,每次改完都让 AI 对比参考图。它帮我抓到过几个问题:
- 某一版水面远处反射过亮,地平线附近出现白边;
- 另一版折射采样偏移太大,近岸物体看起来被"拉长";
- 还有一版太阳倒影形状不对,AI 说是因为没正确复用 SSR 的结果。
这些问题我自己看未必第一时间能定位,但 AI 对比两张图之后,能直接指出"这里和参考图差异明显"。我再回头看代码,改起来就快多了。
一旦 AI 开始看图,流程就得跟着变
这事儿不是简单把图丢给 AI 就完了,整个工作方式都得调整。
参考图必须先是对的。 参考图本身有问题,AI 对比再仔细也是错的。所以现在每次重大效果更新后,我会先手动确认当前输出没问题,再更新参考图。AI 只负责发现"意外变化",审美判断还是我的。
提交粒度变小了。 以前可能一晚上让 AI 改三个效果,第二天一起验收。现在基本一次只改一个效果,跑一遍测试,AI 对比通过后再合入。出问题能立刻定位到哪次改动。
提示词固定下来。 我把截图对比的提示词模板化了:场景列表、对比维度(亮度、反射、颜色、几何形状)、输出格式(差异等级 + 具体说明)。每次贴图就行,不用重新解释规则,AI 的稳定性也因此好了不少。
错误分类清晰了。 AI 能分出"明显回归"、“轻微差异”、"预期内变化"三类。明显 regression 直接打回;轻微差异我再看一眼;预期内变化(比如故意调亮水面)直接过。比我自己一张一张翻效率高得多。
AI 还顺手干了些别的脏活
Phase 5 期间,我把越来越多的杂事丢给 AI。
代码审查现在每个 PR 都先让 AI 过一遍,检查资源泄漏、binding 编号是否一致、uniform 布局是否对齐。深层设计问题我再人工看,但基础错误基本不用我操心。
GPU Timer 给每个 Pass 标了毫秒数之后,我让 AI 读日志,找异常值并建议优化方向。SSR 半分辨率 trace、SSAO 从 depth 重建 view-space position、Lighting 的 WGSL override constants,这些优化都是 AI 根据 profiling 数据提出来的,我再决定采不采纳。
跨模块约定这块也省心了不少。normal 编码、depth 线性化、clip-space 范围这些东西,之前 AI 经常忘。现在我让它生成代码前先读 CONTEXT.md 和相关 ADR,返工明显少了。
每加一个 Pass,AI 还会同步补一个最小测试场景。Phase 5 结束时测试场景从 8 个增加到 14 个,大部分是 AI 自己加的。
但 AI 看图也不是万能的
它擅长发现"和参考图不一样",但不擅长判断"这样改是不是更好看"。比如水面反射强度,AI 能告诉我新图比参考图亮 20%,但亮 20% 对不对,还是得我来定。
时序问题它也搞不定。闪烁、抖动、TAA 相关的 artifact,静态截图对比抓不出来,需要看录屏或者帧序列。
还有就是 AI 偶尔会把光照变化误判成错误。黄昏场景和正午场景本来就不同,如果提示词里没强调"按场景分别对比",它会报一堆假阳性。
所以我的感受是:AI 看图是一个很好的"第一道滤网",能帮我筛掉 80% 的明显问题,但最后 20% 的判断权还是在我手里。
下一步
Phase 6 是光线追踪。说实话,有点兴奋,也有点紧张。兴奋是因为要到 KongEngine 也没做到过的领域;紧张是因为 wgpu 的硬件光追还在发展中,大概率要先从 Compute Shader 的软件路径追踪开始。
| 功能 | 状态 |
|---|---|
| Compute Shader Path Tracer | 🔲 待实现 |
| Hybrid Ray Tracing | 🔲 待实现 |
| Denoising | 🔲 待实现 |
具体从哪块切进去我还在想。可能是给现有延迟场景加一个可选的 compute path trace pass,和 raster 结果做切换,先验证正确性,再谈性能。
写在最后
AetherEngine 对我来说越来越不只是一个渲染引擎项目,更像是一个 AI 协作实验场。
Phase 1 到 Phase 4 验证的是"AI 能不能写引擎代码"。Phase 5 验证的是"AI 能不能参与验收"。答案都是肯定的,但前提是得把流程设计好:参考图怎么维护、提示词怎么写、人在哪个节点介入。
我现在每天晚上的流程基本固定:花五分钟写需求或者验收指令,AI 生成代码和截图,AI 对比参考图,我看一眼差异列表,决定通过还是返工。真正需要我深度思考的时间,反而留给了架构设计和下一个阶段的方向。
技术之路道阻且长。但有了 AI 这个不太会累的工具,这条路走起来没那么孤单了。
本文对应 AetherEngine 仓库:https://github.com/ruochenhua/AetherEngine







