最近我读了一些关于着色器的文章。有没有办法让游戏中使用着色器代码,就像你可以让程序看到它的汇编代码一样?
1 回答
理论上这是可以做到的,但在实践中可能会非常复杂。如何执行此操作取决于着色器在程序中的存储方式,以及它的目标 API 和版本(它是 DirectX 着色器、OpenGL 着色器、老式顶点或片段程序等)。请记住,我已经有一段时间没有使用着色器了,所以这些信息可能有点过时了。
如果幸运的话,着色器只是作为字符串存储在二进制文件中的某个地方。为简单起见,业余爱好者和教程游戏经常这样做。如果是这种情况,您可能可以使用十六进制编辑器或类似工具提取着色器代码。对于商业游戏,由于很多原因,您不太可能在二进制文件中找到不受干扰的着色器源字符串。
或者,着色器可能存储在运行时链接的 DLL 中。
在可能有数千种不同着色器的商业游戏中,它们很可能存储在某处的资源档案中。如果它们是纯文本的,并且您有阅读档案的工具,那么您就是黄金。
我相信大多数着色器 API 都支持存储已编译的着色器,而不必将源代码传递给驱动程序。在这种情况下,您更有可能在资源文件中找到已编译的着色器。这些可能会在运行时加载到内存中,您可以在某个进程的地址空间中找到它们。如果您知道位置,您可以使用内存侦听工具将编译后的着色器代码复制出来。不过,祝你找到地址好运。
一旦你有了编译好的二进制文件,你就需要以某种方式反汇编它。我相信 DirectX 已经在它的 API 中内置了反汇编,而 OpenGL 现在可能也这样做了。
我在 Google 搜索中发现的一个有趣的可能性是nvemulate,它显然允许您通过模拟显卡来输出着色器。我从未使用过它,它可能仅适用于着色器功能的子集,并且对于最近远程制作的任何游戏的速度都非常慢。我也不确定它如何与您的显卡交互。