HLSL のオフラインコンパイル時に気をつけること。


オフラインコンパイルして、なんのエラーもなく.csoファイル（コンパイル済みシェーダー）が出力されたのに、それを使おうとしたら、
シェーダーオブジェクト作成時にエラーが出る・・・なぜだ(´・ω・`)

###fxcのエラーメッセージにパラメーターの使い方が出てきた。###

Strictness and compatibility mode are mutually exclusive:
1>  For DX9 compatibility mode, use /Gec
1>  For regular DX10 shaders and effects, use regular mode (do not specify /Gec or /Ges)
1>  For clean future-proof DX10 shaders and effects, use strict mode (/Ges)

DX9互換モードを指定する場合は、/Gec を記述する。
DX10用のシェーダーを作成する場合は /Gec または /Ges を記述しない。
DX10以降に対応するシェーダーを作成する場合は、strict mode( /Ges ) を記述する。

fxcに与えるオプション。
DX9  /Gec
DX10 /Gec /Ges を記述しない
DX11 /Ges



##fxc.exeのバージョンを確認する##
製品バージョン：6.3.9600.16384
"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\fxc.exe"
"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\fxc.exe"
"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\d3dcompiler_47.dll"
"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\d3dcompiler_47.dll"


製品バージョン：9.30.9200.16384
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\fxc.exe"
"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\fxc.exe"
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\d3dcompiler_46.dll"
"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\d3dcompiler_46.dll"

製品バージョン：9.29.952.3111
"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64\fxc.exe"
"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x86\fxc.exe"
"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Redist\Jun2010_D3DCompiler_43_x64.cab" D3DCompiler_43.dll
"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Redist\Jun2010_D3DCompiler_43_x86.cab" D3DCompiler_43.dll

###結論###
win7 上で vs2013 を利用し、DirectX SDK (June 2010) のAPIで何も考えずに開発すると、
オフラインコンパイラのバージョンと、ランタイムのバージョンが異なり、エラーが発生します。
お気を付け下さい。

##その他の確認##
1.最適化を無効にする/Od オプションを付ける
2.フロー制御コンストラクトを優先する /Gfp オプションをつける
3.D3DDisassembleを利用してすべての.cso(コンパイル済みシェーダー)を確認する。CreateXXXShaderがエラーを履くときはこのAPIもうまく機能していない感じがする。
4.動く場合の.csoと動かない場合の.csoをバイナリで比較する。
5.シェーダーコードのフォーマット仕様に関する資料を発見。http://msdn.microsoft.com/en-us/library/ff552891(v=vs.85).aspx

###参照###
日本語 http://msdn.microsoft.com/ja-jp/library/bb509709(v=vs.85).aspx
英語   http://msdn.microsoft.com/en-us/library/windows/desktop/bb509709(v=vs.85).aspx

##fxc.exeに渡すオプションの違いでどれだけ結果が変わるの？？##

こんなコードで試してみたいと思います。

```hlsl:vs-000.hlsl

struct InputVS
{
	float4	pos			: POSITION;
};

struct OutputVS
{
	float4	pos			: SV_POSITION;
	float4	color		: COLOR0;
};

cbuffer cbSceneParam : register( b0 )
{
	matrix <float, 4, 4> c_mat_WVP;
};

OutputVS main( InputVS input )
{
	OutputVS	output;

    output.pos   =  mul( input.pos, c_mat_WVP );
    output.color =  float4(0,1.0,0,1.0);;

	return output;
}

```

### /Od /Gfp ###


<pre><body bgcolor="#000000"><font color = "#a0a0a0">//
// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
//
//
// Buffer Definitions: 
//
// cbuffer cbSceneParam
// {
//
//   float4x4 c_mat_WVP;                // Offset:    0 Size:    64
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// cbSceneParam                      cbuffer      NA          NA    0        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue Format   Used
// -------------------- ----- ------ -------- -------- ------ ------
// POSITION                 0   xyzw        0     NONE  float   xyzw
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue Format   Used
// -------------------- ----- ------ -------- -------- ------ ------
// SV_POSITION              0   xyzw        0      POS  float   xyzw
// COLOR                    0   xyzw        1     NONE  float   xyzw
//
</font><font color = "#e0e0e0">vs_5_0
      <font color = "#ffff40">dcl_globalFlags</font> refactoringAllowed
      <font color = "#ffff40">dcl_constantbuffer</font> cb0[4], immediateIndexed
      <font color = "#ffff40">dcl_input</font> v0.xyzw
      <font color = "#ffff40">dcl_output_siv</font> o0.xyzw, position
      <font color = "#ffff40">dcl_output</font> o1.xyzw
      <font color = "#ffff40">dcl_temps</font> 2
<font color = "#e0e0e0">   0: </font><font color = "#ffff40">dp4</font> r0.x, v0.xyzw, cb0[0].xyzw
<font color = "#e0e0e0">   1: </font><font color = "#ffff40">dp4</font> r0.y, v0.xyzw, cb0[1].xyzw
<font color = "#e0e0e0">   2: </font><font color = "#ffff40">dp4</font> r0.z, v0.xyzw, cb0[2].xyzw
<font color = "#e0e0e0">   3: </font><font color = "#ffff40">dp4</font> r0.w, v0.xyzw, cb0[3].xyzw
<font color = "#e0e0e0">   4: </font><font color = "#ffff40">itof</font> r1.xz, l<font color = "#00ffff">(0, 0, 0, 0)</font>
<font color = "#e0e0e0">   5: </font><font color = "#ffff40">mov</font> r1.yw, l<font color = "#00ffff">(0,1.000000,0,1.000000)</font>
<font color = "#e0e0e0">   6: </font><font color = "#ffff40">mov</font> o0.xyzw, r0.xyzw
<font color = "#e0e0e0">   7: </font><font color = "#ffff40">mov</font> o1.xyzw, r1.xyzw
<font color = "#e0e0e0">   8: </font><font color = "#ffff40">ret</font> 
</font><font color = "#a0a0a0">// Approximately 9 instruction slots used
</font></pre>


### /Gfp ###

<pre><body bgcolor="#000000"><font color = "#a0a0a0">//
// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
//
//
// Buffer Definitions: 
//
// cbuffer cbSceneParam
// {
//
//   float4x4 c_mat_WVP;                // Offset:    0 Size:    64
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// cbSceneParam                      cbuffer      NA          NA    0        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue Format   Used
// -------------------- ----- ------ -------- -------- ------ ------
// POSITION                 0   xyzw        0     NONE  float   xyzw
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue Format   Used
// -------------------- ----- ------ -------- -------- ------ ------
// SV_POSITION              0   xyzw        0      POS  float   xyzw
// COLOR                    0   xyzw        1     NONE  float   xyzw
//
</font><font color = "#e0e0e0">vs_5_0
      <font color = "#ffff40">dcl_globalFlags</font> refactoringAllowed
      <font color = "#ffff40">dcl_constantbuffer</font> cb0[4], immediateIndexed
      <font color = "#ffff40">dcl_input</font> v0.xyzw
      <font color = "#ffff40">dcl_output_siv</font> o0.xyzw, position
      <font color = "#ffff40">dcl_output</font> o1.xyzw
<font color = "#e0e0e0">   0: </font><font color = "#ffff40">dp4</font> o0.x, v0.xyzw, cb0[0].xyzw
<font color = "#e0e0e0">   1: </font><font color = "#ffff40">dp4</font> o0.y, v0.xyzw, cb0[1].xyzw
<font color = "#e0e0e0">   2: </font><font color = "#ffff40">dp4</font> o0.z, v0.xyzw, cb0[2].xyzw
<font color = "#e0e0e0">   3: </font><font color = "#ffff40">dp4</font> o0.w, v0.xyzw, cb0[3].xyzw
<font color = "#e0e0e0">   4: </font><font color = "#ffff40">mov</font> o1.xyzw, l<font color = "#00ffff">(0,1.000000,0,1.000000)</font>
<font color = "#e0e0e0">   5: </font><font color = "#ffff40">ret</font> 
</font><font color = "#a0a0a0">// Approximately 6 instruction slots used
</font></pre>