Phase 5 的代码已经合进 main 了。地形、大气、水体、CSM、GPU Timer,这一串功能清单全打上了勾。

要是放在以前,这篇文章大概会是一堆技术细节:Gerstner 波浪怎么实现、大气散射用了哪个模型、CSM 的分裂策略是什么。但这次我不太想这么写。因为 Phase 5 最让我印象深刻的,不是这些效果本身,而是我第一次让 AI 参与了"看图验收"。

Phase 5 先快速看一眼

水体效果:

水体效果

大气散射:

大气散射

水体和大气看起来还行,但说实话,这些效果本身不是 Phase 5 最让我兴奋的地方。

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

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