Преобразование типа данных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-bit 2 максимальное значение означает 1,0 f (например, 5-битное значение 01111 сопоставляется с 1,0 f), а минимальное значение — 1,0 f (например, 5-битное значение 10000 сопоставляется с-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,0fThis 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,0f, а все единицы — 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'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,0f, а все единицы — 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. Но в случае с SRGB, в отличие от UNORM, последовательность целочисленных кодировок без знака в диапазоне между всеми нулями и всеми единицами представляет нелинейную последовательность в интерпретации чисел с плавающей точкой в диапазоне от 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. Полные сведения см. в цветовом стандарте SRGB IEC 61996-2-1 на сайте Международной электротехнической комиссии (IEC).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.

Конвервертинг из более высокого представления диапазона в представление с меньшим диапазономConververting 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 в SRGBIf 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. Наконец, для преобразований чисел с плавающей точкой в числа с фиксированной точкой, используемых текстурным дискретизатором и средством прорисовки, указывается допуск от бесконечно точного идеала, измеряемый единицей наименьшей точности.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 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. Если в формате нижнего диапазона нет представления не числа, результатом будет 0.If the lower format does not have a NaN representation, the result will be 0.
  • Бесконечное число в формате верхнего диапазона преобразуется в бесконечное число в формате нижнего диапазона, если возможно.INF in a higher range format will be converted to INF in the lower range format if available. Если в формате нижнего диапазона нет представления бесконечного числа, оно преобразуется в максимальное представляемое значение.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 in a lower range format will be converted to the NaN representation in the higher range format if available in the higher range format. Если в формате верхнего диапазона нет представления не числа, оно преобразуется в 0.If the higher range format does not have a NaN representation, it will be converted to 0.
  • Бесконечное число в формате нижнего диапазона преобразуется в представление бесконечного числа в формате верхнего диапазона, если оно доступно в формате верхнего диапазона.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-представление, оно будет преобразовано в максимальное значение, которое можно представить (MAX_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-разрядными числами с плавающей точкой приводятся к нулю с сохранением знака.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

Преобразование n-разрядного целочисленного значения, представляющего диапазон со знаком [от -1,0f до 1,0f], в число с плавающей точкой происходит следующим образом.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.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 не число, результатом будет 0.If c is NaN, the result is 0.
  • Если c > 1,0f, включая бесконечные числа, оно прикрепляется к 1,0f.If c > 1.0f, including INF, it is clamped to 1.0f.
  • Если 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 не число, результатом будет 0.If c is NaN, the result is 0.
  • Если c > 1,0f, включая бесконечные числа, оно прикрепляется к 1,0f.If c > 1.0f, including INF, it is clamped to 1.0f.
  • Если 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_EXPONENTIf (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 не число, результатом будет 0.If c is NaN, the result is 0.
  • Если c > 1,0f, включая бесконечные числа, оно прикрепляется к 1,0f.If c > 1.0f, including INF, is clamped to 1.0f.
  • Если 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_OFFSETIf (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 SINT с дополнительным числом битSINT 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 SINT с дополнительным числом битSINT With More Bits

Для преобразования SINT в SINT с дополнительным числом бит число копируется в младшие разряды (LSB) конечного формата, а дополнительные старшие разряды заполняются нулями.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 UINT с дополнительным числом битUINT With More Bits

Для преобразования SINT в UINT с дополнительным числом бит значение прикрепляется к 0, если оно отрицательное.To convert from SINT to UINT with more bits: If negative, the value is clamped to 0. В противном случае число копируется в младшие разряды конечного формата, а дополнительные старшие разряды заполняются нулями.Otherwise the number is copied to the target format's LSBs and additional MSB's are padded with 0.

UINTUINT UINT с дополнительным числом битUINT With More Bits

Для преобразования UINT в UINT с дополнительным числом бит число копируется в младшие разряды конечного формата, а дополнительные старшие разряды заполняются нулями.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 или UINT с дополнительным или одинаковым числом битSINT 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 бит дробной части.for example, 16.8 means 16 bits integer followed by 8 bits of fraction. Целочисленная часть хранится в дополнительном коде, по крайней мере согласно данному здесь определению. Впрочем, для целых чисел без знака можно использовать аналогичное определение.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 — не число, результатом будет 0; если n — положительное бесконечное число, результатом будет FixedMax*2f; если n — отрицательное бесконечное число, результатом будет = FixedMin*2fIf 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*2fIf n >= FixedMax, result = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • Иначе вычисляем n\*2f и преобразуем результат в целое число.Else compute n\*2f and convert to integer.

Для целочисленного результата реализаций разрешается допуск в виде единицы наименьшей точности D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP вместо бесконечно точного значения n\*2f после последнего указанного выше действия.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)(fxp >> f) + // извлечь целое числоfloat result = (float)(fxp >> f) + // extract integer

((float) (фксп & (2f - 1))/(2f)); извлечь дробь((float)(fxp & (2f - 1)) / (2f)); // extract fraction

 

См. такжеRelated topics

ПриложенияAppendices