Metal Caster 是我尝试从第一性原理出发,为 Apple 生态系统重新思考游戏引擎设计的产物。
Metal Caster 并非要构建一个适用于所有平台和所有工作流的通用引擎,而是刻意保持了鲜明的观点:Swift + SwiftUI + Metal + ECS,仅限 Apple 平台,并将 AI 作为引擎的一等公民交互接口。
该引擎是开源的,可以通过 GitHub 访问。
为什么我开始这个项目
大多数引擎都在为灵活性和跨平台规模进行优化。
而 Metal Caster 优化的是其他方面:
- 更优的默认设置胜过无休止的配置
- 深度的 Apple Silicon 优化胜过可移植性
- AI 原生创建工作流胜过手动样板代码
- 视觉清晰度和工具优雅感胜过功能堆砌
核心理念很简单:
描述你的需求 -> AI 通过引擎工具进行构建 -> 在编辑器中进行视觉微调。
我希望这个引擎给人的感觉像是一件精密仪器:专注、极简且快速。
引擎架构
Metal Caster 以 Swift Package 组织,包含十个库模块和两个可执行程序——引擎、编辑器与工具链合计约 6.3 万行 Swift 代码:
| 模块 | 职责 |
|---|---|
MetalCasterMath | 向量、矩阵、四元数、AABB/OBB/视锥体、光线与图元求交(Möller-Trumbore、slab 测试、SAT)、样条 |
MetalCasterCore | ECS 世界、引擎循环、事件总线、性能分析器 |
MetalCasterRenderer | Metal 抽象、渲染图、着色器编译与缓存、PBR 材质、后处理 |
MetalCasterScene | 场景图、USD 导入、相机/灯光/网格系统、光照与反射探针 |
MetalCasterAsset | 资产管线、MSL → .metallib 预编译、纹理压缩、.mcbundle |
MetalCasterAI | 多供应商 LLM 层、9 个专业智能体、编排器、引擎快照 |
MetalCasterPhysics | 刚体、sort-and-sweep broadphase、针对碰撞体的 CPU 射线检测 |
MetalCasterAudio / Input | 空间音频、跨平台输入抽象 |
渲染技术栈
这是我近期投入最多的部分。渲染器围绕一个**渲染图(render graph)**构建,可以顺序调度混合的渲染与计算 Pass,并提供两条可选渲染路径:
- Forward 路径 —— Shadow → Skybox → Mesh + Lighting → 后处理 → Blit
- Deferred 路径 —— Shadow → G-Buffer(MRT) → 屏幕空间延迟 PBR 光照 → Skybox → 后处理
G-Buffer 打包了 albedo+metallic(RGBA8 sRGB)、normal+roughness(RGBA16F)、世界坐标(RGBA32F)以及 Depth32F 深度目标。
基于物理的着色
核心材质模型是 Cook-Torrance:GGX 法线分布、Smith 几何项、Fresnel-Schlick,由 metallic/roughness 材质属性和贴图驱动。同一套 BRDF 同时运行在 forward 多光源着色器和 deferred 光照 Pass 中。
MSLfloat3 F0 = mix(float3(0.04), albedo, metallic);
float D = distributionGGX(NdotH, roughness); // GGX NDF
float G = geometrySmith(NdotV, NdotL, roughness);
float3 kD = (1.0 - F) * (1.0 - metallic);
光照与全局光照基础设施
- 阴影贴图:专用 depth-only Pass(正面剔除 + 深度偏移)
- 光照探针:存储 L2 球谐系数,在着色器中求值用于漫反射 GI
- 反射探针:box/sphere 形状,支持视差校正的 cubemap 投影
- 程序化大气:Rayleigh + Mie 散射;以及顶点位移驱动的动态水面
后处理栈
基于 Volume 的后处理链,运行在 ping-pong HDR 目标上:
SSAO → 高度雾 → Bloom(mip 链降采样/升采样) → 景深 → 运动模糊 → Panini 投影 → 调色 → 暗角 / 色差 / 胶片颗粒 → FXAA
编辑器级 GPU 特性
- GPU 对象拾取:每个实体将自己的 ID 渲染到
r32Uint目标,实现像素级精确选择;同一个缓冲还驱动基于边缘检测的轮廓描边后处理。 - GPU 性能分析:通过
MTLCounterSampleBuffer采集逐 Pass 时间戳,展示在编辑器中并供 Optimize 智能体使用。 - 运行时 MSL 编译 + 管线缓存:用户和智能体编写的着色器可以热重载,无需重启引擎。
- Compute Pass 驱动 Scene Composer 的地形工具:高度图生成、水力侵蚀、法线推导、雕刻笔刷全部以 Metal compute kernel 运行。
AI 作为引擎接口
AI 系统不是一个聊天侧边栏——它是一个控制层,通过与编辑器相同的 API 操作引擎。
- 9 个专业智能体:Scene、Render、Shader、Asset、Optimize、Analyze、Art、Audio、Composer——每个都有限定范围的工具集(合计 30+ 工具,如
createEntity、addPostProcess、modifyShader、profileFrame、generateColorPalette)。 - 多智能体编排器:规划 LLM 将请求分解为按优先级排列的委派("创建 12 个建筑实体" → Scene;"霓虹发光材质" → Shader;"彩色点光源" → Render),并依次执行。
- 快照驱动的上下文:每次调用前,引擎序列化一份 EngineSnapshot——实体层级、组件、渲染状态、draw call、帧时序——让智能体基于真实的世界状态推理,而不是凭空臆想。
- 工具而非代码倾倒:智能体通过类型化、故障安全的工具调用改变世界,返回结构化结果,保证每个 AI 操作都可检查、可回滚。
- PromptScript:将自然语言行为描述编译为 Swift ECS 组件和系统的编译器,附带预览运行器。
- 多供应商:OpenAI、Anthropic、Gemini 后端统一在同一接口之下。
工具链:Shader Canvas 与 SDF Canvas
两个配套工具从引擎中生长出来,逐渐成为独立项目:
- Metal Shader Canvas —— 独立的实时 MSL 工作台,支持图层式着色器编写和智能体编辑闭环(详见其专属页面)。
- SDF Canvas —— 基于节点的有符号距离场编辑器,可生成 sphere tracing MSL:生成的片段着色器对 SDF 场景做 ray marching,支持软阴影(64 步 shadow marching)和 ray marching 环境光遮蔽。编辑器内还嵌入了 "Pro" 版本。
当前状态与坦诚的差距
Metal Caster 正处于活跃的 pre-alpha / 架构强化阶段,所有核心系统都已实现可运行的垂直切片:ECS 运行时、双路径渲染器、macOS 编辑器(多面板工作区、构建与运行工作流)、资产/构建管线,以及智能体系统。
仍在路线图上、如实陈述的部分:
- 硬件光线追踪(
MTLAccelerationStructure)以及探针之外的完整 GI 方案 - 专用的粒子/VFX 系统
- 将 Composer 智能体的地形工具和视口空间查询接入智能体管线
- 更广的测试覆盖和大规模场景的生产强化
愿景
Metal Caster 并不打算成为下一个"全能引擎"。
它的野心更加具体:
-
成为 Apple 平台上最佳的原生引擎体验
iOS、macOS、tvOS 和 visionOS —— 具备 Metal 优先的性能和 Swift 原生的易用性。 -
让 AI 成为主要的创作接口
不是一个聊天侧边栏,而是一个真正的引擎控制层,能够检查状态、调用工具,并安全地构建场景/材质/系统。 -
构建 USD 原生的协作工作流
将场景数据作为可组合、版本友好的资产,用于真实的团队工作流。 -
保持开放、可检查且性能透明
清晰的包边界、可测量的运行时行为,以及人类和智能体都能理解的 API。
如果成功,Metal Caster 应该感觉像是游戏引擎中的"徕卡":专注、深思熟虑,且在其领域内绝不妥协。
