データ バインド
SasHostParameterValue コレクション を使用して、エフェクトに公開するホスト アプリケーションの値、型、メンバーのコレクションを定義します。エフェクト ファイルで SasBindAddress アノテーションを使用して、エフェクト パラメーターをホスト アプリケーションの対応するパラメーターに割り当てます。
SasHostParameterValue コレクション
SasHostParameterValue は、エフェクト ファイル (.fx) の構文を使用して定義します。この構文はエフェクト ファイルの構文と似ていますが、異なる点もいくつかあります。たとえば、texture2d、サンプラー、文字列などのオブジェクト タイプは、実際のエフェクト ファイルでは無効ですが、SasHostParameterValue では有効です。ホスト アプリケーションは、以下の説明に適合していれば、何らかの方法で SasHostParameterValue を実装できます。実際の定義は、DXSAS 標準エフェクト インクルード ファイルにあります ([SDK ルート]/Utilities/Source/Sas/Sas.fxh)。
ライトやカメラなどの SasHostParameterValue の配列には、長さに制限がありません。つまり、エフェクトはこれらの配列の任意のインデックスにバインドできるので、アプリケーションの値を取得できない場合、ホスト アプリケーションは有効な既定値を指定する必要があります。
一部の型および定数は、標準インクルードの定義に示されているように、DXSAS 標準インクルードで定義されている必要があります。これにより、エフェクトは SasHostParameterValue からの集計値を簡単に構造化されたエフェクト パラメーターにバインドすることができます。
SasHostParameterValue コレクション | 型 | メンバー |
---|---|---|
Time | float | Sas.Time.Now |
float | Sas.Time.Last | |
int | Sas.Time.FrameNumber | |
環境マップ | textureCUBE | Sas.EnvironmentMap |
Camera | SasCamera | Sas.Camera |
float4x4 | Sas.Camera.WorldToView | |
float4x4 | Sas.Camera.Projection | |
float2 | Sas.Camera.NearFarClipping | |
Light | SasAmbientLight | AmbientLight[ZeroOrMore]; |
int | Sas.NumAmbientLights | |
SasAmbientLight | DirectionalLight[ZeroOrMore]; | |
int | Sas.NumDirectionalLights | |
SasAmbientLight | PointLight[ZeroOrMore]; | |
int | Sas.NumPointLights | |
SasAmbientLight | SpotLight[ZeroOrMore]; | |
int | Sas.NumSpotLights | |
Shadow | float4x4 | Sas.Shadow[ZeroOrMore].WorldToShadow |
texture2D | Sas.Shadow[ZeroOrMore].ShadowMap | |
Skeleton | float4x4 | Sas.Skeleton.MeshToJointToWorld[OneOrMore] |
int | Sas.Skeleton.NumJoints |
Time
ホスト アプリケーションの仮想クロックまたは時間の値です。次のようなメンバーがあります。
- Sas.Time.Now - エフェクトがレンダリングされる時点のホスト アプリケーションの仮想クロックの値です。
- Sas.Time.Last - 前回のレンダリング時の Now の値です。
- Sas.Time.FrameNumber - フレームのレンダリングごとに 1 つインクリメントするカウンター値です。
これらのメンバーの値は、きわめて長時間実行されるとラップ アラウンドする可能性があるので、エフェクトではこの問題を正しく対処する必要があります。Now と Last には大きな値が入る場合があります。
環境マップ
キューブ環境マップです。エフェクトを Sas.EnvironmentMap とバインドする場合、ホスト アプリケーションは有効なキューブ テクスチャーを提供する必要があります。
Camera
現在レンダリングされているカメラです。次のようなメンバーがあります。
- Sas.Camera.WorldToView - カメラの複合的なワールドビュー行列です。
- Sas.Camera.Projection - カメラの射影行列です。
- Sas.Camera.NearFarClipping - 前方クリップ面と後方クリップ面の値です。
Light
1 つまたは複数のシーンのライトです。ライトのコレクションを配列として次のように宣言します。
- Color - RGB カラーです。既定値は、(0,0,0) です。
- Direction - ライトの方向です。既定値は、(0,0,0) です。
- Range - 光線がシーンに影響しなくなるライトからの距離です。既定値は 0 です。
- Theta - スポット ライトのコーンの内部角度です (ラジアン単位)。既定値は 0 です。
- Phi - スポット ライトのコーンの外部角度です (ラジアン単位)。既定値は 0 です。
ライトの数は、関連付けられた配列にバインドされたライトの数に設定する必要があります。エフェクトはライトの数を無視してライトの配列のいずれかの要素にバインドすることができます。そのためホスト アプリケーションでは、配列のライトの数を超えた要素でも有効にバインドできるようにする必要があります。
ZeroOrMore は、配列に任意の要素数を指定できることを意味します。
Shadow
次の要素で構成されるシャドウ バッファーです。
- WorldToShadow - 行列の配列です。
- ShadowMap - 2D テクスチャー ファイルです。
ZeroOrMore は、配列に任意の要素数を指定できることを意味します (0 は空の配列を意味します)。
エフェクトでは、次のようにサンプラーを宣言します。
texture2D Shadow
<
string SasBindAddress = "Sas.Shadow[0].ShadowMap";
>;
sampler ShadowSampler = shadow_sampler(Shadow);
Skeleton
現在レンダリングされているオブジェクトを構成するフレームのセットです。フレームには、ボーンやトランスフォームなどがあります。次が表示されます。
- MeshToJointToWorld - 行列の配列です。
- NumJoints - 骨組みのジョイントの数です。
OneOrMore は、配列に 1 つまたは複数の数の要素を指定できることを意味します。
定義では、同じ SasHostParameterValue コレクション の一連の値を使用し、異なる変換を適用することでリジッド メッシュとスキン メッシュの両方がサポートされます。
SasBindAddress
このアノテーションをエフェクト ファイルの一番上に追加することで、エフェクト パラメーターとそれに対応する SasHostParameterValue コレクション で定義されたパラメーターを関連付けます。アノテーションは、次のように宣言します。
string SasBindAddress = "SasHostParameterValue";
次の例では、エフェクト ワールド行列を MeshToJointToWorld 行列にバインドしています。
float4x3 World
<
string SasBindAddress = "Sas.Skeleton.MeshToJointToWorld[0]";
>;
このアノテーションは、MeshToJointToWorld 行列のデータを使用してエフェクト ワールド行列の値を設定する必要があることをホスト アプリケーションに通知します。
バインド アドレス アノテーション構文は、エフェクト パラメーターを取得および設定するために ID3DXEffect で使用される構文と同様に定義されています。DXSAS の文法と ID3DXEffect メソッドとの唯一の違いは、アスタリスク インデックス トークンが追加されていることです。次に、アスタリスク インデックスを使用した別の例を示します。
float3 LightColors[6]
<
string SasBindAddress = "Sas.Light[*].Color";
>;
このアスタリスク インデックス トークンは、特定のホスト環境値配列 (この場合は色) のすべての要素を関連付けられたパラメーターにバインドする必要があることを示します。複数のアスタリスク インデックス トークンを使用することにより、構造体全体にバインドすることなく、エフェクトを構造体の配列のサブ要素にバインドすることができます。この例では、ライトの最初の 6 色の値をエフェクト パラメーターにバインドしています。