ID3D10Effect
COM公式ドキュメント
ID3D10Effect インターフェイスは、レンダリングエフェクトを実装するための状態オブジェクト、リソース、シェーダーのセットを管理します。
解説(Remarks)
エフェクトは D3D10CreateEffectFromMemory を呼び出して作成します。
エフェクトシステムは、レンダリングに必要な情報をエフェクトとしてまとめます。エフェクトには次のものが含まれます。状態変更をグループ単位で割り当てるための状態オブジェクト、入力データを供給し出力データを格納するためのリソース、そしてレンダリングの方法を制御するプログラム(シェーダーと呼ばれます)です。詳細については、Effects (Direct3D 10) を参照してください。
ID3D10Effect オブジェクトに対して QueryInterface を呼び出して IUnknown インターフェイスを取得しようとすると、QueryInterface は E_NOINTERFACE を返します。この問題を回避するには、次のコードを使用してください。
IUnknown* pIUnknown = (IUnknown*)pEffect;
pIUnknown->AddRef();
メソッド 13
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
エフェクトが有効な構文を含んでいるかどうかをテストします。
戻り値
型: BOOL
コードの構文が有効な場合は TRUE、それ以外の場合は FALSE。
エフェクトがメモリプールの一部であるかどうかをテストします。
戻り値
型: BOOL
エフェクトがプールされている場合は TRUE、それ以外の場合は FALSE。ID3D10EffectPool インターフェイス を参照してください。
エフェクトを作成したデバイスを取得します。
| ppDevice | ID3D10Device** | out | ID3D10Device インターフェイス へのポインター。 |
戻り値
型: HRESULT
次の Direct3D 10 リターンコード のいずれかを返します。
解説(Remarks)
エフェクトは、D3DX10CreateEffectFromFile などの関数を呼び出すことで、特定のデバイスに対して作成されます。
エフェクトの記述を取得します。
| pDesc | D3D10_EFFECT_DESC* | out | エフェクトの記述へのポインター(D3D10_EFFECT_DESC を参照)。 |
戻り値
型: HRESULT
次の Direct3D 10 リターンコード のいずれかを返します。
解説(Remarks)
エフェクトの記述には、そのエフェクトに含まれるテクニックや、必要とする定数バッファーリソースなど、エフェクトに関する基本的な情報が含まれます。
ID3D10Effect::GetConstantBufferByIndex (d3d10effect.h) メソッドは、インデックスによって定数バッファーを取得します。
| Index | DWORD | in | 0 から始まるインデックス。 |
戻り値
解説(Remarks)
アプリケーションによって読み書きされる変数を含むエフェクトには、少なくとも 1 つの定数バッファーが必要です。パフォーマンスを最大化するには、更新頻度に基づいて変数を 1 つ以上の定数バッファーに整理する必要があります。
名前によって定数バッファーを取得します。(ID3D10Effect.GetConstantBufferByName)
| Name | LPSTR | in | 定数バッファーの名前。 |
戻り値
型: ID3D10EffectConstantBuffer*
Name で指定された定数バッファーへのポインター。ID3D10EffectConstantBuffer を参照してください。
解説(Remarks)
アプリケーションによって読み書きされる変数を含むエフェクトには、少なくとも 1 つの定数バッファーが必要です。パフォーマンスを最大化するには、更新頻度に基づいて変数を 1 つ以上の定数バッファーに整理する必要があります。
インデックスによって変数を取得します。
| Index | DWORD | in | 0 から始まるインデックス。 |
戻り値
ID3D10EffectVariable インターフェイス へのポインター。
解説(Remarks)
エフェクトには 1 つ以上の変数を含めることができます。テクニックの外側にある変数はすべてのエフェクトに対してグローバルとみなされ、テクニックの内側にある変数はそのテクニックに対してローカルになります。ローカルな非 static のエフェクト変数には、名前またはインデックスを使用してアクセスできます。
このメソッドは、変数が見つからない場合でも エフェクト変数インターフェイス へのポインターを返します。ID3D10Effect::IsValid を呼び出すことで、そのインデックスが存在するかどうかを確認できます。
名前によって変数を取得します。
| Name | LPSTR | in | 変数の名前。 |
戻り値
ID3D10EffectVariable インターフェイス へのポインター。
解説(Remarks)
エフェクトには 1 つ以上の変数を含めることができます。テクニックの外側にある変数はすべてのエフェクトに対してグローバルとみなされ、テクニックの内側にある変数はそのテクニックに対してローカルになります。エフェクト変数には、名前またはインデックスを使用してアクセスできます。
このメソッドは、変数が見つからない場合でも エフェクト変数インターフェイス へのポインターを返します。ID3D10Effect::IsValid を呼び出すことで、その名前が存在するかどうかを確認できます。
セマンティックによって変数を取得します。
| Semantic | LPSTR | in | セマンティック名。 |
戻り値
Semantic で指定されたエフェクト変数へのポインター。ID3D10EffectVariable インターフェイス を参照してください。
解説(Remarks)
各エフェクト変数には、ユーザー定義のメタデータ文字列であるセマンティックを付加できます。一部の システム値セマンティック は、パイプラインステージの組み込み機能をトリガーする予約語です。
このメソッドは、変数が見つからない場合でも エフェクト変数インターフェイス へのポインターを返します。ID3D10Effect::IsValid を呼び出すことで、そのセマンティックが存在するかどうかを確認できます。
インデックスによってテクニックを取得します。
| Index | DWORD | in | 0 から始まるインデックス。 |
戻り値
ID3D10EffectTechnique インターフェイス へのポインター。
解説(Remarks)
エフェクトには 1 つ以上のテクニックが含まれ、各テクニックには 1 つ以上のパスが含まれます。テクニックには、名前またはインデックスを使用してアクセスできます。 テクニックの詳細については、テクニックとパス を参照してください。
名前によってテクニックを取得します。
| Name | LPSTR | in | テクニックの名前。 |
戻り値
ID3D10EffectTechnique インターフェイス へのポインター。テクニックが見つからない場合は NULL。
解説(Remarks)
エフェクトには 1 つ以上のテクニックが含まれ、各テクニックには 1 つ以上のパスが含まれます。テクニックには、名前またはインデックスを使用してアクセスできます。テクニックの詳細については、テクニックとパス を参照してください。
エフェクトに必要なメモリ量を最小化します。
戻り値
型: HRESULT
次の Direct3D 10 リターンコード のいずれかを返します。
解説(Remarks)
エフェクトは、メモリ領域を 2 通りの方法で使用します。1 つはランタイムがエフェクトを実行するために必要な情報を格納するため、もう 1 つは API を使ってアプリケーションに情報を反映(リフレクション)するために必要なメタデータを格納するためです。ID3D10Effect::Optimize を呼び出すと、リフレクションメタデータをメモリから削除でき、エフェクトに必要なメモリ量を最小化できます。ただし、リフレクションデータが削除されると、変数を読み取る API メソッドは動作しなくなります。
エフェクトに対して Optimize を呼び出した後は、次のメソッドは失敗します。
ID3D10Effect::Optimize を呼び出す前にこれらのメソッドで取得した参照は、ID3D10Effect::Optimize の呼び出し後も引き続き有効であることに注意してください。これにより、アプリケーションは使用するすべての変数、テクニック、パスを取得してから Optimize を呼び出し、その後エフェクトを使用できます。エフェクトのリフレクションメタデータがメモリから削除されているかどうかをテストします。
戻り値
型: BOOL
エフェクトが最適化されている場合は TRUE、それ以外の場合は FALSE。
解説(Remarks)
エフェクトは、メモリ領域を 2 通りの方法で使用します。1 つはランタイムがエフェクトを実行するために必要な情報を格納するため、もう 1 つは API を使ってアプリケーションに情報を反映(リフレクション)するために必要なメタデータを格納するためです。ID3D10Effect::Optimize を呼び出すと、リフレクションメタデータをメモリから削除でき、エフェクトに必要なメモリ量を最小化できます。もちろん、リフレクションデータが削除されると、変数を読み取る API メソッドは動作しなくなります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D10Effect "{51B0CA8B-EC0B-4519-870D-8EE1CB5017C7}" #usecom global ID3D10Effect IID_ID3D10Effect "{}" #comfunc global ID3D10Effect_IsValid 3 #comfunc global ID3D10Effect_IsPool 4 #comfunc global ID3D10Effect_GetDevice 5 sptr #comfunc global ID3D10Effect_GetDesc 6 var #comfunc global ID3D10Effect_GetConstantBufferByIndex 7 int #comfunc global ID3D10Effect_GetConstantBufferByName 8 str #comfunc global ID3D10Effect_GetVariableByIndex 9 int #comfunc global ID3D10Effect_GetVariableByName 10 str #comfunc global ID3D10Effect_GetVariableBySemantic 11 str #comfunc global ID3D10Effect_GetTechniqueByIndex 12 int #comfunc global ID3D10Effect_GetTechniqueByName 13 str #comfunc global ID3D10Effect_Optimize 14 #comfunc global ID3D10Effect_IsOptimized 15 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D10Effect "{51B0CA8B-EC0B-4519-870D-8EE1CB5017C7}" #usecom global ID3D10Effect IID_ID3D10Effect "{}" #comfunc global ID3D10Effect_IsValid 3 #comfunc global ID3D10Effect_IsPool 4 #comfunc global ID3D10Effect_GetDevice 5 sptr #comfunc global ID3D10Effect_GetDesc 6 sptr #comfunc global ID3D10Effect_GetConstantBufferByIndex 7 int #comfunc global ID3D10Effect_GetConstantBufferByName 8 str #comfunc global ID3D10Effect_GetVariableByIndex 9 int #comfunc global ID3D10Effect_GetVariableByName 10 str #comfunc global ID3D10Effect_GetVariableBySemantic 11 str #comfunc global ID3D10Effect_GetTechniqueByIndex 12 int #comfunc global ID3D10Effect_GetTechniqueByName 13 str #comfunc global ID3D10Effect_Optimize 14 #comfunc global ID3D10Effect_IsOptimized 15 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。