[正在被严格的 MCP 客户端取代。参见下文的弃用通知。 Metal Shader MCP 是一个 macOS SwiftUI + Metal 的游乐场,具有规范的工作流程,用于着色器迭代、视觉证据和持续集成。计划有一个 MCP 层,让 AI 助手与应用程序交互(编译、预览、快照),但目前的主要入口点是你可以本地编译和运行的 macOS 应用程序。
swiftc -o MetalShaderStudio \
ShaderPlayground.swift AppShellView.swift HistoryTabView.swift SessionRecorder.swift \
Sources/MetalShaderCore/MCPClient.swift \
-framework SwiftUI -framework MetalKit -framework AppKit -framework UniformTypeIdentifiers \
-parse-as-library
./MetalShaderStudio --tab history
# 计划(MCP 服务器),今天不需要 macOS 应用程序
npm install
npm run build
无需启动应用即可将着色器渲染为 PNG:
swift run ShaderRenderCLI --shader-file shaders/plasma_fractal.metal --out data/sample.png --width 256 --height 256 --time 0.0
Resources/communication/coreml_config.json 中配置(提供模板)。Resources/models/YourModel.mlmodelc 或 .mlmodel 提供模型。配置字段:
modelPath:模型路径(例如,Resources/models/StyleTransfer.mlmodelc)inputName:图像输入特征名称(例如,image)outputName:输出图像特征名称(例如,stylizedImage)width,height:模型输入尺寸注意:UI 保持不变;这仅影响导出的帧和会话快照。
npm start
npm run dev
compile_shader:编译 Metal 着色器代码
preview_shader:生成预览图像
update_uniforms:更新着色器参数
profile_performance:性能指标
hot_reload:文件监视
validate_shader:语法验证
#include <metal_stdlib>
using namespace metal;
fragment float4 kaleidoscopeFragment(
VertexOut in [[stage_in]],
texture2d<float> texture [[texture(0)]],
constant Uniforms& uniforms [[buffer(0)]]
) {
// 万花筒变换
float2 uv = kaleidoscope(in.texCoord, 6, uniforms.time);
// 生成 RGBY 颜色块
float4 color = generateColorBlock(uv, uniforms.blockSize);
return color;
}
着色器应包括一个 docstring,在顶部声明名称和描述。此内容由 ShaderMetadata.from(code:path:) 解析,并将驱动库搜索、缩略图和元数据视图。
示例:
/**
* 万花筒方块
* 带动画控制的几何颜色块。
*/
#include <metal_stdlib>
using namespace metal;
fragment float4 fragmentShader() { return float4(0,0,0,1); }
namedescription在严格 MCP 客户端被集成之前,应用程序使用位于 Resources/communication/ 的简单文件桥:
commands.json(输入,本地工作流中可选):排队的操作(例如,set_shader, export_frame)status.json(输出):最后操作的状态和诊断信息current_shader_meta.json:活动着色器的解析名称/描述/路径library_index.json:索引库元数据uniforms.json:当前统一值compilation_errors.json:最后编译诊断键和确切形状将在 MCP 传输替换桥梁时稳定化,但这些文件是当前本地工具集成的事实来源。
metal-shader-mcp/
├── src/
│ ├── index.ts # MCP 服务器
│ ├── compiler.ts # Metal 编译
│ ├── preview.ts # 预览引擎
│ ├── hotReload.ts # 文件监视
│ ├── profiler.ts # 性能分析
│ └── parameters.ts # 统一管理
├── shaders/
│ └── kaleidoscope.metal # 示例着色器
└── dist/ # 编译输出
访问开发仪表板:
http://localhost:3000/dashboard
特性:
包含的万花筒着色器演示:
分析器测量:
此项目先前使用当前工作目录解析资源路径,导致从不同文件夹启动 MCP 时行为不匹配(例如,动画工作但库/历史记录不工作,反之亦然)。现在路径相对于项目根目录解析,如下检测:
如果需要覆盖,请在启动前设置环境变量:
这确保 MCP 和应用程序无论在哪里运行 CLI,都能读写相同的 Resources/communication 和 Resources/screenshots 文件夹。
此存储库不需要外部服务密钥来运行核心 ShaderPlayground + MCP 流程。如果你添加需要秘密的集成,请按以下顺序存储它们:
永远不要将秘密提交到仓库。在代码中使用环境变量(如 process.env.MY_KEY),并在本文档中记录任何所需变量。
每次重要的开发动作都必须完成以下步骤:
详见 WARP.md 中的详细工作流程文档。
此项目包含一个带有着色器固定装置和黄金图像的视觉回归框架。
# 捕获当前状态的截图(可选手动证据)
./scripts/screenshot_app.sh "feature_description"
# 运行视觉测试
swift test --filter VisualRegressionTests
# 如果有意更改视觉效果,重新生成黄金图像
make regen-goldens
Resources/screenshots/tests/(例如,actual_*.png,diff_*.png 和一个总结 JSON)。Tests/MetalShaderTests/Fixtures/ 并通过 SPM 资源捆绑。欢迎贡献!请遵循 WARP.md 中的工作流程要求:
MIT