次の方法で共有


データ変換ルール

次のセクションでは、Direct3D がデータ型間の変換を処理する方法について説明します。

データ型の用語

その後、次の用語のセットを使用して、さまざまな形式変換を特徴付けられます。

用語 定義
SNORM 符号付き正規化整数。つまり、n ビット 2 の補数の場合、最大値は 1.0f (5 ビット値 01111 は 1.0f にマップされます) を意味し、最小値は -1.0f を意味します (たとえば、5 ビット値 10000 は -1.0f にマップされます)。 さらに、2 番目の最小数は -1.0f にマップされます (たとえば、5 ビット値 10001 は -1.0f にマップされます)。 したがって、-1.0f には 2 つの整数表現があります。 0.0f には 1 つの表現があり、1.0f には 1 つの表現があります。 これにより、範囲内の等間隔浮動小数点値 (-1.0f...0.0f)、および範囲内の数値の補完的な表現セット (0.0f...1.0f)
UNORM 符号なし正規化整数。n ビット数値の場合、すべての 0 は 0.0f を意味し、すべての 1 は 1.0f を意味します。 0.0f から 1.0f までの等間隔浮動小数点値のシーケンスが表されます。 たとえば、2 ビットの UNORM は 0.0f、1/3、2/3、1.0f を表します。
SINT 符号付き整数。 2 の補数整数。 たとえば、3 ビット SINT は、-4、-3、-2、-1、0、1、2、3 の整数値を表します。
UINT 符号なし整数。 たとえば、3 ビット UINT は整数値 0、1、2、3、4、5、6、7 を表します。
浮く Direct3D によって定義された任意の表現の浮動小数点値。
SRGB UNORM と同様に、n ビット数の場合、すべての 0 は 0.0f を意味し、すべての 1 は 1.0f を意味します。 ただし、UNORM とは異なり、SRGB では、すべての 0 からすべての 1 の間の符号なし整数エンコードのシーケンスは、数値の浮動小数点解釈における 0.0f から 1.0f までの非線形の進行を表します。 大まかに言えば、この非線形進行である SRGB が一連の色として表示される場合、"平均" 表示条件の下の "平均" 観察者に対する明度レベルの線形傾斜路として "平均" 表示で表示されます。 詳細については、IEC (国際電気技術委員会) の SRGB カラー標準 IEC 61996-2-1 を参照してください。

 

浮動小数点変換

浮動小数点以外の表現との間で、異なる表現間で浮動小数点変換が行われるたびに、次の規則が適用されます。

高い範囲表現から低い範囲表現への変換

  • 0 への丸めは、別の float 形式への変換時に使用されます。 ターゲットが整数または固定小数点形式の場合は、FLOAT から SNORM、FLOAT から UNORM、FLOAT から SRGB への丸めなど、別の丸め動作を使用するものとして変換が明示的に文書化されていない限り、最も近い値への丸めが使用されます。 その他の例外は ftoi シェーダー命令と ftou シェーダー命令です。この命令では、0 への丸めを使用します。 最後に、テクスチャ サンプラーとラスタライザーで使用される浮動小数点から固定への変換には、無限に正確な理想から単位Last-Place で指定された許容値が測定されます。
  • より低い範囲のターゲット形式のダイナミック レンジより大きいソース値の場合 (たとえば、大きな 32 ビット浮動小数点値が 16 ビット float RenderTarget に書き込まれます)、最大表現可能 (適切に符号付き) 値の結果は、符号付き無限大を含まない (前述の丸めから 0 にするため)。
  • より高い範囲形式の NaN は、下位の範囲形式で NaN 表現が存在する場合、下位の範囲形式で NaN 表現に変換されます。 下位の形式に NaN 表現がない場合、結果は 0 になります。
  • より高い範囲の形式の INF は、使用可能な場合は、より低い範囲の形式で INF に変換されます。 下位の形式に INF 表現がない場合は、表現可能な最大値に変換されます。 ターゲット形式で使用できる場合、署名は保持されます。
  • より高い範囲形式のデノルムは、下位範囲形式で使用可能で、変換が可能な場合は、下位範囲形式の Denorm 表現に変換されます。それ以外の場合、結果は 0 になります。 ターゲット形式で使用できる場合、符号ビットは保持されます。

低い範囲表現から高い範囲表現への変換

  • より低い範囲形式の NaN は、上位の範囲形式で使用可能な場合は、より高い範囲の形式で NaN 表現に変換されます。 上位の範囲の形式に NaN 表現がない場合は、0 に変換されます。
  • より低い範囲の形式の INF は、より高い範囲の形式で使用可能な場合は、より高い範囲の形式で INF 表現に変換されます。 上位の形式に INF 表現がない場合は、表現可能な最大値 (その形式でMAX_FLOAT) に変換されます。 ターゲット形式で使用できる場合、署名は保持されます。
  • 低い範囲形式の非正規化表現は、可能な場合は上位の範囲形式で正規化された表現に変換され、Denorm 表現が存在する場合は、より高い範囲形式の Denorm 表現に変換されます。 これらが失敗すると、上位の範囲の形式に Denorm 表現がない場合は、0 に変換されます。 ターゲット形式で使用できる場合、署名は保持されます。 32 ビット浮動小数点数は、Denorm 表現のない形式としてカウントされることに注意してください (32 ビット浮動小数点数に対する操作のデノルムが 0 に署名するためにフラッシュされるため)。

