データ型の変換Data type conversion

次のセクションでは、Direct3D がデータ型の間の変換を処理する方法について説明します。The following sections describe how Direct3D handles conversions between data types.

データ型の用語Data Type Terminology

次に示す用語は、さまざまな形式の変換の特性を説明するために後で使用されます。The following set of terms are subsequently used to characterize various format conversions.

用語Term 定義Definition
SNORMSNORM 符号付き正規化整数。n ビットの 2 の補数をとり、最大値は 1.0f で (たとえば、5 ビット値 01111 は 1.0f にマップされます)、最小値は -1.0f です (たとえば、5 ビット値 10000 は -1.0f にマップされます)。Signed normalized integer, meaning that for an n-bit 2's complement number, the maximum value means 1.0f (e.g. the 5-bit value 01111 maps to 1.0f), and the minimum value means -1.0f (e.g. the 5-bit value 10000 maps to -1.0f). さらに、2 番目に小さい数値も -1.0f にマップされます (たとえば、5 ビット値 10001 は -1.0f にマップされます)。In addition, the second-minimum number maps to -1.0f (e.g. the 5-bit value 10001 maps to -1.0f). したがって、-1.0f には 2 つの整数表現があります。There are thus two integer representations for -1.0f. 0.0f の整数表現は 1 つで、1.0f の整数表現も 1 つです。There is a single representation for 0.0f, and a single representation for 1.0f. その結果、-1.0f ~ 0.0f の範囲の均等間隔の浮動小数点値に対する整数表現のセットと、同様に 0.0f ~ 1.0f の範囲の数値表現の補集合が存在することになります。This results in a set of integer representations for evenly spaced floating point values in the range (-1.0f...0.0f), and also a complementary set of representations for numbers in the range (0.0f...1.0f)
UNORMUNORM 符号なし正規化整数。n ビットの数値では、すべての桁が 0 の場合は 0.0f、すべての桁が 1 の場合は 1.0f を表します。Unsigned normalized integer, meaning that for an n-bit number, all 0's means 0.0f, and all 1's means 1.0f. 0.0f ~ 1.0f の均等な間隔の一連の浮動小数点値が表されます。A sequence of evenly spaced floating point values from 0.0f to 1.0f are represented. たとえば、2 ビットの UNORM は、0.0f、1/3、2/3、および 1.0f を表します。e.g. a 2-bit UNORM represents 0.0f, 1/3, 2/3, and 1.0f.
SINTSINT 符号付き整数。Signed integer. 2 の補数の整数です。2's complement integer. たとえば、3 ビットの SINT は整数値の -4、-3、-2、-1、0、1、2、3 を表します。e.g. an 3-bit SINT represents the integral values -4, -3, -2, -1, 0, 1, 2, 3.
UINTUINT 符号なし整数。Unsigned integer. たとえば、3 ビットの UINT は整数値の 0、1、2、3、4、5、6、7 を表します。e.g. a 3-bit UINT represents the integral values 0, 1, 2, 3, 4, 5, 6, 7.
FLOATFLOAT Direct3D で定義された任意の表現の浮動小数点値。A floating-point value in any of the representations defined by Direct3D.
SRGBSRGB n ビットの数値ですべての桁が 0 の場合は 0.0f、すべての桁が 1 の場合は 1.0f を表す点で UNORM と同様です。Similar to UNORM, in that for an n-bit number, all 0's means 0.0f and all 1's means 1.0f. ただし、UNORM とは異なり、SRGB では、すべての桁が 0 である値からすべての桁が 1 である値までの符号なし整数エンコードのシーケンスは、0.0f ~ 1.0f の数値の浮動小数点で表した値に対して非線形数列を表します。However unlike UNORM, with SRGB the sequence of unsigned integer encodings between all 0's to all 1's represent a nonlinear progression in the floating point interpretation of the numbers, between 0.0f to 1.0f. 大まかにいえば、この非線形の数列である SRGB をカラーのシーケンスとして表示すると、平均的な視聴者には、平均的な表示条件下および平均的なディスプレイ上で、輝度レベルの直線的な変化に見えます。Roughly, if this nonlinear progression, SRGB, is displayed as a sequence of colors, it would appear as a linear ramp of luminosity levels to an "average" observer, under "average" viewing conditions, on an "average" display. 詳細については、IEC (国際電気標準会議) の SRGB カラー規格である IEC 61996-2-1 を参照してください。For complete detail, refer to the SRGB color standard, IEC 61996-2-1, at IEC (International Electrotechnical Commission).

 

