2012-12-05 90 views

回答

2

理論上可以這樣做,但實際上它可能非常複雜。如何做到這一點取決於着色器在程序中的存儲方式,以及它的目標API和版本(DirectX着色器,OpenGL着色器,舊學校頂點或片段程序等)。請記住,自從我使用着色器以來已經有一段時間了,所以這些信息可能會過時。

如果幸運的話,着色器只是作爲字符串存儲在二進制文件的某處。業餘愛好者和輔導遊戲經常爲了簡單而做這個。如果是這種情況,您可以使用十六進制編輯器或類似工具提取着色器代碼。對於商業遊戲來說,由於很多原因,你不可能找到不受干擾的着色器源字符串。

或者,着色器可能存儲在運行時鏈接的DLL中。

在商業遊戲中可能存在數千種不同的着色器,它們很可能存儲在資源檔案中。如果它們是純文本格式,並且您有工具可以閱讀這些檔案,那麼您就是金手鐲。

我相信大多數着色器API都支持存儲編譯的着色器,而不必將源代碼傳遞給驅動程序。在這種情況下,你更有可能在資源文件中找到編譯的着色器。這些將在運行時被加載到內存中,據推測,你會在某處找到它們在進程的地址空間中。如果您知道位置,則可以使用內存偵聽工具將編譯的着色器代碼複製出來。雖然找到地址祝你好運。

一旦你有編譯的二進制文件,你需要以某種方式反彙編它。我相信DirectX在其API中內置了反彙編功能,而且現在OpenGL也可能會這樣做。我翻了一個谷歌搜索

一個有趣的可能性是nvemulate這顯然可以讓你輸出着色器通過模擬的圖形卡。我從來沒有用過它,它可能只適用於一部分着色器功能,對於最近遠程製作的任何遊戲來說速度極慢。它如何與你的顯卡交互我也不確定。

相關問題