RenoDX着色器逆向入门:decomp.exe与3Dmigoto如何反编译SM6.0+游戏着色器
2026/9/15 20:02:17 网站建设 项目流程

RenoDX着色器逆向入门:decomp.exe与3Dmigoto如何反编译SM6.0+游戏着色器

【免费下载链接】renodxRenovation Engine for DirectX Games项目地址: https://gitcode.com/GitHub_Trending/re/renodx

RenoDX(Renovation Engine for DirectX Games,DirectX 游戏翻新引擎)是一套游戏模组工具集:替换着色器、注入缓冲、升级交换链、添加叠加层。它的逆向工作流核心就是两个反编译器——decomp.exe负责 Shader Model 6.0+ 的 HLSL 还原,3Dmigotocmd_Decompiler.exe负责 SM5.0 及以下。本文带你用最小成本跑通"从游戏里拿到着色器 → 反编译成可读 HLSL → 替换回游戏"的完整流程。

一、为什么着色器逆向需要"双反编译器"

现代游戏运行时使用的着色器是二进制字节码(.cso/ DXIL),不是源码。不同 Shader Model 需要不同的工具链:

Shader Model工具说明
SM 6.0+(ps_6_0~ps_6_6decomp.exeRenoDX 自带,基于 DirectXShaderCompiler(D3DCompiler)实现
SM 5.0 及以下3Dmigotocmd_Decompiler.exe第三方经典工具,仓库最低要求版本1.3.16(见 cmake/tool-versions.cmake)

💡 分界线就是 DXIL:SM6 开始微软改用新的 DXIL 字节码格式,旧工具看不懂,所以 RenoDX 专门写了一个基于 D3DCompiler 的反编译器。

RenoDX 之所以能做到"通吃",是因为它建立在 Reshade 的 add-on 体系上(见 README.md),无需针对特定游戏 exe 打补丁,兼容性极宽。

二、decomp.exe:SM6.0+ 着色器反编译

decomp.exe是命令行单文件工具,入口在 src/decompiler/cli.cpp,核心反编译逻辑(指令映射、签名解析、lerp/pow 模式识别等)在 src/utils/shader_decompiler_dxc.hpp。

它的工作分两步:

  1. 反汇编:调用 D3DCompiler 把二进制着色器还原成中间指令文本;
  2. 反编译:解析指令流、输入/输出签名、cbuffer 与资源绑定表,重建接近可读的 HLSL。

快速上手:3 条命令搞定

# 1. 把 .cso 反编译成同目录 .hlsl(不指定输出时自动用输入名) decomp.exe shader.cso # 2. 指定输出路径,--flatten 把复杂控制流展开为平坦代码(更易读) decomp.exe shader.cso output.hlsl --flatten # 3. 批量处理时用 --skip-existing 跳过已反编译的文件 decomp.exe *.cso --skip-existing

完整的参数帮助可以直接运行decomp.exe查看,用法提示见 cli.cpp 第 23~24 行。

--flatten值得单独说:DXIL 里常有编译器生成的复杂分支结构,展开后代码更"原始"但更好改,逆向圈常用它来确认循环和条件的真实逻辑。

三、3Dmigoto:老一代着色器的兜底方案

SM5.0 及以下的着色器(如大量 DX11 老游戏的ps_5_0cs_5_0)用 3Dmigoto 的cmd_Decompiler.exe处理即可。仓库的官方贡献指南 docs/CONTRIBUTING.md 明确列出了它作为环境依赖之一:

  • 从 3Dmigoto 的 release 页下载工具包;
  • cmd_Decompiler.exe放入.\bin
  • 或直接跑 scripts/setup-dev-env.ps1 的-Tools 3dmigoto -Install,脚本会自动拉取配置好的版本。

工具链版本基准全部集中在 cmake/tool-versions.cmake(DXC、Slang、glslang、3Dmigoto 各一条),改版本只动这一个文件。

四、着色器文件命名规范:一眼看懂逆向产物

RenoDX 对反编译产物的命名有严格约定,构建系统会自动扫描src/games/下的所有.hlsl(见 docs/CONTRIBUTING.md 的"Automated configuration"一节):

{名称}_0x{CRC32}.{ps|cs|vs}_{大版本}_{小版本}.hlsl

例如 tonemap_0x756E88B2.ps_4_0.hlsl:tonemap是人为起的名字,0x756E88B2是该着色器在游戏中的 CRC32 哈希(用于运行时精确匹配),ps_4_0是像素着色器 SM4.0。你从 decomp.exe 拿到的文件按此规则改名放进游戏模组目录,就能被构建系统识别并编译替换。

仓库里几百个游戏模组都是这么组织出来的,随便挑一个看结构即可,比如 src/games/valheim/ 或 src/games/fallout76/。新建模组可以从模板目录 src/games/generic 复制起步。

五、进阶:devkit 实时转储,不进游戏编辑器

想确认"游戏当前到底在跑哪个着色器"?RenoDX 提供devkit游戏内检查插件 +mcp_bridge桥接进程(构建目标见 docs/DEVKIT_MCP.md):

  • devkit_list_shaders/devkit_get_shader:列出并查看帧内着色器;
  • devkit_dump_shader:把指定着色器转储为二进制,交给上面的 decomp.exe 反编译;
  • 转储目录约定为renodx-dev/dump,热替换用renodx-dev/live

官方建议的排查思路是从一帧的末尾往回找(最终 blit、UI 合成、场景合成),先定位"HDR 数据在哪一步丢失",再反编译对应的 pass——这套流程在 DEVKIT_MCP.md 第 91~108 行 有完整描述。

六、常见问题与技巧

Q1:反编译出来的代码为什么全是exp2(log2(x)*y)这种怪写法?这是编译器优化痕迹。decomp.exe 已内置了常见模式还原(如((b-a)*t)+alerp(a,b,t)),映射表可参考 notes.md,实现见 shader_decompiler_dxc.hpp 的 OptimizeString。

Q2:反编译失败或输出为空?先确认 DXC 工具链版本达标(CMake 配置时会自动检查并警告),用 scripts/setup-dev-env.ps1-Update更新即可;再确认 Reshade 已正确安装(RenoDX 基于其 add-on 系统,是硬性依赖)。

Q3:SM6 和 SM5 的转储文件有什么区别?转储扩展名按 API 走:DirectX 系统一是.cso(Vulkan 是.spv),逻辑见 src/utils/shader_dump.hpp。拿到文件后按版本号选工具即可:_6_x找 decomp.exe,_5_x及更低找 3Dmigoto。

Q4:改完之后如何验证?把 HLSL 按命名规范放进游戏目录重新构建模组,devkit 的devkit_load_live_shaders支持热加载,改一行 shader 不用重启游戏——这是 RenoDX 相比传统 mod 开发最大的效率优势。

七、小结

  • SM6.0+decomp.exe,一行命令出 HLSL,--flatten辅助阅读;
  • SM5.0-→ 3Dmigotocmd_Decompiler.exesetup-dev-env.ps1可一键装好;
  • 产物按{名称}_0x{CRC}.{type}_{x}_{y}.hlsl命名即可被构建系统自动接管;
  • 拿不准目标 pass 时,用 devkit + mcp_bridge 从帧尾倒查,再转储反编译。

照着这条链路走,从"游戏里的一坨二进制"到"可修改的着色器源码",通常只需要半小时。

【免费下载链接】renodxRenovation Engine for DirectX Games项目地址: https://gitcode.com/GitHub_Trending/re/renodx

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询