RenoDX游戏帧结构分析:如何从draw调用中定位tonemap与final blit关键通道
【免费下载链接】renodxRenovation Engine for DirectX Games项目地址: https://gitcode.com/GitHub_Trending/re/renodx
RenoDX(Renovation Engine for DirectX Games)是一款 DirectX 游戏 Mod 工具集,支持替换着色器、注入缓冲区、升级交换链与纹理资源等操作。本文介绍如何利用 RenoDX 自带的 DevKit 与 MCP 工作流,从一帧内的 draw 调用列表中快速定位tonemap 通道与final blit 通道,回答 HDR 改造中最关键的问题:高动态范围数据到底在哪一步被"压死"的?
一、为什么必须找到 tonemap 和 final blit 这两道关卡 🎯
任何 DirectX 游戏的一帧,渲染流水线大致是:场景渲染 → 后期处理 → tonemap(HDR 转 SDR)→ UI 叠加 → final blit(最终拷贝到屏幕)。
- tonemap 通道:把 HDR 场景数据压缩到人眼可见范围,通常也是高动态范围数据的"终点站";
- final blit 通道:把合成好的画面拷贝到交换链上呈现给显示器,通常是最简单的一次全屏拷贝。
对想做 HDR 保留、色彩改造的 Mod 作者来说,核心判断只有一条:
final blit 之前,HDR 是否已经消失?如果消失,战场在 tonemap 通道;如果还在,直接改造 final blit 前的合成通道即可。
这正是 RenoDX 官方文档 docs/DEVKIT_MCP.md 中反复强调的"从帧尾倒查"思路。
二、RenoDX 的帧结构分析三件套 🔧
RenoDX 的实时分析栈由三部分组成:
| 组件 | 路径 | 作用 |
|---|---|---|
| devkit 插件 | src/addons/devkit/addon.cpp | 游戏内追踪设备、着色器、资源与帧快照 |
| MCP 桥进程 | src/apps/mcp_bridge/main.cpp | 把命名管道暴露为标准 MCP 工具服务 |
| MCP 客户端 | Codex、Claude Desktop 等 | 以自然语言/JSON-RPC 驱动分析 |
架构分层说明见 src/addons/devkit/mcp/README.md,draw 调用的数据结构定义在 src/addons/devkit/mcp/draw_summary.hpp。
三、七步定位法:从帧尾倒查关键通道
官方推荐的工作循环(来自 docs/DEVKIT_MCP.md):
- 连接并选择活动设备:
devkit_status+devkit_select_device。很多游戏暴露多个 D3D 设备,draws 为 0 的那个基本可以排除; - 排队帧快照:
devkit_queue_snapshot,等待下一次 present 捕获; - 先检查靠后的 draws,而不是第一个"看起来亮"的着色器;
- 识别三类候选通道:场景合成/tonemap、SDR 的 UI 与文字通道、真正的 final blit(交换链通道);
- 用
devkit_get_draw细看候选 draw:确认渲染目标与输入纹理; - 用
devkit_analyze_resource回读资源:验证数据格式与数值范围; - 确认目标通道后,再 dump 并编辑着色器。
devkit_list_draws还支持按shaderHash、minRenderTargetCount等字段过滤(见 src/addons/devkit/mcp/README.md),能从上千次调用中一步筛出全屏四边形 + 单张输入纹理的典型 final blit。
四、读懂一次 draw 调用的关键字段 🔍
devkit_get_draw返回的信息中,与定位 tonemap / final blit 最相关的是:
| 字段 | 定位技巧 |
|---|---|
| 像素/顶点着色器哈希 | 同名哈希反复出现在帧尾,多半是合成或拷贝通道 |
| 渲染目标(RTV)格式与尺寸 | 全屏 +r8g8b8a8通常是 SDR 输出;r16g16b16a16_float说明还带着 HDR |
| SRV 输入数量与格式 | 只有一张输入纹理的全屏 draw,大概率就是 final blit |
| 混合状态 | final blit 一般是直接覆盖写入,不启用混合 |
| swapchain / clone 标志 | 直接绑定交换链的 draw 就是屏幕出口 |
经验法则:如果最终通道只是从一个已经是 SDR的目标做一次单纹理拷贝,那这里不是恢复 HDR 的位置——必须往前找到 tonemap 之前的合成通道。
五、验证通道:用资源克隆确认 HDR 是否幸存 📊
确定候选通道后,RenoDX 提供最直接的验证手段——资源克隆对比:
- 原始视图可能仍是
r8g8b8a8_unorm_srgb(被截断到 0~1); - 克隆视图可升级为
r16g16b16a16_float(保留大于 1.0 的高光)。
流程:devkit_set_resource_clone开启克隆 → 用preferClone: true回读同一资源 → 对比数值统计。导出方面:
- PNG:仅 SDR 预览,只能"看个大概";
- EXR:HDR 保留的
RGBA16F导出,才是判断 HDR 生死的地面真值。
六、从分析到 Mod:把结论落成替换着色器 🚀
通道确定后,把验证过的行为迁移到 src/games/ 下的游戏 Mod 目录:
- 每个游戏一个文件夹,包含
addon.cpp(资源升级与着色器注册)和按 CRC 命名的替换着色器; - 着色器文件必须命名为
{CRC32}.{TARGET}.hlsl,例如tonemap_0xE6BB6773.ps_5_0.hlsl,规则见 src/games/AGENTS.md; - 替换用的 HDR 算法库非常齐全,src/shaders/tonemap.hlsl 汇总了 aces.hlsl、frostbite.hlsl、reno_drt.hlsl 等多种 tonemap 实现;
- 运行时着色器放在
renodx-dev/live/,原始 dump 放在renodx-dev/dump/,两者不要混用。
常用文件导航
- 完整工作流:docs/DEVKIT_MCP.md
- 贡献指南:docs/CONTRIBUTING.md
- DevKit 插件入口:src/addons/devkit/addon.cpp
- 工具注册层:src/addons/devkit/mcp/runtime.hpp
- 帧快照工具:src/addons/devkit/mcp/snapshot_tools.hpp
- 着色器检视:src/addons/devkit/mcp/shader_inspection.hpp
- 资源分析:src/addons/devkit/mcp/resource_analysis.hpp
一句话总结:从帧尾倒查,用devkit_list_draws过滤、devkit_get_draw确认、资源克隆验证,三步就能把 tonemap 与 final blit 这两个关键通道钉死——这就是 RenoDX 帧结构分析的核心方法论。
【免费下载链接】renodxRenovation Engine for DirectX Games项目地址: https://gitcode.com/GitHub_Trending/re/renodx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考