今天在 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 值得加入工具箱。

项目地址:https://github.com/clshortfuse/renodx