데이터 형식 변환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.0 f (예: 5 비트 값 01111를 1.0 f로 매핑됨)를 의미 하 고 최소값은-1.0 f를 의미 합니다. 예를 들어 5 비트 값 1만은-1.0 f에 매핑됩니다.Signed normalized integer, meaning that for an n-bit 2's complement number, the maximum value means 1.0f (for example, the 5-bit value 01111 maps to 1.0f), and the minimum value means -1.0f (for example, the 5-bit value 10000 maps to -1.0f). 또한 두 번째 최소값은-1.0 f에 매핑됩니다. 예를 들어 5 비트 값 10001은-1.0 f에 매핑됩니다.In addition, the second-minimum number maps to -1.0f (for example, the 5-bit value 10001 maps to -1.0f). 따라서-1.0f를 나타내는 정수 표현은 두 가지입니다.There are thus two integer representations for -1.0f. 0.0f에 대한 표현은 하나이며 1.0f에 대한 표현도 하나입니다.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.0 f, 1/3, 2/3 및 1.0 f를 나타냅니다.for example, a 2-bit UNORM represents 0.0f, 1/3, 2/3, and 1.0f.
SINTSINT 부호 있는 정수입니다.Signed integer. 2의 보수 정수입니다.2's complement integer. 예를 들어 3 비트의 값은-4,-3,-2,-1, 0, 1, 2, 3의 정수 값을 나타냅니다.for example, 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의 정수 값을 나타냅니다.for example, 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 UNORM과 유사하게, n비트 숫자를 위한 것입니다. 모든 0은 0.0f이며 모든 1은 1.0f를 의미합니다.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

  • 다른 부동 소수점 형식으로 변환할 때는 0으로 반올림이 사용됩니다.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. 다른 예외로는 0으로 반올림하는 ftoi 및 ftou 셰이더 지침이 있습니다.Other exceptions are the ftoi and ftou shader instructions, which use round-to-zero. 마지막으로, 부동 소수점에서 고정 소수점으로의 변환은 무한 정밀도 방식으로 마지막 위치 단위에서 측정된 지정된 허용 범위를 가진 텍스처 샘플러 및 래스터라이저에서 사용됩니다.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으로 기록)의 경우, 최대값 표현(적절한 부호 사용) 값 결과가 사용됩니다. (위에서 설명한 0으로의 반올림 때문에) 부호 있는 무한의 값은 포함되지 않습니다.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 표현으로 변환됩니다.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 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.
  • 더 높은 범위 형식의 Denorm은 더 낮은 형식으로 변환이 가능할 경우 더 낮은 범위 형식으로 변환됩니다. 그렇지 않으면 결과는 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 표현으로 변환됩니다.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 표현으로 변환됩니다.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은 더 높은 범위 형식이 가능할 경우 정규화된 표현으로 변환됩니다. 또는 더 높은 범위 형식의 Denorm 표현이 있을 경우 이로 표현됩니다.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. 더 높은 범위 형식에 Denorm 표현이 없어 변환에 실패할 경우, 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비트 부동 소수점 숫자는 Denorm 표현 없는 형식으로 계산됩니다(32비트 부동 소수점에 대한 연산에서 Denorm은 부호 있는 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 비트 값 1만은-1.0 f에 매핑됩니다.for example, 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

부동 소수점 숫자를 n비트 정수로 전환하면, 다음과 같이 부호가 있는 범위 [-1.0f에서 1.0f]로 표현됩니다.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.
  • INF를 포함하여 c > 1.0f인 경우, 1.0f로 고정됩니다.If c > 1.0f, including INF, it is clamped to 1.0f.
  • -INF를 포함하여 c < -1.0f인 경우, -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 마지막 위치 단위(정수 쪽)의 허용 범위 내에서 허용됩니다.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 마지막 위치 단위 내의 표현 가능한 대상 형식 값은 해당 값으로 매핑 가능함을 의미합니다.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.
  • INF를 포함하여 c > 1.0f인 경우, 1.0f로 고정됩니다.If c > 1.0f, including INF, it is clamped to 1.0f.
  • INF를 포함하여 c < 0.0f인 경우, 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 마지막 위치 단위(정수 쪽)의 오차 범위로 허용됩니다.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 마지막 위치 단위 내의 표현 가능한 대상 형식 값은 해당 값으로 매핑 가능함을 의미합니다.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

이 변환은 D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP 마지막 위치 단위(SRGB 쪽)의 오차 범위로 허용됩니다.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.
  • INF를 포함하여 c > 1.0f인 경우, 1.0f로 고정됩니다.If c > 1.0f, including INF, is clamped to 1.0f.
  • INF를 포함하여 c < 0.0f인 경우, 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 마지막 위치 단위(정수 쪽)의 오차 범위로 허용됩니다.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 마지막 위치 단위 내의 표현 가능한 대상 형식 값은 해당 값으로 매핑 가능함을 의미합니다.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

SINT를 더 많은 비트를 가진 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

UNIT을 더 많은 비트를 가진 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를 더 적거나 같은 비트를 가진 UNIT 또는 SINT로 변환(및/또는 부호가 없는 숫자로 변경)하려면 시작 값은 간단히 대상 범위의 범위로 고정됩니다.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 비트의 소수를 나타냅니다.for example, 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. 소수점 부분은 항상 가장 음수 부분에서 시작하여 가장 가까운 두 적분 값 사이의 양수 부분을 나타냅니다.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. 1에 16.8 고정 소수점 숫자를 더하면 256을 더하는 것이 됩니다. 소수점 8이 숫자 끝의 최하위 비트에 위치하기 때문입니다.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. 예를 들어, 정수 곱하기를 사용하여 두 16.8 정수를 곱하면 32.16의 결과가 나옵니다.For example, multiplying two 16.8 integers using an integer multiply produces a 32.16 result.

고정 소수점 정수 표현은 Direct3D에서 두 가지 방법으로 사용됩니다.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 마지막 위치 단위 오차 범위 내의 구현이 허용됩니다.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. i.f 형식(i 비트 정수, f 비트 소수점)인 고정 소수점 숫자 fxp를 가정해 보겠습니다.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)(fxp >> f) + // 정수 추출float result = (float)(fxp >> f) + // extract integer

(부동 소수점) (fxp & (2f - 1))/(2f)); 분수 추출((float)(fxp & (2f - 1)) / (2f)); // extract fraction

 

관련 항목Related topics

부록Appendices