コンパイル済みシェーダを作る(HLSL/Fx)
About
DirectXやXNAで用いられるシェーダ(Effect)ファイルは通常「.fx」ファイルで、HLSLで記述されている。実際に配布する場合や、他の共同開発者に操作されたくない場合、HLSLで書かれた「.fxファイル」のまま配布するのは宜しくない。そこでプリコンパイルしたシェーダ(Effect)ファイルを作製する。DirectXSDKに含まれるコンパイラを利用するので、XNAで使う場合やWPFで使う場合は別途インストールする必要がある。
シェーダコンパイラ「fxc.exe」
DirectXSDKのユーティリティを利用することになる。場所は「¥Microsoft DirectX SDK (June 2010)¥Utilities¥bin¥」にある。その階層下には「¥x86」ないし「¥x64」があるがリリースするバージョンに合わせて選択する。そのOS別ディレクトリの下に「fxc.exe」実行ファイルがあって、それがシェーダのオフラインコンパイラになっている。
- 通常Cドライブに保存するハズなので、具体的には次のパスになるはず。
- C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x86
- C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64
How to
コマンドプロンプトからコマンド形式で実行するようになっている。とりあえず「fxc.exe」が実行できるようにする。「fec.exe」のあるディレクトリまで移動しても良いし、環境変数を設定しても良い。実際にはVisualStudioなどから自動化することが殆どのハズなので、現状では実行ファイルのあるディレクトリまで移動した方が良い。入力フォーマットは基本的には次の様に定義されている。
任意パス\fxc.exe コンパイル前ファイルパス.fx /T プロファイル /Fo コンパイル後ファイルパス
- コンパイル前ファイル
- :これからコンパイルするシェーダ(Effect)ファイルのフルパス。
- プロファイル(コンパイルの種類)
- :任意のシェーダとしてコンパイルすることができる。後述。
- コンパイル後ファイル
- :コンパイル結果として生成されるファイルの出力先のフルパス。
「/T」や「/Fo」の記述(半角スペースも含む)は必要であるので注意すること。
ターゲットプロファイル
入出力ファイルのパスに関しては今さらになるので解説を割愛。ターゲットプロファイルとは、"どの形式のシェーダファイル(Shader Type)として出力するかを決定するパラメータ"となっている。例えばPixelShader(ピクセルシェーダ)のバージョン2.0として出力する場合は「ps_2_0」などを選択することになる。見た通り、アルファベットに続く文字列は、バージョンを示している。
Shader Type | Profiles |
Vertex Shader | vs_1_1,vs_2_0,vs_2_a,vs_2_sw,vs_3_0,vs_3_sw,vs_4_0,vs_4_1 |
Pixel Shader | ps_2_0,ps_2_a,ps_2_b,ps_2_sw,ps_3_0,ps_3_sw,ps_4_0,ps_4_1 |
Texture Shader | tx_1_0 |
Geometry Shader | gs_4_0,gs_4_1 |
Effect | fx_2_0, fx_4_0,fx_4_1 |
ターゲットプロファイルにPixelShaderやVertexShader(頂点シェーダ)を指定する場合はコンパイラなどが「main関数(EntryPoint)」を探す点に注意する必要がある。Technique構文を利用しているシェーダを使い回すつもりでPixelShaderとしてコンパイルする場合などに、「main関数」が存在しない、というエラーが返る。
文字コードの制限
HLSLをプリコンパイルする場合には、文字コードを所定のものに変更しておく必要がある。HLSL(fxc.exe)は普通、SiftJIS(SJIS)かASCIIで扱われるので、UTF-8などの場合はそちらに変更しておく。例えばVisualStudioでXNAプロジェクト以外のプロジェクトからEffectファイルとして「.fx」を新規に追加すると、そのファイルはUTF-8となっていて、コンパイルに失敗する。
- 文字コードによるエラーが生じている場合、次のようなエラーが表示される可能性がある。
- Illegal character in shader file
その他のオプション
その他のオプションは公式の方で確認されたい。詳しいわけではないし、解説しようとするときりがないのでここでは割愛する。
Example
簡単なサンプルは次の通り。簡単とはいえ、実際にはこの様な使い方以外は殆どしない。次の入力の場合、「fxc.exe」と同一階層のディレクトリに存在する「SampleEffect.fx」を「PixelShader 3.0」でコンパイルし、同一階層のディレクトリに「SampleEffect.ps」という名前で出力することになる。
パス省略\fxc SampleEffect.fx /T ps_3_0 /Fo SampleEffect.ps
もし入力ファイルや出力先を変更する場合には例えば「C:\Users\Desktop\Shaders/SampleEffect.fx」等、パスと一緒にファイルを指定する。