0

最近、シェーダーについて少し読んでいました。プログラムがアセンブリ コードであることを確認できるように、ゲームで使用されるシェーダー コードを取得する方法はありますか?

4

1 に答える 1

2

理論的にはこれを行うことができますが、実際には非常に複雑になる可能性があります。これをどのように行うかは、シェーダーがプログラムにどのように格納されているか、およびシェーダーがターゲットとするAPIとバージョン(DirectXシェーダー、OpenGLシェーダー、古い学校の頂点またはフラグメントプログラムなど)によって異なります。シェーダーを使用してからしばらく経ちましたので、この情報は少し古くなっている可能性があることに注意してください。

運が良ければ、シェーダーはバイナリのどこかに文字列として格納されます。趣味やチュートリアルゲームは、簡単にするためにこれを頻繁に行います。その場合は、16進エディターまたは同様のツールを使用してシェーダーコードを抽出できます。商用ゲームの場合、多くの理由から、バイナリ内に配置されている、痴漢されていないシェーダーソース文字列を見つけることはほとんどありません。

または、実行時にリンクされるDLLにシェーダーを格納することもできます。

おそらく何千もの異なるシェーダーが存在する商用ゲームでは、それらはどこかのリソースアーカイブに保存される可能性があります。それらがプレーンテキストであり、アーカイブを読み取るためのツールを持っている場合、あなたは金色です。

ほとんどのシェーダーAPIは、ソースをドライバーに渡す代わりに、コンパイルされたシェーダーの保存をサポートしていると思います。その場合、コンパイルされたシェーダーがリソースファイルで見つかる可能性がはるかに高くなります。これらは、おそらく実行時にメモリにロードされ、プロセスのアドレス空間のどこかにあります。場所がわかっている場合は、メモリスヌーピングツールを使用して、コンパイルされたシェーダーコードをコピーできます。ただし、住所を見つけて頑張ってください。

コンパイルされたバイナリを取得したら、なんらかの方法で分解する必要があります。DirectXにはAPIに分解が組み込まれていると思いますが、OpenGLはおそらく最近もそうしています。

私がGoogle検索で見つけた興味深い可能性の1つは、グラフィックカードをエミュレートすることでシェーダーを出力できるようになるnvemulateです。私はこれを使用したことがありません。おそらく、シェーダー機能のサブセットでのみ機能し、最近リモートで作成されたゲームでは非常に遅い速度でしか機能しません。それがあなたのグラフィックカードとどのように相互作用するか私もよくわかりません。

于 2012-12-05T23:57:07.993 に答える