前述の各用語は、通常、"形式名修飾子" として使用されます。これらは、メモリ内のデータのレイアウト方法と、メモリからまたはシェーダーなどのパイプライン ユニットからのトランスポート パス (潜在的にフィルター処理を含む) で実行される変換の両方を表します。The terms above are often used as "Format Name Modifiers", where they describe both how data is laid out in memory and what conversion to perform in the transport path (potentially including filtering) from memory to or from a Pipeline unit such as a Shader.

ポイント変換を浮動小数点Floating Point Conversion

浮動小数点以外の表現との変換を含め、さまざまな表現間で浮動小数点の変換が発生する場合、必ず以下の規則を適用します。Whenever a floating point conversion between different representations occurs, including to or from non-floating point representations, the following rules apply.

低い範囲表現より高い範囲表記から ConververtingConververting from a higher range representation to a lower range representation

  • 別の浮動小数点形式への変換時には、ゼロへの丸めを使用します。Round-to-zero is used during conversion to another float format. 変換先が整数または固定小数点形式の場合、最も近い偶数への丸めを使用します。ただし、FLOAT から SNORM、FLOAT から UNORM、FLOAT から SRGB の各変換で使用する最も近い値への丸めなどのように、別の丸め動作を使用した変換が明示されている場合は除きます。If the target is an integer or fixed point format, round-to-nearest-even is used, unless the conversion is explicitly documented as using another rounding behavior, such as round-to-nearest for FLOAT to SNORM, FLOAT to UNORM or FLOAT to SRGB. その他の例外としてシェーダー命令の ftoi と ftou があります。この場合は、ゼロへの丸めを使用します。Other exceptions are the ftoi and ftou shader instructions, which use round-to-zero. 最後に、テクスチャーのサンプラーとラスタライザーで使用する浮動小数点から固定小数点への変換では、無限に理想的な精度に対する指定の許容誤差があります。この許容誤差は、ULP (Unit-Last-Place) で表します。Finally, the float-to-fixed conversions used by the texture sampler and rasterizer have a specified tolerance measured in Unit-Last-Place from an infinitely precise ideal.
  • 変換元の値のうち、変換先のダイナミック レンジより大きいものは (たとえば、For source values greater than the dynamic range of a lower range target format (eg. 大きな 32 ビットの浮動小数点値を 16 ビットの浮動小数点型 RenderTarget に書き込む場合)、表現可能な最大の値 (適切な符号付き) に変換されます。ただし、前述のゼロへの丸めにより、符号付きの無限大にはなりません。a large 32-bit float value is written into a 16-bit float RenderTarget), the maximum representable (appropriately signed) value results, NOT including signed infinity (due to the round to zero described above).
  • 範囲が広い形式にある NaN を範囲の狭い形式に変換する場合、範囲が狭い変換先の形式に該当の NaN 表現があればその表現に変換されます。NaN in a higher range format will be converted to NaN representation in the lower range format if the NaN representation exists in the lower range format. 範囲が狭い変換先の形式に NaN 表現がない場合、結果は 0 になります。If the lower format does not have a NaN representation, the result will be 0.
  • 範囲が広い形式にある INF を範囲が狭い形式に変換する場合、範囲が狭い変換先の形式に該当の INF があればその INF に変換されます。INF in a higher range format will be converted to INF in the lower range format if available. 範囲が狭い変換先の形式に INF 表現がない場合、表現可能な最大の値に変換されます。If the lower format does not have an INF representation, it will be converted to the maximum value representable. 変換先の形式で利用可能な場合、符号は保持されます。The sign will be preserved if available in the target format.
  • 範囲が広い形式にある非正規化数を範囲が狭い形式に変換する場合、その変換先の形式に非正規化表現があり、その表現への変換が可能であれば、該当の非正規化表現に変換されます。それ以外の場合、結果は 0 になります。Denorm in a higher range format will be converted to the Denorm representation in the lower range format if available in the lower range format and the conversion is possible, otherwise the result is 0. 変換先の形式で利用可能な場合、符号ビットは保持されます。The sign bit will be preserved if available in the target format.

