次の方法で共有


キャストと変換

ホスト アプリケーションとエフェクト パラメーター間で値を受け渡しする場合、(ホスト アプリケーションの) 元のデータ型と (エフェクト パラメーターの) 受け渡し先のデータ型が一致すると、データは想定どおりに書き込まれます。データ型が異なる場合、元のデータが受け渡し先に適合するようにキャストが発生します。

DXSAS では、次のような型変換規則が定義されています。これらは、エフェクト (.fx) と HLSL 型変換の規則を包含します。DXSAS では、ホスト アプリケーションからバインドされたパラメーターに変換する値に影響するパラメーター値修飾子も定義されています。

型キャスト

次の表は、あるデータ型から別のデータ型への変換時に発生するキャストを示します。

キャスト元の型 キャスト先の型 動作
float int ゼロに向かって丸めます (小数点以下を切り捨てます)。
float、int bool 0 (int) または 0.0 (float) との不等号比較に基づき、値が 0 でない場合は true、それ以外の場合は false と見なされます。
int float
bool int、float false は 0 に変換され、true は 1 に変換されます。
texture1D、texture2D、texture3D、textureCUBE texture キャスト先のテクスチャーは、キャスト元のテクスチャー型として処理されます。
string texture1D、texture2D、texture3D、textureCUBE 文字列値はリソースのアドレスとして処理され、パラメーター初期化アノテーションと同様に解決されます。リソースのアドレスが解決されない場合、キャストは無効となるので、ホスト アプリケーションはエラーを返す必要があります。リソースが正しく解決された場合、式の型は解決されたリソースと同じ型で処理されます。

クラス キャスト

DXSAS では、前述の型キャストに加えて、クラス型どうしの変換に必要なキャストの一連の規則も定義されています。列行列 (N × 1)、行行列 (1 × N)、および数値構造体はベクトルとして扱われます。

エフェクト行列のパラメーターおよび HLSL 行列の変数では、値が行優先か列優先の行列かを定義できますが、DirectX API では、D3DMATRIX および D3DXMATRIX は常に行優先として扱われます。

キャスト元のクラス キャスト先のクラス 動作
スカラー スカラー 型キャストを適用します。
スカラー ベクトル 型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト元のスカラーの値をキャスト先のベクトルの各要素に複製します。
スカラー 行列 型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト元のスカラーの値をキャスト先の行列の各要素に複製します。
スカラー オブジェクト 無効なキャストです。ホスト アプリケーションはエラーを返す必要があります。
スカラー 構造体 キャスト先の構造体の要素が数値のみの場合に有効です。有効な場合、型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト元のスカラーの値をキャスト先の構造体の各要素に複製します。
ベクトル スカラー 型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト先のスカラーはキャスト元ベクトルの最初の要素の値を受け取ります。
ベクトル ベクトル キャスト先ベクトルの要素がキャスト元ベクトルより多い場合、無効なキャストになります。型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト先ベクトルはキャスト元ベクトルの左側の値を受け取ります。キャスト元ベクトルの残りの右側の要素は、失われます。
ベクトル 行列 キャスト元ベクトルとキャスト先行列の要素数が同じでないと、無効なキャストになります。キャストが有効な場合、ベクトルからベクトルへのキャストと同じ動作が適用されます。
ベクトル オブジェクト 無効なキャストです。ホスト アプリケーションはエラーを返す必要があります。
ベクトル 構造体 キャスト先の構造体が数値の要素のみを持ち、その要素数がキャスト元ベクトルの要素数以下の場合のみ有効です。型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト先の構造体の要素は、キャスト元ベクトルの左側の要素から値を受け取ります。
行列 スカラー 型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト先のスカラーはキャスト元行列の左上の値を受け取ります。
行列 ベクトル キャスト元の行列とキャスト先のベクトルの要素数が同じでないと、無効なキャストになります。キャストが有効な場合、前述のベクトルからベクトルへのキャストと同じ動作が適用されます。
行列 行列 キャスト先の行列の要素がキャスト元の行列より多い場合、無効なキャストになります。型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト先の行列はキャスト元行列の左上の値を受け取ります。キャスト元行列の残りの右下の要素は、失われます。
行列 オブジェクト 無効なキャストです。ホスト アプリケーションはエラーを返す必要があります。
行列 構造体 構造体のサイズは行列のサイズと等しくなる必要があり、構造体のすべての要素は数値である必要があります。
オブジェクト スカラー 無効なキャストです。ホスト アプリケーションはエラーを返す必要があります。
オブジェクト ベクトル 無効なキャストです。ホスト アプリケーションはエラーを返す必要があります。
オブジェクト 行列 無効なキャストです。ホスト アプリケーションはエラーを返す必要があります。
オブジェクト オブジェクト 両方のオブジェクト タイプが等価であり、「型キャスト」で定義された動作に従っている場合のみ、有効です。
構造体 スカラー キャスト元の構造体に少なくとも 1 つの数値メンバーが格納されている場合、有効です。型キャストと、前述の「型キャスト」の変換動作を適用した後、キャスト先のスカラーはキャスト元構造体の最初の数値メンバーの値を受け取ります。
構造体 ベクトル キャスト元の構造体は、ベクトルのサイズ以上になる必要があります。最初の成分は、キャスト先ベクトルのサイズ以下の数値になる必要があります。
構造体 行列 キャスト元の構造体は、ベクトルのサイズ以上になる必要があります。最初の成分は、キャスト先ベクトルのサイズ以下の数値になる必要があります。
構造体 構造体 キャスト先の構造体は、キャスト元の構造体より大きくてはなりません。キャスト元とキャスト先のすべての成分の間に有効なキャストが存在している必要があります。

