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