低い範囲表現から高い範囲表現に変換します。Converting from a lower range representation to a higher range representation

  • 範囲が狭い形式にある NaN を範囲の広い形式に変換する場合、範囲が広い変換先の形式で利用可能であれば該当する NaN 表現に変換されます。NaN in a lower range format will be converted to the NaN representation in the higher range format if available in the higher range format. 範囲が広い形式に NaN 表現がない場合は、0 に変換されます。If the higher range format does not have a NaN representation, it will be converted to 0.
  • 範囲が狭い形式にある INF を範囲の広い形式に変換する場合、範囲が広い変換先の形式で利用可能であれば該当する INF 表現に変換されます。INF in a lower range format will be converted to the INF representation in the higher range format if available in the higher range format. 高い形式は、INF 表現を持たない場合表現可能な最大値に変換されます (最大_FLOAT 形式に)。If the higher format does not have an INF representation, it will be converted to the maximum value representable (MAX_FLOAT in that format). 変換先の形式で利用可能な場合、符号は保持されます。The sign will be preserved if available in the target format.
  • 範囲が狭い形式にある非正規化数を範囲が広い形式に変換する場合、変換先の形式の正規化表現に変換可能であれば、その表現に変換されます。変換が不可能な場合、範囲が広い形式に該当の非正規化表現があれば、その表現に変換されます。Denorm in a lower range format will be converted to a normalized representation in the higher range format if possible, or else to a Denorm representation in the higher range format if the Denorm representation exists. 範囲が広い形式に非正規化表現がなければ、0 に変換されます。Failing those, if the higher range format does not have a Denorm representation, it will be converted to 0. 変換先の形式で利用可能な場合、符号は保持されます。The sign will be preserved if available in the target format. 32 ビット浮動小数点型の数値は、非正規化表現のない形式として扱います (32 ビット浮動小数点型の演算における非正規化数を、符号が保持された 0 にフラッシュする必要があるからです)。Note that 32-bit float numbers count as a format without a Denorm representation (because Denorms in operations on 32-bit floats flush to sign preserved 0).

整数型の変換Integer Conversion

次の表で、前述のさまざまな表現から別の表現への変換について説明します。The following table describes conversions from various representations described above to other representations. ここでは、Direct3D で実際に発生する変換のみを示します。Only conversions that actually occur in Direct3D are shown.

整数の場合、特に指定のない限り、整数表現への変換および整数表現から浮動小数点表現への変換はすべて正確に行われます。With integers, unless otherwise specified, all conversions to/from integer representations to float representations described below will be done exactly.

変換元のデータ型Source Data Type 変換先のデータ型Destination Data Type 変換の規則Conversion Rule
SNORMSNORM FLOATFLOAT