整数変換

次の表では、上記のさまざまな表現から他の表現への変換について説明します。 Direct3D で実際に発生した変換のみが表示されます。

ソース データ型 変換先データ型 変換ルール
SNORM 浮く 符号付き範囲 [-1.0f から 1.0f] を表す n ビット整数値を指定すると、浮動小数点への変換は次のようになります。
  • 最も負の値は -1.0f にマップされます。 たとえば、5 ビット値 10000 は -1.0f にマップされます。
  • 他のすべての値は float (c と呼びます) に変換され、結果 = c * (1.0f / (2⁽ⁿ⁻¹⁾-1)) になります。 たとえば、5 ビット値 10001 は -15.0f に変換され、15.0f で除算され、-1.0f になります。
浮く SNORM 浮動小数点数を指定すると、符号付き範囲 [-1.0f から 1.0f] を表す n ビット整数値への変換は次のようになります。
  • c は開始値を表します。
  • c が NaN の場合、結果は 0 になります。
  • C > 1.0f (INF を含む) の場合、1.0f にクランプされます。
  • c < -1.0f (-INF を含む) の場合、-1.0f にクランプされます。
  • float scale から整数スケールへの変換: c = c * (2ⁿ⁻¹-1)。
  • 次のように整数に変換します。
    • c >= 0 の場合、c = c + 0.5f、それ以外の場合は c = c - 0.5f。
    • 小数部をドロップすると、残りの浮動小数点 (整数) 値が整数に直接変換されます。
この変換では、D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (整数側) の許容値が許可されます。 つまり、float から整数スケールに変換した後、表し可能なターゲットフォーマット値の D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place 内の値は、その値にマップできます。 追加のデータ反転機能の要件により、変換が範囲全体でデクラス化されておらず、すべての出力値が達成可能であることが保証されます。 (ここに示す定数では、xx を Direct3D バージョン (10、11、12 など) に置き換える必要があります)。
UNORM 浮く 開始 n ビット値は float (0.0f、1.0f、2.0f など) に変換され、(2ⁿ-1) で除算されます。
浮く UNORM c は開始値を表します。
  • c が NaN の場合、結果は 0 になります。
  • C > 1.0f (INF を含む) の場合、1.0f にクランプされます。
  • c < 0.0f (-INF を含む) の場合、0.0f にクランプされます。
  • float scale から整数スケールへの変換: c = c * (2ⁿ-1)。
  • 整数に変換します。
    • c = c + 0.5f。
    • 小数部が削除され、残りの浮動小数点 (整数) 値が整数に直接変換されます。
この変換では、D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (整数側) の許容値が許可されます。 つまり、float から整数スケールに変換した後、表し可能なターゲットフォーマット値の D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place 内の値は、その値にマップできます。 追加のデータ反転機能の要件により、変換が範囲全体でデクラス化されておらず、すべての出力値が達成可能であることが保証されます。
SRGB 浮く SRGB から FLOAT への変換の理想的な例を次に示します。
  • 開始 n ビット値を取得し、float (0.0f、1.0f、2.0f など) に変換します。この c を呼び出します。
  • c = c * (1.0f / (2ⁿ-1))
  • if (c < = D3Dxx_SRGB_TO_FLOAT_THRESHOLD) then: result = c / D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_1, else: result = ((c + D3Dxx_SRGB_TO_FLOAT_OFFSET)/D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_2)D3Dxx_SRGB_TO_FLOAT_EXPONENT
この変換では、D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (SRGB 側) の許容値が許可されます。
浮く SRGB 理想的な FLOAT -> SRGB 変換を次に示します。
ターゲット SRGB カラー コンポーネントに n ビットが含まれていると仮定します。
  • 開始値が c であるとします。
  • c が NaN の場合、結果は 0 になります。
  • C > 1.0f (INF を含む) が 1.0f にクランプされている場合。
  • c < 0.0f (-INF を含む) の場合、0.0f にクランプされます。
  • if (c <= D3Dxx_FLOAT_TO_SRGB_THRESHOLD) then: c = D3Dxx_FLOAT_TO_SRGB_SCALE_1 * c, else: c = D3Dxx_FLOAT_TO_SRGB_SCALE_2 * c(D3Dxx_FLOAT_TO_SRGB_EXPONENT_NUMERATOR/D3Dxx_FLOAT_TO_SRGB_EXPONENT_DENOMINATOR) - D3Dxx_FLOAT_TO_SRGB_OFFSET
  • float scale から整数スケールへの変換: c = c * (2ⁿ-1)。
  • 整数に変換します。
    • c = c + 0.5f。
    • 小数部が削除され、残りの浮動小数点 (整数) 値が整数に直接変換されます。
