ハンドル
ハンドル
ハンドルは、ID3DXEffectCompiler または ID3DXEffect を使ってテクニック、パス、コメント、またはパラメータを参照するための効率的な手段を提供する。Get[Parameter|Annotation|Function|Technique|Pass][ByName|BySemantic|Element] 形式の関数を呼び出したときに動的に生成される。
プログラムの実行中に、同じオブジェクトに対するハンドルを複数回生成した場合は、毎回同じハンドルが返される。ただし、プログラムを複数回実行する場合は、ハンドルが必ずしも一定でないことに注意する必要がある。ID3DXEffect および ID3DXEffectCompiler の異なるインスタンスによって生成されたハンドルは同じでないことにも注意しなければならない。
ヘッダー ファイルを見ると、ハンドル (D3DXHANDLE) は技術的には文字列ポインタであることがわかる。「定数」を参照すること。
GetParameter[ByName|Element|BySemantic] や GetAnnotation[ByName] などの関数に渡すハンドルは、次の 3 つの形式をとる。
- GetParameter[ByName|Element|BySemantic] などの関数によって返されたハンドル。
MyVariableName
、MyTechniqueName
、MyArray[0]
などの文字列。- NULL。これには 4 つのケースがある。
- これがメソッドの戻り値の場合、メソッドはハンドルを見つけることができなかった。
- GetParameter[ByName|Element|BySemantic] の第 1 引数として NULL ハンドルが渡された場合、関数は最上位パラメータを返す。逆に、ハンドルが NULL でない場合、関数は、ハンドルによって識別される構造体のメンバまたは要素を返す。
- ValidateTechnique の第 1 引数または IsParameterUsed の第 2 引数として NULL ハンドルを渡すと、現在のテクニックの妥当性検査が行われる。
- FindNextValidTechnique の第 1 引数として NULL ハンドルを渡すと、有効なテクニックの検索がエフェクト内の最初のテクニックから開始される。
パフォーマンスに関するヒント アプリケーションの最初に、初期化パスを実行して文字列からハンドルを生成する。それ以降はハンドルだけを使う。生成されたハンドルではなく文字列を渡すと、処理が遅くなる。
例
ここでは、Get[Parameter|Annotation|Function|Technique|Pass][ByName|BySemantic|Element] 関数を使ってハンドルを生成する例を示す。
// 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 = GetParameter(NULL, "MyArray[2]"); // 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");