今天在 GitHub Trending 上看到一个有意思的项目:RenoDX(Renovation Engine for DirectX Games)——一句话概括,它是一个给 DirectX 游戏做"翻新"的模组工具集,最大的亮点是借助 Reshade 的插件系统实现几乎不依赖具体游戏版本的高兼容性。
一、项目概述
RenoDX 的全称是 Renovation Engine for DirectX Games,定位是一套用于修改(mod)游戏的工具集。它目前已经具备以下能力:
- 替换着色器:把游戏原本的像素/顶点着色器换成自定义实现;
- 注入缓冲区:向渲染管线中注入额外的常量/结构化缓冲区;
- 叠加层(overlay):在画面上绘制自定义 UI 或调试信息;
- 升级交换链(swapchain):改造 Present 链路,例如提升色深、HDR 输出;
- 升级纹理资源:替换或增强游戏加载的纹理;
- 写入用户设置:把模组配置持久化到磁盘。
最值得称道的设计取舍是:RenoDX 直接构建在 Reshade 的 add-on 系统之上,而不是去 patch 某个特定版本的 .exe。Reshade 已经封装好了 DirectX 各类钩子(hook),RenoDX 站在它的肩膀上,因此兼容性预期相当广——理论上所有能被 Reshade 注入的游戏都能挂载 RenoDX 插件。
仓库中还附带了几个现成实用工具:
renodx-fpslimiter.addon64—— FPS 限制器;renodx-devkit.addon64—— 帮助构建 addon 的开发套件;decomp.exe—— Shader Model 6.0+ 的反编译器(decompiler)。
二、技术原理
2.1 站在 Reshade 的肩膀上
传统游戏模组往往需要定位 exe 中硬编码的函数偏移,版本一更新就失效。RenoDX 改用 Reshade add-on API,由 Reshade 负责接管 ID3D11Device / ID3D12Device / IDXGISwapChain 等 COM 接口的创建与调用,RenoDX 只需实现回调逻辑。这正是 README 里强调的 “without worrying about patching version-specific exe files” 的实现基础。
2.2 构建系统与多编译器管线
从仓库根目录的 CMakeLists.txt 可以看出,RenoDX 是一个 C++20 工程,且对图形着色器编译管线做了精细抽象。它同时支持三套着色器编译器:
find_program(FXC_BIN fxc.exe ...) # DirectX 效果编译器(DX11)
find_program(DXC_BIN dxc.exe ...) # DirectX Shader Compiler(DX12 / SM6)
find_program(SLANGC_BIN slangc.exe ...) # Slang 编译器
构建系统通过文件名约定自动识别着色器目标。例如 *.ps_5_x.hlsl / *.vs_6_x.hlsl 这类命名会被解析出着色器类型(pixel/vertex)与模型版本,再分发给对应的编译器:
string(REGEX MATCH "(.*)\\.([pcv]s_[0-9]_[0-9x])\\.hlsl$" _ ${FILENAME})
set(SHADER_NAME ${CMAKE_MATCH_1})
set(SHADER_TARGET ${CMAKE_MATCH_2})
对于 Shader Model 6.0+ 的目标,构建系统切换到 DXC 并开启 16-bit 类型支持等现代特性;对于 .slang 文件则走 Slang 编译路径,并可输出 DXBC、DXIL 或 SPIR-V。这种设计让同一个 addon 既能兼容 DX11 也能兼容 DX12。
2.3 钩子与目标产物
RenoDX 借助微软 Detours 实现底层函数钩子,最终把每个 addon 编译成一个动态库模块:
set_target_properties(${ADDON}
PROPERTIES
PREFIX "renodx-"
SUFFIX ${TARGET_SUFFIX}) # .addon64 或 .addon32
构建脚本会根据当前编译目标自动选择架构后缀,并支持 x64 / x86 / arm64。每个 addon 目录下若包含 metadata.json 的 deploy.architecture 字段,还会按目标架构做选择性跳过,保证跨架构构建时不会因为缺库而整体失败。
2.4 MCP 桥接:用 AI 辅助开发模组
有意思的是,仓库里有一个 mcp_bridge 目标(输出名为 renodx-mcp-bridge),对应的文档 DEVKIT_MCP.md 描述了"live devkit and MCP workflow"。这意味着 RenoDX 提供了一套 MCP(Model Context Protocol)桥接,让 AI 工具在开发期直接与游戏运行时交互、热更新 addon,把模组开发流程现代化。
三、安装与快速开始
RenoDX 本身是一个开发工具集,release 产物是若干 .addon64 插件。前置环境要求:
- Windows(Reshade add-on 运行环境);
- Visual Studio 2022 + Windows 10 SDK(构建 addon 时需要
fxc.exe/dxc.exe); - DirectX Shader Compiler、Slang 编译器放入
bin/或 SDK 路径; - Microsoft Detours(构建脚本通过
vcvarsall.bat+ nmake 自动编译)。
克隆与构建:
git clone https://github.com/clshortfuse/renodx.git
cd renodx
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release
构建完成后,把生成的 renodx-*.addon64 放到 Reshade 的 addons 目录即可被加载。
四、使用方法与实战
4.1 加载现成插件
最简单的用法是直接拿仓库发布的成品插件,例如 FPS 限制器:下载 renodx-fpslimiter.addon64,放入 Reshade addon 目录,在 Reshade 面板中启用即可对受支持游戏限制帧率。
4.2 编写自己的 Addon
一个 addon 通常就是一个 addon.cpp 加上若干着色器文件、可选的 metadata.json。构建系统通过 file(GLOB ... addon.cpp) 自动发现所有 addon 目录并各自编译:
file(GLOB ADDON_FILES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/**/**/addon.cpp)
在 addon.cpp 中注册 Reshade 回调(如 OnCreateDevice、OnDraw、OnPresent)即可实现着色器替换或缓冲区注入。配合 renodx-devkit.addon64 与 MCP 桥接,还能在 IDE 外实时调参。
4.3 反编译与改造
当想替换某个具体着色器但手上只有编译后的资源时,可以用仓库附带的 decomp.exe 对 Shader Model 6.0+ 的着色器做反编译,得到可读的 HLSL 起点,再改造成自定义版本回灌。
五、常见问题与解决方案
- 构建报找不到
fxc.exe/dxc.exe:构建脚本会在bin/与Windows Kits/10/bin/<ver>/x64/下查找。确认已安装 Windows 10/11 SDK,或把编译器放进仓库bin/目录。 detours.lib编译失败:Detours 依赖vcvarsall.bat与 nmake,构建脚本会自动调用;若 VS 路径非默认,请确认vswhere能定位到含VC.Tools.x86.x64组件的安装。- 目标架构不匹配被跳过:若 addon 的
metadata.json里deploy.architecture不含当前架构,该 addon 会被SKIPPED_ADDON_TARGETS收集并跳过,这是预期行为。 - 插件加载后无效果:确认 Reshade 版本支持 add-on,且插件后缀(
.addon64/.addon32)与运行平台位数一致。 - Slang 编译告警:构建中已通过
-Wno-30056/-Wno-15205抑制部分已知告警,自定义.slang时如遇报错可参考这些开关。
六、总结
RenoDX 把"修改 DirectX 游戏"这件通常很脏很脆弱的事,重新组织成了一个基于 Reshade 插件系统的、可工程化构建的工具集:统一的着色器多编译器管线、Detours 钩子、跨架构 addon 产物,再加上 MCP 桥接的现代开发体验。对于想给老游戏做 HDR 升级、画质翻新或功能注入的开发者来说,它提供了一个兼容面广、又不依赖具体游戏版本偏移的扎实底座。如果你正好在折腾 Reshade 生态,RenoDX 值得加入工具箱。