最近我正在閱讀關於着色器的一些信息。有沒有辦法讓遊戲中使用的着色器代碼,就像程序可以看到它的彙編代碼一樣?有沒有辦法在遊戲啓動時看到着色器代碼運行?
0
A
回答
2
理論上可以這樣做,但實際上它可能非常複雜。如何做到這一點取決於着色器在程序中的存儲方式,以及它的目標API和版本(DirectX着色器,OpenGL着色器,舊學校頂點或片段程序等)。請記住,自從我使用着色器以來已經有一段時間了,所以這些信息可能會過時。
如果幸運的話,着色器只是作爲字符串存儲在二進制文件的某處。業餘愛好者和輔導遊戲經常爲了簡單而做這個。如果是這種情況,您可以使用十六進制編輯器或類似工具提取着色器代碼。對於商業遊戲來說,由於很多原因,你不可能找到不受干擾的着色器源字符串。
或者,着色器可能存儲在運行時鏈接的DLL中。
在商業遊戲中可能存在數千種不同的着色器,它們很可能存儲在資源檔案中。如果它們是純文本格式,並且您有工具可以閱讀這些檔案,那麼您就是金手鐲。
我相信大多數着色器API都支持存儲編譯的着色器,而不必將源代碼傳遞給驅動程序。在這種情況下,你更有可能在資源文件中找到編譯的着色器。這些將在運行時被加載到內存中,據推測,你會在某處找到它們在進程的地址空間中。如果您知道位置,則可以使用內存偵聽工具將編譯的着色器代碼複製出來。雖然找到地址祝你好運。
一旦你有編譯的二進制文件,你需要以某種方式反彙編它。我相信DirectX在其API中內置了反彙編功能,而且現在OpenGL也可能會這樣做。我翻了一個谷歌搜索
一個有趣的可能性是nvemulate這顯然可以讓你輸出着色器通過模擬的圖形卡。我從來沒有用過它,它可能只適用於一部分着色器功能,對於最近遠程製作的任何遊戲來說速度極慢。它如何與你的顯卡交互我也不確定。
相關問題
- 1. 拼圖遊戲代碼沒有運行
- 2. 在OllyDbg中加入代碼時,有沒有辦法看到GUI?
- 3. 有沒有辦法在每次啓動cmd時運行vcvars32.bat?
- 4. 有沒有辦法在spring啓動時運行madvoc?
- 5. 有沒有辦法在Objective-C中自動運行代碼?
- 6. 有沒有辦法在撤銷方法時看到執行什麼代碼?
- 7. 有沒有辦法在運行時用C代碼獲取源代碼行號?
- 8. 啓動代碼沒有運行?
- 9. 程序集加載時有沒有辦法運行代碼?
- 10. 有沒有辦法在遊戲開始之前進行簡介?
- 11. 有沒有辦法在WP7上的XNA遊戲中顯示HTML代碼
- 12. 有沒有辦法看到哪一行代碼剛剛在Xcode中執行?
- 13. 有沒有辦法在Vulkan計算着色器中使用clz()?
- 14. 有沒有辦法在mysql中運行異常代碼
- 15. 有沒有辦法在ipython筆記本中運行scala代碼?
- 16. 有沒有辦法在python中運行powershell代碼
- 17. 有沒有辦法在mac上運行opencl內核代碼
- 18. 有沒有辦法調試在`multiprocessing.Process`上運行的Python代碼?
- 19. 有沒有辦法只在Tomcat/Wildfly/Glassfish啓動時運行方法/類?
- 20. 有沒有辦法在黑莓中啓動計時器evnets?
- 21. 有沒有辦法在運行時獲取類的字節碼?
- 22. 有沒有辦法看到正在運行的Bazel動作的助記符?
- 23. 有沒有辦法在應用運行時看到Core Data存儲的內容?
- 24. Apple允許在運行時在iOS遊戲中下載OpenGL着色器嗎?
- 25. WP8 HTML5遊戲沒有正確運行
- 26. 有沒有辦法從JavaScript運行R代碼?
- 27. 有沒有辦法運行Javac關閉代碼生成?
- 28. 有沒有辦法在C#中的WinForms或WPF的3D遊戲?
- 29. 有沒有辦法在代碼
- 30. 遊戲不能啓動,看到黑屏