符号付きの -1.0f ~ 1.0f の範囲を表す n ビットの整数値から浮動小数点型への変換は次のとおりです。Given an n-bit integer value representing the signed range [-1.0f to 1.0f], conversion to floating-point is as follows.

  • 負数側の最小値が -1.0f にマップされます。The most-negative value maps to -1.0f. たとえば、5 ビット値 10000 は -1.0f にマップされます。e.g. the 5-bit value 10000 maps to -1.0f.
  • その他の値はすべて浮動小数点型 (これを c とします) に変換され、結果は c \* (1.0f / (2⁽ⁿ⁻¹⁾-1)) となります。Every other value is converted to a float (call it c), and then result = c \* (1.0f / (2⁽ⁿ⁻¹⁾-1)). たとえば、5 ビット値 10001 は -15.0f に変換された後、15.0f で除算され、-1.0f となります。For example the 5-bit value 10001 is converted to -15.0f, and then divided by 15.0f, yielding -1.0f.
FLOATFLOAT SNORMSNORM

浮動小数点値から符号付きの -1.0f ~ 1.0f の範囲を表す n ビットの整数値への変換は次のとおりです。Given a floating-point number, conversion to an n-bit integer value representing the signed range [-1.0f to 1.0f] is as follows.

  • 変換元の値を c とします。Let c represent the starting value.
  • c が NaN の場合、結果は 0 です。If c is NaN, the result is 0.
  • c > 1.0f の場合 (INF を含む)、1.0f にクランプされます。If c > 1.0f, including INF, it is clamped to 1.0f.
  • c < -1.0f の場合 (-INF を含む)、-1.0f にクランプされます。If c < -1.0f, including -INF, it is clamped to -1.0f.
  • 次のように浮動小数点のスケールから整数のスケールに変換します。c = c \* (2ⁿ⁻¹-1)。Convert from float scale to integer scale: c = c \* (2ⁿ⁻¹-1).
  • 次のように整数に変換します。Convert to an integer as follows.
    • c >= 0 ならば c = c + 0.5f とし、それ以外の場合は c = c - 0.5f とします。If c >= 0 then c = c + 0.5f, otherwise, c = c - 0.5f.
    • 小数部を除外し、残りの浮動小数点値 (整数値) を整数に直接変換します。Drop the decimal fraction, and the remaining floating point (integral) value is converted directly to an integer.

この変換では、整数側で D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place ULP の誤差が許容されます。This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (on the integer side). つまり、浮動小数点スケールから整数スケールへの変換後、変換先の表現可能な形式の値に対して D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP ULP 以内にある値はすべてその変換先の値にマップできます。This means that after converting from float to integer scale, any value within D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place of a representable target format value is permitted to map to that value. また、データ可換性の要件により、変換は範囲全体にわたって非減少であること、およびすべての出力値が達成可能であることが保証されます。The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable. ここで示した定数で、xx は Direct3D のバージョン (10、11、12 など) に置き換える必要があります。(In the constants shown here, xx should be replaced with the Direct3D version, for example 10, 11, or 12.)

UNORMUNORM FLOATFLOAT

変換元の n ビット値は浮動小数点型 (0.0f、1.0f、2.0f など) に変換された後、(2ⁿ-1) で除算されます。The starting n-bit value is converted to float (0.0f, 1.0f, 2.0f, etc.) and then divided by (2ⁿ-1).

FLOATFLOAT UNORMUNORM

変換元の値を c とします。Let c represent the starting value.

  • c が NaN の場合、結果は 0 です。If c is NaN, the result is 0.
  • c > 1.0f の場合 (INF を含む)、1.0f にクランプされます。If c > 1.0f, including INF, it is clamped to 1.0f.
  • c < 0.0f の場合 (-INF を含む)、0.0f にクランプされます。If c < 0.0f, including -INF, it is clamped to 0.0f.
  • 次のように浮動小数点のスケールから整数のスケールに変換します。c = c \* (2ⁿ-1)。Convert from float scale to integer scale: c = c \* (2ⁿ-1).
  • 整数値に変換します。Convert to integer.
    • c = c + 0.5f。c = c + 0.5f.
    • 小数部を除外し、残りの浮動小数点値 (整数値) を整数に直接変換します。The decimal fraction is dropped, and the remaining floating point (integral) value is converted directly to an integer.

