ハンドル (Direct3D 9)

ハンドルは、 ID3DXEffectCompiler または ID3DXEffect を使用して、手法、パス、注釈、およびパラメーターを参照するための効率的な手段 提供します。 They are generated dynamically when you call functions of the form Get[Parameter|注釈|関数|テクニック|Pass][ByName|BySemantic|要素]。

プログラムの実行中に、同じオブジェクトへのハンドルを複数回生成すると、毎回同じハンドルが返されます。 ただし、プログラムを複数回実行する場合は、ハンドルを一定に保つ必要はありません。 また、ID3DXEffect と ID3DXEffectCompiler異なるインスタンスによって生成されるハンドルは異なることがあります。

ヘッダー ファイルを表示すると、ハンドル (D3DXHANDLE) が技術的には文字列ポインターであることがわかります。

GetParameter[ByName| ] などの関数に渡すハンドル要素|BySemantic] または GetAnnotation[ByName] は、次の 3 つの形式で指定できます。

  1. Handles that were returned by functions such as GetParameter[ByName|要素|BySemantic]。
  2. MyVariableName、MyTechniqueName、MyArray[0] などの文字列。
  3. Handle = NULL。 4 つのケースがあります。
    • メソッドの戻り値の場合、メソッドはハンドルを見つけることができませんでした。
    • GetParameter[ByName| ] の最初のパラメーターとして NULL ハンドルが渡された場合要素|BySemantic]、 関数は最上位レベルのパラメーターを返します。 逆に、ハンドルが NULL 以外の場合、関数はハンドルによって識別される構造体メンバーまたは要素を返します。
    • ValidateTechnique の最初の引数または IsParameterUsed の 2 番目の引数として NULL ハンドルが渡された場合、現在の手法が検証されます。
    • FindNextValidTechnique の最初の引数として NULL ハンドルが渡された場合、有効な手法の検索は、効果の最初の手法から開始されます。

パフォーマンスヒント アプリケーションの開始時に、初期化パスを実行して文字列からハンドルを生成します。 その時点から、ハンドルのみを使用します。 生成されたハンドルの代わりに文字列を渡す方が遅くなります。

Get[Parameter| を使用する例をいくつか次に示します。注釈|関数|テクニック|Pass][ByName|BySemantic|要素] ハンドルを生成する関数。

// Gets handle of second top-level parameter handle in the effect file
h1 = GetParameter(NULL, 1);    

// Gets handle of the third struct member of MyStruct
h2 = GetParameter("MyStruct", 2); 

// Gets handle of the third array element handle of MyArray
h3 = GetParameterElement("MyArray", 2); 

// Gets handle of first member of h1 (that is, the second top-level param)
h4 = GetParameter(h1, 0);    

// Gets handle of MyStruct.Data
h5 = GetParameterByName("MyStruct", "Data");    
// or 
h6 = GetParameterByName(NULL, "MyStruct.Data");    

// Gets handle of MyStruct.Data.SubData
h7 = GetParameterByName("MyStruct.Data", "SubData"); 
// or 
h8 = GetParameterByName(NULL, "MyStruct.Data.SubData");

// Gets handle of fifth annotation of h1 (that is, second top-level param)
h9 = GetAnnotation(h1, 4);    

// Gets handle of MyStruct's annotation, called Author
h10 = GetAnnotationByName("MyStruct", "Author");  
// or
h11 = GetParameterByName(NULL, "MyStruct@Author"); 

効果の形式