SasHostParameterValue Collection を使用して、ホスト アプリケーション値のコレクション、および効果に公開される型とメンバーを定義します。 効果ファイルで 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 |
| カメラ | SasCamera | Sas.Camera |
| float4x4 | Sas.Camera.WorldToView | |
| float4x4 | Sas.Camera.Projection | |
| float2 | Sas.Camera.NearFarClipping | |
| "ライト" | 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 | |
| スケルトン | float4x4 | Sas.Skeleton.MeshToJointToWorld[OneOrMore] |
| INT | Sas.Skeleton.NumJoints |
Time
ホスト アプリケーションの仮想クロックまたは時刻値。 メンバーには次のものが含まれます。
- Sas.Time.Now - 効果がレンダリングされる時点でのホスト アプリケーション仮想クロックの値。
- Sas.Time.Last - 前のレンダリングでの Now の値。
- Sas.Time.FrameNumber - レンダリングされたフレームごとに 1 回インクリメントされるカウンター値。
効果は、これらのメンバーの値が非常に長い実行時間中に折り返される可能性があるという事実を適切に処理する必要があります。 Now と Last には非常に大きな値が含まれる場合があります。
環境マップ
3 次環境マップ。 効果が Sas.EnvironmentMap にバインドしようとする場合、ホスト アプリケーションは有効なキューブ テクスチャを提供する必要があります。
カメラ
現在レンダリング中のカメラ。 メンバーには次のものが含まれます。
- Sas.Camera.WorldToView - カメラの複合ワールド ビュー マトリックス。
- Sas.Camera.Projection - カメラのプロジェクション マトリックス。
- Sas.Camera.NearFarClipping - ニアクリッピングプレーンとファークリッピングプレーンの値。
白
1 つ以上のシーン ライト。 ライトのコレクションは、次のような配列として宣言されます。
- 色 - RGB 色。 既定値は (0,0,0) です。
- 方向 - 光の方向。 既定値は (0,0,0) です。
- 範囲 - 光線がシーンに影響を及ぼす光からの距離。 既定値は 0 です。
- Theta - スポットライトの内部円錐角度をラジアン単位で測定します。 既定値は 0 です。
- Phi - スポットライトの外円錐角度をラジアン単位で測定します。 既定値は 0 です。
ライトの数は、関連付けられた配列にバインドされたライトの数に設定する必要があります。 効果はライトの数を無視し、いずれかのライト配列の任意の要素にバインドすることを選択できます。 したがって、ホスト アプリケーションは、配列内のライトの数を超える要素に対して有効なバインディングを提供する必要があります。
ZeroOrMore は、配列に任意の数の要素を含めることができます。
シャドウ
シャドウ バッファーは次のもので構成されます。
- WorldToShadow - 行列の配列。
- ShadowMap - 2D テクスチャ ファイル。
ZeroOrMore は、配列に任意の数の要素を含めることができます (0 は空の配列を意味します)。
効果は、次のようにサンプラーを宣言します。
texture2D Shadow
<
string SasBindAddress = "Sas.Shadow[0].ShadowMap";
>;
sampler ShadowSampler = shadow_sampler(Shadow);
スケルトン
現在レンダリングされているオブジェクトを構成するフレームのセット。 フレームの例は、ボーンと変換です。 これには次のものが含まれます
- MeshToJointToWorld - 行列の配列。
- NumJoints - スケルトン内のジョイントの数。
OneOrMore は、配列に少なくとも 1 つの要素があり、任意の数の要素を含む可能性があることを意味します。
定義では、同じ SasHostParameterValue Collection 値のセットを使用して、異なる解釈を使用して、剛体メッシュ オブジェクトとスキン メッシュ オブジェクトの両方をサポートします。
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 つのライトの色の値を効果パラメーターにバインドします。
関連トピック