この変換では、整数側で D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP ULP の誤差が許容されます。This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (on the integer side). つまり、浮動小数点スケールから整数スケールへの変換後、変換先の表現可能な形式の値に対して D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP ULP 以内にある値はすべてその変換先の値にマップできます。This means that after converting from float to integer scale, any value within D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place of a representable target format value is permitted to map to that value. また、データ可換性の要件により、変換は範囲全体にわたって非減少であること、およびすべての出力値が達成可能であることが保証されます。The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable.

SRGBSRGB FLOATFLOAT

SRGB から FLOAT への最適な変換は次のとおりです。The following is the ideal SRGB to FLOAT conversion.

  • 変換元の n ビット値を浮動小数点型 (0.0f、1.0f、2.0f など) に変換します。これを c とします。Take the starting n-bit value, convert it a float (0.0f, 1.0f, 2.0f, etc.); call this c.
  • c = c \* (1.0f / (2ⁿ-1))c = c \* (1.0f / (2ⁿ-1))
  • c < = D3Dxx_SRGB_TO_FLOAT_THRESHOLD の場合、結果は c / D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_1 です。それ以外の場合、結果は ((c + D3Dxx_SRGB_TO_FLOAT_OFFSET)/D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_2)D3Dxx_SRGB_TO_FLOAT_EXPONENT です。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

この変換では、SRGB 側で D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP ULP の誤差が許容されます。This conversion is permitted a tolerance of D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (on the SRGB side).

FLOATFLOAT SRGBSRGB

FLOAT から SRGB への最適な変換は次のとおりです。The following is the ideal FLOAT -> SRGB conversion.

変換先の SRGB カラー成分を n ビットと仮定します。Assuming the target SRGB color component has n bits:

  • 変換元の値を c とします。Suppose the starting value is c.
  • c が NaN の場合、結果は 0 です。If c is NaN, the result is 0.
  • c > 1.0f の場合 (INF を含む)、1.0f にクランプされます。If c > 1.0f, including INF, is clamped to 1.0f.
  • c < 0.0f の場合 (-INF を含む)、0.0f にクランプされます。If c < 0.0f, including -INF, it is clamped to 0.0f.
  • c <= D3Dxx_FLOAT_TO_SRGB_THRESHOLD の場合、c = D3Dxx_FLOAT_TO_SRGB_SCALE_1 \* c です。それ以外の場合、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 です。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
  • 次のように浮動小数点のスケールから整数のスケールに変換します。c = c \* (2ⁿ-1)。Convert from float scale to integer scale: c = c \* (2ⁿ-1).
  • 整数値に変換します。Convert to integer:
    • c = c + 0.5f。c = c + 0.5f.
    • 小数部を除外し、残りの浮動小数点値 (整数値) を整数に直接変換します。The decimal fraction is dropped, and the remaining floating point (integral) value is converted directly to an integer.

この変換では、整数側で D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP ULP の誤差が許容されます。This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (on the integer side). つまり、浮動小数点スケールから整数スケールへの変換後、変換先の表現可能な形式の値に対して D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP ULP 以内にある値はすべてその変換先の値にマップできます。This means that after converting from float to integer scale, any value within D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place of a representable target format value is permitted to map to that value. また、データ可換性の要件により、変換は範囲全体にわたって非減少であること、およびすべての出力値が達成可能であることが保証されます。The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable.

SINTSINT よりビット数が多い SINTSINT With More Bits

SINT からそれよりもビット数が多い SINT に変換する場合、変換元の数値の最上位ビット (MSB) が変換先の形式の追加ビットに "符号拡張" されます。To convert from SINT to an SINT with more bits, the most significant bit (MSB) of the starting number is "sign-extended" to the additional bits available in the target format.

