对于一般管线,无论 Nsight/GPA 逆向得到的 shader 均只有 dxbc 反汇编字段,由于 Nsight 不提供热修改着色器的能力,这部分使用 GPA 进行(GPA 仅以 dxbc 反汇编的形式支援热修改)同时因其并未内置反汇编码到高级着色语言的转译模块,这里引入开源 dxbc2hlsl工具 cmd_Decompiler.exe
仓库地址:GitHub - Quon/HLSLDecompiler: HLSL Decompiler forked from 3Dmigoto
Error:0x80004005
如果在反编译过程中报出代码 0x80004005 的错误,代表着精准踩进了坑。这行通用 Error 代码毫无任何信息含量,大概率之前在 RenderDoc 中集成的插件版也从来没遇到过。

事实上,cmd_Decompiler.exe 的 -D 选项接受的输入是 dxbc 二进制字节码,而非 dxbc 反汇编后得到的汇编字段,此报错由输入了 asm 汇编字段产生。
实际的反汇编顺序应为:DXBC -> ASM -> HLSL,而 cmd_Decompiler.exe 仅支持从 DXBC 二进制字节码向 HLSL 的直接转译。

虽然 Nsight/GPA 将上述字段称为 DXBC,但事实上它们只是 dxbc 的反汇编产物,所以在翻译回 hlsl 之前,需要先将 ASM 汇编码组装回 DXBC(GPA 不提供组装),无语…
以下是一次正确的反汇编流程:
1 | cmd_Decompiler.exe -a h1.asm |

Decompiling Error
如果第二步从 dxbc 二进制字节码的过程中报出语法解析错误,代表此版 cmd_Decompiler.exe 尚未支持 SM5.0+ 的语法特性,然而此项目的着色器大量使用 SM5.0+ 的语法特性。

cmd_Decompiler.exe 的 master 分支已经多年不再维护,好在有人为 SM5.0+ 的语法特性维护了额外分支:
仓库地址:GitHub - Quon/HLSLDecompiler: HLSL Decompiler forked from 3Dmigoto
此分支附带预编译版本的 Release 二进制可执行文件,使用此版 cmd_Decompiler.exe 替换掉原先主分支可执行文件,再次尝试反编译 h1.shdr

至此完成了从 GPA 中提取 DXBC 反汇编字段到 hlsl 的转译工作。
从 ASM 反汇编直接到 HLSL 的转译工具
dxbc_reader 是一个支援直接从 ASM 反汇编字段转移 hlsl 的 lua 脚本工具。实测没有联系上下文的能力,单纯的行对行直接翻译,可读性较差。(甚至不能识别分支与循环)不过仍可以用于与 cmd_Decompiler.exe 的转译内容进行联合校对。项目中自带 lua 解释器,可直接执行。
命令行语法:.\lua\lua.exe dxbc_reader.lua example/fragment.txt -o dxbc.out