Ruri.ShaderDecompiler 是一个通用的 Shader 反编译库,用于将编译后的 Shader 二进制还原为高可读性的 HLSL 代码。
项目核心目标是解决 Shader 反编译中 变量名丢失 的问题,通过跨引擎通用方案,重建 符号信息(Symbols) 与 字节码逻辑(Bytecode) 之间的关联。
✅️ 项目状态:基本中间层和符号注入已完成 只需在引擎端构建metadata传入即可带符号反编译
-
对于 Unity: 操作体验与 AssetRipper 一致,只需在工具中开启
ShaderDecompilerHook即可完成导出和反编译。 -
对于 Unreal Engine: 操作体验与 FModel 一致,需在工具中开启
ShaderDecompilerHook。- 首先需要 Dump 游戏的 Mapings 类型树,并在 FModel 设置中加载。
- 找到并选择
[GameName]/Contents文件夹下的ShaderArchive-*名字的Shader二进制。 - 右键点击并选择 Export Raw Data (.ushaderbytecode)。
- 工具会自动抓取所有材质球和 Shader 符号的 JSON 数据,随后自动执行反编译。 (如果没有加载Mapings将会丢失所有材质球提供的符号)
- 将 SPIRV-Cross 反编译的狗屎hlsl代码重新编译到DXBC 让编译器优化指令数量 然后重新反编译回更可读的hlsl
- 由于UE符号剔除很严重 并且运行时不需要符号的直接就是二进制丢失了一切结构信息 比如引擎内置的Global的cb 据AI所说没有提供编译后可逆的符号 我能想到的解决方法是提供一个分版本的引擎shader结构定义
但这个要分版本手动填写 我没那么多精力 还是靠后人的智慧看看有没有我分析漏的直接dump符号吧最近Token翻倍让AI实现了一个dumper 彻底解决了所有符号的问题 (后人竟是我自己)
GPU 侧的 Shader Binary(DXBC DXIL/ SPIR-V)通常会移除符号信息,仅保留寄存器与槽位绑定。这是性能优化行为,而非数据不可逆丢失。
无论 Unity 还是 Unreal Engine,为了支持 CPU 侧参数设置(如按变量名设置材质参数),引擎运行时必须保留:
变量名 <-> 绑定槽位
的映射关系。
本库不依赖猜测或模式匹配,其核心行为是:
- 解析引擎侧元数据(Unity Bindings / UE SRT)
- 将符号信息重新注入 Shader 的中间表示(SPIR-V)
- 重建可读、可维护的高级 Shader 代码
本质上是一次符号与逻辑的重组过程。
无论输入为 DXBC / SPIR-V / DXIL,都会统一转换为 SPIR-V 进行处理,从而保证反编译逻辑的统一性与可扩展性。
Unity 是由AssetRipper解析并填充metadata符号到此工具即可完美还原符号反编译 已在私有仓库完成
UE 是由CUE4Parse解析并填充metadata符号到此工具即可完美还原符号反编译 UE剔除过于严重并且屎山代码过于恶心已被气炸优先级已降低 已完成