この変換では、D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (整数側) の許容値が許可されます。 つまり、float から整数スケールに変換した後、表し可能なターゲットフォーマット値の D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place 内の値は、その値にマップできます。 追加のデータ反転機能の要件により、変換が範囲全体でデクラス化されておらず、すべての出力値が達成可能であることが保証されます。
SINT より多くのビットを持つ SINT SINT からより多くのビットを持つ SINT に変換するには、開始番号の最上位ビット (MSB) がターゲット形式で使用可能な追加ビットに "符号拡張" されます。
UINT より多くのビットを持つ SINT UINT からより多くのビットを持つ SINT に変換するには、数値がターゲット形式の最下位ビット (LSB) にコピーされ、追加の MSB が 0 で埋め込まれます。
SINT より多くのビットを持つ UINT より多くのビットで SINT から UINT に変換するには:負の場合、値は 0 にクランプされます。 それ以外の場合、数値はターゲット形式の LSB にコピーされ、追加の MSB は 0 で埋め込まれます。
UINT より多くのビットを持つ UINT より多くのビットを持つ UINT から UINT に変換するには、数値がターゲット形式の LSB にコピーされ、追加の MSB が 0 で埋め込まれます。
SINT または UINT ビット数が少ない、または等しい SINT または UINT SINT または UINT から SINT または UINT に、ビット数が少ないか等しい (または符号が変更される) には、開始値は単にターゲット形式の範囲にクランプされます。

 

固定小数点整数変換

固定小数点整数は、固定位置に暗黙的な小数点を持つビット サイズの整数です。

ユビキタスな "整数" データ型は、数値の末尾に 10 進数を持つ固定小数点整数の特殊なケースです。

固定小数点数表現は、i.f という特徴があります。ここで、i は整数ビットの数、f は小数部のビット数です。 たとえば、16.8 は、16 ビット整数の後に 8 ビットの分数が続きます。 整数部分は、少なくともここで定義されているように、2 の補数に格納されます (ただし、符号なし整数についても同様に定義できます)。 小数部は符号なし形式で格納されます。 小数部は常に、最も負の値から始まる 2 つの最も近い整数値の間の正の分数を表します。

固定小数点数に対する加算演算と減算演算は、暗黙的な 10 進数がどこにあるかを考慮せずに、標準の整数演算を使用するだけで実行されます。 16.8 固定小数点番号に 1 を追加すると、小数点は数値の最下位端から 8 桁になるため、256 を加算することを意味します。 乗算などの他の演算は、固定小数点への影響が考慮されていれば、整数算術を使用するだけでも同様に実行できます。 たとえば、整数乗算を使用して 2 つの 16.8 整数を乗算すると、32.16 の結果が生成されます。

固定小数点整数表現は、Direct3D では 2 つの方法で使用されます。

  • ラスタライザー内のクリップ後の頂点位置は固定ポイントにスナップされ、RenderTarget 領域全体に精度が均一に分散されます。 面カリングを含む多くのラスタライザー操作は固定小数点スナップ位置で発生しますが、属性補間の設定などの他の操作では、固定ポイント スナップ位置から浮動小数点に変換された位置が使用されます。
  • サンプリング操作のテクスチャ座標は、(テクスチャ サイズによってスケーリングされた後に) 固定ポイントにスナップされ、フィルタータップの位置/重みを選択する際にテクスチャ空間間で精度を均等に分散します。 重みの値は、実際のフィルター演算が実行される前に浮動小数点に変換されます。
ソース データ型 変換先データ型 変換ルール
浮く 固定小数点整数 浮動小数点数 n を固定小数点整数 i.f に変換する一般的な手順を次に示します。ここで、i は (符号付き) 整数ビットの数、f は小数部のビット数です。
  • Compute FixedMin = -2⁽ⁱ⁻¹⁾
  • Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)
  • n が NaN の場合、結果 = 0。n が +Inf の場合、結果 = FixedMax*2f;n が -Inf の場合、結果 = FixedMin*2f
  • n >= FixedMax の場合、結果 = Fixedmax*2f;n <= FixedMin の場合、結果 = FixedMin*2f
  • それ以外の場合は、n*2f を計算し、整数に変換します。
実装は、上記の最後の手順の後に、無限に正確な値 n*2 f ではなく、整数の結果で D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place 許容値を使用できます。
固定小数点整数 浮く float に変換される特定の固定小数点表現に、合計 24 ビット以下の情報が含まれていないとします。小数部の部分に含まれるのは 23 ビット以下です。 指定された固定小数点番号 fxp が i.f 形式 (i ビット整数、f ビット分数) であるとします。 float への変換は、次の擬似コードと同じになります。
float result = (float)(fxp >> f) + // 抽出整数
((float)(fxp & (2f - 1)) / (2f));抽出分数

 

リソース (Direct3D 10)