renderdoc-mcp
⚠️ Disclaimer
$\\Large \\color{#ff69b4}{\\textsf{这是个人事务}$$\\Large\\color}{#ff66b4}}{\\mathtt{✨ vib\\text{-}coding ✨}}$ $\\大型\\彩色{#ff69b4}{\\textsf{project--}}$ $\\Large\\color{#ff69b4}{\\textsf{为娱乐而建,不用于生产用途。}}$
$\\small\\color{gray}{\\textsf{我不知道为什么这个回购有这么多星星…}}$
MCP服务器 渲染文档 --让AI助手分析GPU帧捕获(.rdc 文件),用于图形调试和性能分析。
建立在 模型上下文协议,适用于Claude Desktop、Claude Code和任何兼容MCP的客户端。
特性
- 42工具 涵盖完整的RenderDoc分析工作流程
- 10个高级工具 用于一次调用分析(绘制调用状态、帧概述、差异、批量导出、像素区域采样等)
- 3个内置提示 用于指导调试
- 人类可读输出 --混合模式、深度函数、拓扑显示为名称而非数字
- GPU怪癖检测 --自动根据驾驶员姓名识别Adreno/Mali/PowerVR/Apple特有的陷阱
- 无头 -不需要GUI,完全通过RenderDoc的Python回放API运行
- 纯 Python --单身
pip install,无构建步骤 - 支持HttpClient1、HttpClient2、OpenGL、Vulkan、OpenGL ES捕捉
快速开始
1.先决条件
- Python 3.10+
- 渲染文档 已安装(下载)
- 你需要 renderdoc.pyd (Windows)或 renderdoc.so (Linux)Python模块 - 它随每个RenderDoc安装一起提供
2.安装
git clone https://github.com/Linkingooo/renderdoc-mcp.git
cd renderdoc-mcp
pip install -e .3.找到你的 renderdoc.pyd 路径
Python模块位于RenderDoc安装目录中:
| 平台 | 典型路径 |
|---|---|
| 窗户 | C:\Program Files\RenderDoc\renderdoc.pyd |
| Linux | /usr/lib/renderdoc/librenderdoc.so 或者你在哪里建造的 |
你需要 目录 包含此文件。
4.配置您的MCP客户端
Claude Desktop
编辑 claude_desktop_config.json (设置→ 开发者→ 编辑配置):
{
"mcpServers": {
"renderdoc": {
"command": "python",
"args": ["-m", "renderdoc_mcp"],
"env": {
"RENDERDOC_MODULE_PATH": "C:\\Program Files\\RenderDoc"
}
}
}
}Claude Code
添加 .claude/settings.json:
{
"mcpServers": {
"renderdoc": {
"command": "python",
"args": ["-m", "renderdoc_mcp"],
"env": {
"RENDERDOC_MODULE_PATH": "C:\\Program Files\\RenderDoc"
}
}
}
}Run standalone
# Set the module path
export RENDERDOC_MODULE_PATH="/path/to/renderdoc" # Linux/macOS
set RENDERDOC_MODULE_PATH=C:\Program Files\RenderDoc # Windows
# Run
python -m renderdoc_mcp用法示例
配置后,只需与您的AI助手交谈:
“打开 frame.rdc 并向我展示画面中发生了什么”“找到渲染角色模型的绘图调用,并检查其管道状态”
“为什么我的阴影贴图呈现为黑色?检查深度传递”
“分析性能——是否有多余的抽签?”
典型工具流程
open_capture("frame.rdc") # Load the capture
├── get_capture_info() # API, GPU, known_gpu_quirks
├── get_frame_overview() # Frame-level stats and render passes
├── get_draw_call_state(142) # Complete draw call state in one call
├── diff_draw_calls(140, 142) # Compare two draw calls (with implications)
├── export_draw_textures(142, "./tex/") # Batch export all bound textures
├── save_render_target(142, "./rt.png") # Save render target snapshot
├── analyze_render_passes() # Auto-detect render pass boundaries
├── find_draws(blend=True, min_vertices=1000) # Search by rendering state
├── sample_pixel_region(rt_id, 0,0,512,512) # Scan RT region for NaN/Inf/negatives
├── pixel_history(id, 512, 384) # Debug a specific pixel
├── export_mesh(142, "./mesh.obj") # Export mesh as OBJ
└── close_capture() # Clean up性能和诊断分析:
get_pass_timing(granularity="pass") # Find most expensive render passes
analyze_overdraw() # Fill-rate pressure estimate
analyze_bandwidth() # Memory bandwidth estimate
analyze_state_changes() # Batching opportunities
diagnose_negative_values() # Find NaN/Inf/negative color values (爆闪)
diagnose_precision_issues() # R11G11B10, D16, SRGB mismatches
diagnose_reflection_mismatch() # Reflection artifact diagnosis
diagnose_mobile_risks() # Comprehensive mobile GPU risk check对于较低级别的检查,所有粒度工具仍然可用:
set_event(142) # Navigate to a draw call
├── get_pipeline_state() # Inspect rasterizer/blend/depth
├── get_shader_bindings("pixel") # Check what textures/buffers are bound
├── get_cbuffer_contents("pixel", 0, filter="ibl") # Read shader constants (filterable)
├── disassemble_shader("pixel", search="SampleSH") # Shader code with context search
└── save_texture(id, "rt.png") # Export a specific texture工具
会话管理(4)
| 工具 | 说明 |
|---|---|
open_capture | 打开a .rdc 文件(自动关闭上一个) |
close_capture | 关闭当前捕获并释放资源 |
get_capture_info | 捕获元数据:API、操作数、分辨率、, known_gpuquirks (Adreno/马里/PowerVR/苹果) |
get_frame_overview | 帧级统计:按类型、纹理/缓冲区内存、渲染目标、分辨率列出的动作计数 |
活动导航(5)
| 工具 | 说明 |
|---|---|
list_actions | 列出绘图调用/操作树——支持 filter (名称子字符串)和 event_type (绘制/清除/复制……) |
get_action | 单个动作的全部细节 |
set_event | 导航到事件(必需的 在管道查询之前) |
search_actions | 按名称模式和/或动作标志搜索 |
find_draws | 按渲染状态搜索绘图调用:混合、最小顶点、纹理/着色器/RT绑定 |
管道检查(4)
| 工具 | 说明 |
|---|---|
get_pipeline_state | 完整状态:拓扑、视口、光栅化器、混合、深度、模板(人类可读菜单) |
get_shader_bindings | 恒定缓冲区、SRV、UAV、着色器阶段的采样器 |
get_vertex_inputs | 顶点属性、顶点/索引缓冲区绑定 |
get_draw_call_state | 一次通话抽奖分析:动作信息、混合公式、深度、模具、光栅化器、带大小的纹理、RT、着色器 |
资源分析(4)
| 工具 | 说明 |
|---|---|
list_textures | 所有纹理(可按格式过滤,最小宽度) |
list_buffers | 所有缓冲区(可按最小大小过滤) |
list_resources | 所有命名资源(可按类型、名称模式过滤) |
get_resource_usage | 哪些事件读取/写入资源 |
数据提取(8)
| 工具 | 说明 |
|---|---|
save_texture | 导出为PNG、JPG、BMP、TGA、HDR、EXR或DDS |
get_buffer_data | 读取缓冲区字节(十六进制转储或float32数组) |
pick_pixel | 坐标处的RGBA值 |
get_texture_stats | 每通道最小/最大/平均值 异常检测 (NaN/Inf/阴性);支持 all_slices 对于立方体贴图 |
read_texture_pixels | 读取具有每像素异常标志的矩形像素区域(最多64×64) |
export_draw_textures | 批量导出 绑定到绘图调用的所有纹理(自动命名,跳过占位符) |
save_render_target | 保存RT快照 在活动中(颜色+可选深度) |
export_mesh | 将网格导出为OBJ 使用VS后数据中的位置、法线、UV |
着色器分析(3)
| 工具 | 说明 |
|---|---|
disassemble_shader | 遮阳板拆卸 自动回退链;支持 search (关键字+上下文)和 line_range |
get_shader_reflection | 输入/输出签名、资源绑定布局 |
get_cbuffer_contents | 实际恒定缓冲变量值;支持 filter 用于变量名称子字符串 |
高级(6)
| 工具 | 说明 |
|---|---|
pixel_history | 所有事件的完整每像素修改历史记录 |
get_post_vs_data | 变换后顶点数据(VS输出/GS输出) |
diff_draw_calls | 比较两次平局 --显示具有人类可读含义的状态差异 |
analyze_render_passes | 自动检测渲染过程边界 通过Clear/RT开关,总结每次通过 |
sample_pixel_region | 均匀网格扫描 RT区域——检测NaN/Inf/阴性/过度暴露热点 |
debug_shader_at_pixel | 每像素着色器调试 --返回变量跟踪或像素值+着色器信息作为回退 |
性能分析(4)
| 工具 | 说明 |
|---|---|
get_pass_timing | 最昂贵的渲染过程——使用GPU计数器(如果可用),退回到三角形计数启发式 |
analyze_overdraw | 每个渲染目标组的透支估计 |
analyze_bandwidth | 每个渲染目标的写/读带宽估计 |
analyze_state_changes | 查找冗余状态更改模式和批处理机会 |
诊断(4)
| 工具 | 说明 |
|---|---|
diagnose_negative_values | 扫描所有浮点RT是否为负/NaN/Inf——找到引入它们的第一个事件,检测TAA累积 |
diagnose_precision_issues | 检查R11G11B10符号位丢失、浅深度缓冲区、SRGB/线性失配 |
diagnose_reflection_mismatch | 将反射过程与主场景绘制进行比较--查找着色器/混合/格式原因 |
diagnose_mobile_risks | 全面检查精度/性能/兼容性/GPU特定风险类别 |
提示
内置提示模板,指导人工智能完成常见工作流程:
| 提示 | 描述 |
|---|---|
debug_draw_call | 深挖单次调用:管道→ 着色器→ cbuffers→ 输出 |
find_rendering_issue | 从问题描述进行系统诊断 |
analyze_performance | 帧范围性能分析:通过时间、透支、带宽、状态变化 |
运作原理
AI Assistant ←—MCP—→ renderdoc-mcp server ←—Python API—→ renderdoc.pyd ←→ GPU replay服务器使用RenderDoc的无头回放API(renderdoc.pyd)致:
- 打开
.rdc在没有GUI的情况下捕获文件 - 在任何事件中回放帧和查询管道状态
- 提取纹理、缓冲区、着色器数据和像素历史记录
- 返回结构化JSON供AI推理
发展
# Install in dev mode
pip install -e .
# Run tests (no RenderDoc needed — uses mocks)
python -m pytest tests/ -v
# Project structure
src/renderdoc_mcp/
├── server.py # FastMCP server, 3 prompt definitions
├── session.py # Capture lifecycle, resource/texture caches (singleton)
├── util.py # Serialization, enum maps, blend formula, module loader
└── tools/
├── session_tools.py # open/close/info (GPU quirks) + get_frame_overview
├── event_tools.py # list/get/set/search actions + find_draws
├── pipeline_tools.py # pipeline state, shader bindings, vertex inputs + get_draw_call_state
├── resource_tools.py # texture/buffer/resource enumeration
├── data_tools.py # save/read/pick/stats + read_texture_pixels + export_draw_textures, save_render_target, export_mesh
├── shader_tools.py # disassembly (fallback chain, search), reflection, cbuffer contents (filter)
├── advanced_tools.py # pixel history, post-VS data + diff_draw_calls (implications), analyze_render_passes, sample_pixel_region, debug_shader_at_pixel
├── performance_tools.py # get_pass_timing, analyze_overdraw, analyze_bandwidth, analyze_state_changes
└── diagnostic_tools.py # diagnose_negative_values, diagnose_precision_issues, diagnose_reflection_mismatch, diagnose_mobile_risks许可证
麻省理工学院
