効果のコンパイル (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 );

Includes

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 つの競合する特性を指定していないと仮定して、これらのフラグを論理的に組み合わせることができます。 フラグの一覧については、「 Effect Constants (Direct3D 10)」を参照してください。

FX フラグ

これらのフラグは、コンパイル動作またはランタイム効果の動作を定義する効果を作成するときに使用されます。 フラグの一覧については、「 Effect Constants (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 のwatch ウィンドウの次のスクリーン ショットに示すように、コンパイラは次のエラーを返しました。

Visual Studio watch ウィンドウのスクリーン ショット

エラーは LPVOID ポインターで返されるため、watch ウィンドウの文字列にキャストします。

失敗したコンパイルからエラーを返すために使用されるコードを次に示します。

// 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
}

効果のレンダリング (Direct3D 10)