パラメーター値修飾子

パラメーター修飾子アノテーションにより、パラメーターのデータが正しく解釈されるように、付加的な情報をパラメーターに追加します。たとえば、ベクトルを正規化データで表し、長さをインチで測定することが必要な場合があります。パラメーター値修飾子のアノテーションによってこの追加情報を指定することにより、ホスト アプリケーションはデータをエフェクト パラメーターに渡すときに、正しく値を変換できます。

パラメーター修飾子は次のとおりです。

パラメーター値修飾子アノテーション 説明
SasNormalize ベクトルが正規化されるかどうかを指定します。
SasUnits パラメーターの測定単位を指定します。

SasNormalize

SasNormalize アノテーションは、関連するパラメーターに値が割り当てられるときに、正規化された値にする必要があるかどうかを示します。このアノテーションは、float2、float3、および float4 パラメーターのみに影響します。

string SasNormalize = "Value";

ここで、Value は True または False です。

次に、1 つの例を示します。

float3 UpNormal
<
  bool SasNormalize = "True";
>;

SasUnits

エフェクト パラメーター データの単位は次のように指定します。

string SasUnits = "Value";

ここで、Value には次のいずれかを指定します。

測定の種類 Value 説明
単位なし 空の文字列 単位なし
Distance mm ミリメートル
cm センチメートル
m メートル
km キロメートル
角度 rad ラジアン
時間 ms ミリ秒
sec
min
hr 時間
線形速度 mm/sec ミリメートル/秒
cm/sec センチメートル/秒
m/sec メートル/秒
m/hr メートル/時
km/hr キロメートル/時
線形加速度 mm/sec2 ミリメートル/秒の 2 乗
cm/sec2 センチメートル/秒の 2 乗
m/sec2 メートル/秒の 2 乗
m/hr2 メートル/時の 2 乗
km/hr2 キロメートル/時の 2 乗
角速度 rad/sec ラジアン/秒
角加速度 rad/sec2 ラジアン/秒の 2 乗
領域 mm2 ミリメートルの 2 乗
cm2 センチメートルの 2 乗
m2 メートルの 2 乗
km2 キロメートルの 2 乗
体積 mm3 ミリメートルの 3 乗
cm3 センチメートルの 3 乗
m3 メートルの 3 乗
km3 キロメートルの 3 乗