効果をコンパイルする (Direct3D 10)
効果が作成されたら、まずコードをコンパイルして構文の問題を確認します。 これは、いずれかのコンパイル API (D3DX10CompileEffectFromFile、D3DX10CompileEffectFromResource、D3DX10CompileEffectFromMemory など) を呼び出すことによって行われます。 これらの API は、HLSL コードのコンパイルに使用されるコンパイラであるエフェクト コンパイラ fxc.exe を呼び出します。 このため、エフェクト内のコードの構文は HLSL コードとよく似ています (後で処理される例外がいくつかあります)。 ちなみに、エフェクト コンパイラ/hlsl コンパイラ (fxc.exe) は utilities フォルダー内の SDK 内にあり、選択した場合はシェーダー (またはエフェクト) をオフラインでコンパイルできます。 コマンド ラインからコンパイラを実行する方法については、ドキュメントを参照してください。
(BasicHLSL10 サンプルから) エフェクト ファイルをコンパイルする例を次に示します。
WCHAR str[MAX_PATH];
DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX10CompileEffectFromFile( str, NULL, NULL, "fx_4_0",
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&l_pBlob_Effect, &l_pBlob_Errors, NULL );
含む
1 つのパラメーターはインクルード インターフェイスです。 インクルード ファイルを読み取るときにカスタマイズされた動作を含める場合は、次のいずれかを生成します。 このカスタム動作は、(インクルード ポインターを使用する) 効果が作成されるたびに、または (インクルード ポインターを使用する) 効果がコンパイルされるたびに実行されます。 カスタマイズされたインクルード動作を実装するには、Include インターフェイスからクラスを派生させます。 これにより、クラスには、Open メソッドと Close メソッドの 2 つのメソッドが用意されています。 Open メソッドと Close メソッドでカスタム動作を実装します。
マクロ
効果のコンパイルは、他の場所で定義されているマクロへのポインターを取ることもできます。 たとえば、BasicHLSL10 の効果を変更して、0 と 1 の 2 つのマクロを使用したとします。 2 つのマクロを使用する効果コードを次に示します。
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
2 つのマクロの宣言を次に示します。
D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
マクロは NULL で終わるマクロの配列です。ここで、各マクロは D3D_SHADER_MACRO 構造体で定義されます。
最後に、コンパイル効果の呼び出しを変更して、マクロへのポインターを取得します。
D3DX10CreateEffectFromFile( str, Shader_Macros, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&g_pEffect10, NULL );
HLSL シェーダー フラグ
シェーダー フラグは、HLSL コンパイラに対するシェーダー制約を指定します。 これらのフラグは、シェーダー コンパイラによって生成される次のようなコードに影響します。
- サイズに関する考慮事項: コードを最適化します。
- デバッグに関する考慮事項: デバッグ情報を含む、フロー制御の防止。
- ハードウェアに関する考慮事項: コンパイル ターゲットと、シェーダーをレガシ ハードウェアで実行できるかどうか。
一般に、競合する 2 つの特性を指定していないと仮定して、これらのフラグを論理的に組み合わせることができます。 フラグの一覧については、「効果定数 (Direct3D 10)を参照してください。
FX フラグ
これらのフラグは、コンパイル動作またはランタイム効果の動作を定義する効果を作成するときに使用されます。 フラグの一覧については、「効果定数 (Direct3D 10)を参照してください。
エラーのチェック
コンパイル中にエラーが発生した場合、API はエフェクト コンパイラから返されたエラーを含むインターフェイスを返します。 このインターフェイスは ID3D10Blob と呼ばれます。 ただし、データ (文字列) を含むバッファーへのポインターを返すことで、コンパイル エラーが発生する可能性があります。
この例では、最初の変数宣言を 2 回コピーすることで、BasicHLSL.fx 効果にエラーが発生しました。
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
このエラーにより、Microsoft Visual Studio のウォッチ ウィンドウの次のスクリーン ショットに示すように、コンパイラは次のエラーを返しました。
Visual Studio ウォッチ ウィンドウの
エラーは LPVOID ポインターで返されるため、ウォッチ ウィンドウの文字列にキャストします。
失敗したコンパイルからエラーを返すために使用されるコードを次に示します。
// Read the D3DX effect file
WCHAR str[MAX_PATH];
ID3D10Blob* l_pBlob_Effect = NULL;
ID3D10Blob* l_pBlob_Errors = NULL;
hr = DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX10CompileEffectFromFile( str, NULL, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL,
&l_pBlob_Effect, &l_pBlob_Errors );
LPVOID l_pError = NULL;
if( l_pBlob_Errors )
{
l_pError = l_pBlob_Errors->GetBufferPointer();
// then cast to a char* to see it in the locals window
}
関連トピック