UINTUINT よりビット数が多い SINTSINT With More Bits

UINT からそれよりもビット数が多い SINT に変換する場合、その数値が変換先の形式の最下位ビット (LSB) 側にコピーされ、余った MSB 側ビットが 0 で埋められます。To convert from UINT to an SINT with more bits, the number is copied to the target format's least significant bits (LSBs) and additional MSBs are padded with 0.

SINTSINT よりビット数が多い UINTUINT With More Bits

ビット数をシント ・から UINT に変換します。負の場合は、値が 0 に固定されます。To convert from SINT to UINT with more bits: If negative, the value is clamped to 0. それ以外の数値は変換先の形式の LSB 側にコピーされ、余った MSB 側が 0 で埋められます。Otherwise the number is copied to the target format's LSBs and additional MSB's are padded with 0.

UINTUINT よりビット数が多い UINTUINT With More Bits

UINT からそれよりもビット数が多い UINT に変換する場合、その数値が変換先の形式の LSB 側にコピーされ、余った MSB 側が 0 で埋められます。To convert from UINT to UINT with more bits the number is copied to the target format's LSBs and additional MSB's are padded with 0.

SINT または UINTSINT or UINT ビット数が同じか少ない SINT または UINTSINT or UINT With Fewer or Equal Bits

SINT または UINT からビット数が同じか少ない SINT または UINT に変換 (符号の有無の変更を伴うことも可) する場合、変換元の値が変換先の形式の範囲に単純にクランプされます。To convert from a SINT or UINT to SINT or UINT with fewer or equal bits (and/or change in signedness), the starting value is simply clamped to the range of the target format.

 

固定のポイントの整数型の変換Fixed Point Integer Conversion

固定小数点整数とは単に、暗黙の小数点が固定位置にある一定のビット長の整数です。Fixed point integers are simply integers of some bit size that have an implicit decimal point at a fixed location.

よく使用される "整数" データ型は、数値の末尾に小数点を置いた、固定小数点整数の特殊なケースです。The ubiquitous "integer" data type is a special case of a fixed point integer with the decimal at the end of the number.

固定小数点数は i.f という形式で表現します。i は整数部ビット数、f は小数部ビット数を表します。Fixed point number representations are characterized as: i.f, where i is the number of integer bits and f is the number of fractional bits. たとえば、16.8 は 16 ビットの整数の後ろに 8 ビットの小数が続くことを示します。e.g. 16.8 means 16 bits integer followed by 8 bits of fraction. 整数部は、少なくともここでの定義では、2 の補数として格納されます (符号なし整数についても同様です)。The integer part is stored in 2's complement, at least as defined here (though it can be defined equally for unsigned integers as well). 小数部は符号なしの形式で格納されます。The fractional part is stored in unsigned form. 小数部は、負数側の最小値から、互いに最も近い 2 つの整数値の間で必ず正の小数となります。The fractional part always represents the positive fraction between the two nearest integral values, starting from the most negative.

固定小数点数に対する加算演算および減算演算は、単純に通常の整数演算で実行します。暗黙の小数点の位置は考慮されません。Addition and subtraction operations on fixed point numbers are performed simply using standard integer arithmetic, without any consideration for where the implied decimal lies. 16.8 の固定小数点数に対する 1 の加算は、この数値の最下位端から 8 桁は小数部であるため、256 を加算することを意味します。Adding 1 to a 16.8 fixed point number just means adding 256, since the decimal is 8 places in from the least significant end of the number. 乗算などのその他の演算も、固定小数点への影響を考慮したうえで、単純に整数演算によって実行できます。Other operations such as multiplication, can be performed as well simply using integer arithmetic, provided the effect on the fixed decimal is accounted for. たとえば、2 つの 16.8 の整数を整数乗算すると、結果は 32.16 になります。For example, multiplying two 16.8 integers using an integer multiply produces a 32.16 result.

Direct3D では、次の 2 つの状況で固定小数点整数表現を使用します。Fixed point integer representations are used in two ways in Direct3D.

  • ラスタライザーでのクリップ後の頂点位置は固定小数点にスナップされ、RenderTarget 領域全体で精度分布が均一になります。Post-clipped vertex positions in the rasterizer are snapped to fixed point, to uniformly distribute precision across the RenderTarget area. 面のカリングをはじめ、多くのラスタライザー処理は固定小数点のスナップ位置で発生しますが、属性のインターポレーター セットアップなどの処理では、固定小数点のスナップ位置から浮動小数点に逆変換した位置を使用します。Many rasterizer operations, including face culling as one example, occur on fixed point snapped positions, while other operations, such as attribute interpolator setup, use positions that have been converted back to floating point from the fixed point snapped positions.
  • フィルターのタップ位置/重みの選択では、サンプリング処理のテクスチャー座標が (テクスチャー サイズに合わせてスケーリングされた後) 固定小数点にスナップされ、テクスチャー領域全体で精度分布が均一になります。Texture coordinates for sampling operations are snapped to fixed point (after being scaled by texture size), to uniformly distribute precision across texture space, in choosing filter tap locations/weights. 重み値は、実際のフィルタリング演算を実行する前に浮動小数点に逆変換します。Weight values are converted back to floating point before actual filtering arithmetic is performed.
変換元のデータ型Source Data Type 変換先のデータ型Destination Data Type 変換の規則Conversion Rule
FLOATFLOAT 固定小数点整数Fixed Point Integer

浮動小数点型の数値 n を固定小数点整数 i.f に変換する一般的な手順は次のとおりです。ここで、i は整数部ビット数 (符号付き)、f は小数部ビット数です。The following is the general procedure for converting a floating point number n to a fixed point integer i.f, where i is the number of (signed) integer bits and f is the number of fractional bits.

  • FixedMin = -2⁽ⁱ⁻¹⁾ を計算します。Compute FixedMin = -2⁽ⁱ⁻¹⁾
  • FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f) を計算します。Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)
  • n が NaN の場合、結果は 0 です。n が +Inf の場合の結果は FixedMax*2f で、n が -Inf の場合の結果は FixedMin*2f です。If n is a NaN, result = 0; if n is +Inf, result = FixedMax*2f; if n is -Inf, result = FixedMin*2f
  • n >= FixedMax の場合の結果は Fixedmax*2f で、n <= FixedMin の場合の結果は FixedMin*2f です。If n >= FixedMax, result = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • それ以外の場合は、n\*2f を計算して整数に変換します。Else compute n\*2f and convert to integer.

実装では、上の最後の手順で得られた整数と無限大精度値 n\*2f との比較で、D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP ULP の誤差が許容されます。Implementations are permitted D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place tolerance in the integer result, instead of the infinitely precise value n\*2f after the last step above.

固定小数点整数Fixed Point Integer FLOATFLOAT

浮動小数点型に変換する固定小数点表現があり、その合計ビット数は 24 ビット以下で、うち小数部は 23 ビット以下であるとします。Assume that the specific fixed point representation being converted to float does not contain more than a total of 24 bits of information, no more than 23 bits of which is in the fractional component. 特定の固定小数点数 fxp を i.f の形式とします (i ビットの整数、f ビットの小数)。Suppose a given fixed point number, fxp, is in i.f form (i bits integer, f bits fraction). 浮動小数点型への変換は次に示す疑似コードのようになります。The conversion to float is akin to the following pseudocode.

float result = (float)(fxp >> f) + // 整数を抽出するfloat result = (float)(fxp >> f) + // extract integer

((float) (fxp & (2f - 1))/(2f));//extract 分数((float)(fxp & (2f - 1)) / (2f)); // extract fraction

 

関連トピックRelated topics

付録Appendices