Conversão de tipo de dadosData type conversion

As seções a seguir descrevem como o Direct3D manipula as conversões entre os tipos de dados.The following sections describe how Direct3D handles conversions between data types.

Terminologia de tipo de dadosData Type Terminology

O conjunto de termos a seguir é usado posteriormente para caracterizar várias conversões de formato.The following set of terms are subsequently used to characterize various format conversions.

TermoTerm DefiniçãoDefinition
SNORMSNORM Número inteiro normalizado assinado, o que significa que, para um número de complemento do n-bit 2, o valor máximo significa 1,0 f (por exemplo, o valor de 5 bits 01111 é mapeado para 1,0 f) e o valor mínimo significa-1,0 f (por exemplo, o valor de 5 bits 10000 é mapeado para-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). Além disso, o segundo número mínimo é mapeado para-1,0 f (por exemplo, o valor de 5 bits 10001 é mapeado para-1,0 f).In addition, the second-minimum number maps to -1.0f (for example, the 5-bit value 10001 maps to -1.0f). Assim, há duas representações de inteiro para -1,0f.There are thus two integer representations for -1.0f. Há uma representação única para 0,0f e uma representação única para 1,0f.There is a single representation for 0.0f, and a single representation for 1.0f. Isso resulta em um conjunto de representações de inteiros para valores de ponto flutuante uniformemente espaçados no intervalo (-1,0f... 0,0f) e também em um conjunto complementar de representações para os números no intervalo (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úmeros inteiros não assinados como normalizados, o que significa que, para um número de n-bits, todo 0 significa 0,0f, e todo o 1 significa 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. É representada uma sequência de valores de ponto flutuante uniformemente espaçados de 0,0f para 1,0f.A sequence of evenly spaced floating point values from 0.0f to 1.0f are represented. por exemplo, um UNORM de 2 bits representa 0,0 f, 1/3, 2/3 e 1,0 f.for example, a 2-bit UNORM represents 0.0f, 1/3, 2/3, and 1.0f.
SINTSINT Inteiro assinado.Signed integer. inteiro complemento de 2.2's complement integer. por exemplo, um Santo de 3 bits representa os valores integrais-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 Inteiro não assinado.Unsigned integer. por exemplo, um UINT de 3 bits representa os valores inteiros 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.
FLUTUANTEFLOAT Um valor de ponto flutuante em uma das representações definidas pelo Direct3D.A floating-point value in any of the representations defined by Direct3D.
SRGBSRGB Semelhante a UNORM, pois em um número n-bits todo 0 significa 0,0f e todo 1 significa 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. No entanto, ao contrário de UNORM, no SRGB a sequência de codificações de inteiros não assinados entre todos os 0 e todos os 1 representa uma progressão não linear na interpretação do ponto flutuante dos números, entre 0,0f e 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. De modo geral, se essa progressão não linear, SRGB, fosse exibida como uma sequência de cores, ela seria exibida como uma rampa linear de níveis de luminosidade para um observador "médio", em condições de exibição "médias", em uma exibição "média".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. Para obter detalhes completos, consulte o padrão de cor SRGB, IEC 61996-2-1, na IEC (International Electrotechnical Commission).For complete detail, refer to the SRGB color standard, IEC 61996-2-1, at IEC (International Electrotechnical Commission).

 

Os termos acima geralmente são usados como "modificadores de nome de formato", pois eles descrevem como os dados estão dispostos na memória e qual a conversão a ser executada no caminho de transporte (possivelmente incluindo filtragem) da memória para uma unidade de pipeline (ou da unidade de pipeline para a memória) como um sombreador.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.

Conversão de ponto flutuanteFloating Point Conversion

Sempre que ocorre uma conversão de ponto flutuante entre diferentes representações, incluindo para representações de ponto não flutuante ou de representações de ponto não flutuante, aplicam-se as regras a seguir.Whenever a floating point conversion between different representations occurs, including to or from non-floating point representations, the following rules apply.

Conververting de uma representação de intervalo superior a uma representação de intervalo inferiorConververting from a higher range representation to a lower range representation

  • Arredondar para zero é usado durante a conversão para outro formato flutuante.Round-to-zero is used during conversion to another float format. Se o destino for um número inteiro ou formato de ponto fixo, é usado o arredondamento para o número par mais próximo, a menos que a conversão seja explicitamente documentada com o uso de outro comportamento de arredondamento, como arredondamento para o mais próximo para FLOAT para SNORM, FLOAT para UNORM ou FLOAT para 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. Outras exceções são as instruções de sombreador ftoi e ftou, que usam o arredondamento em direção ao zero.Other exceptions are the ftoi and ftou shader instructions, which use round-to-zero. Por fim, as conversões de flutuante para fixo usadas pela amostra de textura e rasterizador têm uma tolerância especificada medida em ULP (unidade no último lugar) de um ideal infinitamente preciso.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.
  • Para valores de fonte maiores do que o intervalo dinâmico de um formato de destino de intervalo inferior (p. ex.:For source values greater than the dynamic range of a lower range target format (eg. um valor alto flutuante de 32 bits é gravado em um RenderTarget flutuante de 16 bits), os resultados de valor (devidamente assinado) representável máximo, NÃO incluindo o infinito assinado (devido ao arredondamento em direção ao zero descrito acima).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 em um formato de intervalo superior será convertido em representação NaN no formato de intervalo inferior se a representação NaN existir no formato de intervalo inferior.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. Se o formato inferior não tiver uma representação NaN, o resultado será 0.If the lower format does not have a NaN representation, the result will be 0.
  • INF em um formato de intervalo superior será convertido em INF no formato de intervalo inferior, se disponível.INF in a higher range format will be converted to INF in the lower range format if available. Se o formato inferior não tiver uma representação INF, ele será convertido para o valor máximo representável.If the lower format does not have an INF representation, it will be converted to the maximum value representable. A assinatura será preservada se estiver disponível no formato de destino.The sign will be preserved if available in the target format.
  • A desnormalização em um formato de intervalo superior será convertida para a representação desnormalizada no formato de intervalo inferior, se estiver disponível no formato de intervalo inferior e a conversão for possível, caso contrário, o resultado será 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. O bit de assinatura será preservado se estiver disponível no formato de destino.The sign bit will be preserved if available in the target format.

Convertendo de uma representação de intervalo inferior em uma representação de intervalo superiorConverting from a lower range representation to a higher range representation

  • NaN em um formato de intervalo inferior será convertido em representação NaN no formato de intervalo superior se a representação NaN existir no formato de intervalo superior.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. Se o formato de intervalo superior não tiver uma representação NaN, ela será convertida como 0.If the higher range format does not have a NaN representation, it will be converted to 0.
  • INF em um formato de intervalo inferior será convertido em representação INF no formato de intervalo superior se disponível no formato de intervalo superior.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. Se o formato mais alto não tiver uma representação INF, ele será convertido para o valor máximo representável (MAX_FLOAT nesse formato).If the higher format does not have an INF representation, it will be converted to the maximum value representable (MAX_FLOAT in that format). A assinatura será preservada se estiver disponível no formato de destino.The sign will be preserved if available in the target format.
  • A desnormalização em um formato de intervalo inferior será convertida em uma representação normalizada no formato de intervalo superior se possível, ou então para uma representação desnormalizada no formato de intervalo superior se existir a representação desnormalizada.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. Se isso falhar, se o formato de intervalo superior não tiver uma representação desnormalizada, ela será convertida como 0.Failing those, if the higher range format does not have a Denorm representation, it will be converted to 0. A assinatura será preservada se estiver disponível no formato de destino.The sign will be preserved if available in the target format. Observe que os números flutuantes de 32 bits contam como um formato sem uma representação desnormalizada (porque as desnormalizações em operações em números flutuantes de 32 bits fluem para assinar 0 preservados).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).

Conversão de inteiroInteger Conversion

A tabela a seguir descreve as conversões das várias representações descritas acima para outras representações.The following table describes conversions from various representations described above to other representations. Somente as conversões que realmente ocorrem em Direct3D são mostradas.Only conversions that actually occur in Direct3D are shown.

Com inteiros, salvo indicação em contrário, todas as conversões de/para representações de inteiro para as representações flutuantes descritas abaixo serão feitas exatamente.With integers, unless otherwise specified, all conversions to/from integer representations to float representations described below will be done exactly.

Tipo de dados de origemSource Data Type Tipo de dados de destinoDestination Data Type Regra de conversãoConversion Rule
SNORMSNORM FLUTUANTEFLOAT

Dado um valor inteiro de n-bits que representa o intervalo assinado [-1,0f para 1,0f], a conversão para ponto flutuante é a seguinte.Given an n-bit integer value representing the signed range [-1.0f to 1.0f], conversion to floating-point is as follows.

  • O valor mais negativo é mapeado para -1,0f.The most-negative value maps to -1.0f. por exemplo, o valor de 5 bits 10000 é mapeado para-1,0 f.for example, the 5-bit value 10000 maps to -1.0f.
  • Todos os outros valores são convertidos para flutuante (que vamos chamar de c) e, assim, o resultado = c \* (1,0f / (2⁽ⁿ⁻¹⁾-1)).Every other value is converted to a float (call it c), and then result = c \* (1.0f / (2⁽ⁿ⁻¹⁾-1)). Por exemplo, o valor de 5 bits 10001 é convertido para -15,0f e, em seguida, dividido por 15,0f, resultando em -1,0f.For example the 5-bit value 10001 is converted to -15.0f, and then divided by 15.0f, yielding -1.0f.
FLUTUANTEFLOAT SNORMSNORM

Dado um número de ponto flutuante, a conversão para um valor inteiro de n-bits representando o intervalo assinado [-1,0f para 1,0f], é a seguinte.Given a floating-point number, conversion to an n-bit integer value representing the signed range [-1.0f to 1.0f] is as follows.

  • Digamos que c represente o valor inicial.Let c represent the starting value.
  • Se c for NaN, o resultado será 0.If c is NaN, the result is 0.
  • Se c > 1,0f, incluindo INF, ele é vinculado a 1,0f.If c > 1.0f, including INF, it is clamped to 1.0f.
  • Se c < -1,0f, incluindo -INF, ele é vinculado a -1,0f.If c < -1.0f, including -INF, it is clamped to -1.0f.
  • Converter de escala de número flutuante em escala de números inteiros: c = c \* (2ⁿ⁻¹-1).Convert from float scale to integer scale: c = c \* (2ⁿ⁻¹-1).
  • Converter em um número inteiro como se segue.Convert to an integer as follows.
    • Se c >= 0, então c = c + 0,5f, caso contrário, c = c - 0,5f.If c >= 0 then c = c + 0.5f, otherwise, c = c - 0.5f.
    • Descarte a fração decimal e o valor de ponto flutuante restante (integral) será convertido diretamente em um número inteiro.Drop the decimal fraction, and the remaining floating point (integral) value is converted directly to an integer.

Essa conversão permite uma tolerância do D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unidade-no último lugar (no lado do número inteiro).This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (on the integer side). Isso significa que, após a conversão de escala de números flutuantes para escala de números inteiros, qualquer valor dentro de D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar de um valor de formato de destino representável tem permissão para ser mapeado para esse valor.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. O requisito adicional de Data Invertability garante que a conversão seja não decrescente no intervalo e todos os valores de saída sejam atingíveis.The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable. (Nas constantes mostradas aqui, xx deve ser substituído com a versão do Direct3D, por exemplo, 10, 11 ou 12.)(In the constants shown here, xx should be replaced with the Direct3D version, for example 10, 11, or 12.)

UNORMUNORM FLUTUANTEFLOAT

O valor de n-bits inicial é convertido em flutuante (0,0f, 1,0f, 2,0f, etc.) e, em seguida, dividido por (2ⁿ-1).The starting n-bit value is converted to float (0.0f, 1.0f, 2.0f, etc.) and then divided by (2ⁿ-1).

FLUTUANTEFLOAT UNORMUNORM

Digamos que c represente o valor inicial.Let c represent the starting value.

  • Se c for NaN, o resultado será 0.If c is NaN, the result is 0.
  • Se c > 1,0f, incluindo INF, ele é vinculado a 1,0f.If c > 1.0f, including INF, it is clamped to 1.0f.
  • Se c < 0,0f, incluindo -INF, ele é vinculado a 0,0f.If c < 0.0f, including -INF, it is clamped to 0.0f.
  • Converter de escala de número flutuante em escala de números inteiros: c = c \* (2ⁿ-1).Convert from float scale to integer scale: c = c \* (2ⁿ-1).
  • Converter em números inteiros.Convert to integer.
    • c = c + 0,5f.c = c + 0.5f.
    • A fração decimal é descartada, e o valor de ponto flutuante restante (integral) será convertido diretamente em um número inteiro.The decimal fraction is dropped, and the remaining floating point (integral) value is converted directly to an integer.

Essa conversão tem uma tolerância permitida do D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar (no lado do número inteiro).This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (on the integer side). Isso significa que, após a conversão de escala de números flutuantes para escala de números inteiros, qualquer valor dentro de D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar de um valor de formato de destino representável tem permissão para ser mapeado para esse valor.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. O requisito adicional de Data Invertability garante que a conversão seja não decrescente no intervalo e todos os valores de saída sejam atingíveis.The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable.

SRGBSRGB FLUTUANTEFLOAT

A conversão a seguir é a ideal de SRGB para FLOAT.The following is the ideal SRGB to FLOAT conversion.

  • Tome o valor inicial de n-bits, converta-o a um número flutuante (0,0f, 1,0f, 2,0f, etc.); chame isso de 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))
  • Se (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_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

Essa conversão tem uma tolerância permitida do D3Dxx_SRGB_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar (no lado SRGB).This conversion is permitted a tolerance of D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (on the SRGB side).

FLUTUANTEFLOAT SRGBSRGB

A conversão a seguir é a ideal de FLOAT -> SRGB.The following is the ideal FLOAT -> SRGB conversion.

Supondo que o componente de cor SRGB do destino tenha n-bits:Assuming the target SRGB color component has n bits:

  • Suponha que o valor inicial é c.Suppose the starting value is c.
  • Se c for NaN, o resultado será 0.If c is NaN, the result is 0.
  • Se c > 1,0f, incluindo INF, ele é vinculado a 1,0f.If c > 1.0f, including INF, is clamped to 1.0f.
  • Se c < 0,0f, incluindo -INF, ele é vinculado a 0,0f.If c < 0.0f, including -INF, it is clamped to 0.0f.
  • Se (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_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
  • Converter de escala de número flutuante em escala de números inteiros: c = c \* (2ⁿ-1).Convert from float scale to integer scale: c = c \* (2ⁿ-1).
  • Converter em números inteiros:Convert to integer:
    • c = c + 0,5f.c = c + 0.5f.
    • A fração decimal é descartada, e o valor de ponto flutuante restante (integral) será convertido diretamente em um número inteiro.The decimal fraction is dropped, and the remaining floating point (integral) value is converted directly to an integer.

Essa conversão tem uma tolerância permitida do D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar (no lado do número inteiro).This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (on the integer side). Isso significa que, após a conversão de escala de números flutuantes para escala de números inteiros, qualquer valor dentro de D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar de um valor de formato de destino representável tem permissão para ser mapeado para esse valor.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. O requisito adicional de Data Invertability garante que a conversão seja não decrescente no intervalo e todos os valores de saída sejam atingíveis.The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable.

SINTSINT SINT com mais bitsSINT With More Bits

Para converter de SINT para um SINT com mais bits, o bit mais significativo (MSB) do número inicial é "assinatura estendida" para os bits adicionais disponíveis no formato de destino.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 com mais bitsSINT With More Bits

Para converter de UINT em um SINT com mais bits, o número é copiado para os bits menos significativos do formato de destino (LSBs) e os MSBs adicionais são preenchidos com 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 UINT com mais bitsUINT With More Bits

Para converter de SINT em UINT com mais bits: Se negativo, o valor é vinculado como 0.To convert from SINT to UINT with more bits: If negative, the value is clamped to 0. Caso contrário, o número é copiado para os LSBs do formato destino e os MSB adicionais são preenchidos com 0.Otherwise the number is copied to the target format's LSBs and additional MSB's are padded with 0.

UINTUINT UINT com mais bitsUINT With More Bits

Para converter de UINT em UINT com mais bits, o número é copiado para LSBs do formato de destino e os MSBs adicionais são preenchidos com 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 ou UINTSINT or UINT SINT ou UINT com menos bits ou bits iguaisSINT or UINT With Fewer or Equal Bits

Para converter de um SINT ou UINT para SINT ou UINT com menos bits ou bits iguais (e/ou mudar a assinatura ou não assinatura), o valor inicial é simplesmente vinculado ao intervalo do formato de destino.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.

 

Conversão de inteiro de ponto fixoFixed Point Integer Conversion

Os inteiros de ponto fixo são simplesmente os inteiros de algum tamanho de bit que têm um ponto decimal implícito em um local fixo.Fixed point integers are simply integers of some bit size that have an implicit decimal point at a fixed location.

O tipo de dados "inteiro", presente em todos os lugares, é um caso especial de um inteiro de ponto fixo com decimal no final do número.The ubiquitous "integer" data type is a special case of a fixed point integer with the decimal at the end of the number.

Representações de número de ponto fixo são caracterizadas como: i,f, onde i é o número de bits de inteiros e f é o número de bits fracionais.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. por exemplo, 16,8 significa um inteiro de 16 bits seguido por 8 bits de fração.for example, 16.8 means 16 bits integer followed by 8 bits of fraction. A parte inteira é armazenada no complemento de 2, pelo menos como definido aqui (embora ele também possa ser definido igualmente por números inteiros não assinados).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). A parte fracionária é armazenada em formato não assinado.The fractional part is stored in unsigned form. A parte fracionária sempre representa a fração positiva entre os dois valores integrais mais próximos, começando pelo mais negativo.The fractional part always represents the positive fraction between the two nearest integral values, starting from the most negative.

As operações de adição e subtração em números de ponto fixo são executadas usando simplesmente a aritmética padrão de números inteiros, sem qualquer consideração em relação ao decimal implícito.Addition and subtraction operations on fixed point numbers are performed simply using standard integer arithmetic, without any consideration for where the implied decimal lies. A adição de 1 a um número de ponto fixo 16,8 significa apenas a adição de 256, como o decimal está a 8 lugares do extremo menos significativo do número.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. Outras operações, como a multiplicação, também podem ser executadas simplesmente usando aritmética de números inteiros, desde que o efeito sobre o decimal fixo seja levado em consideração.Other operations such as multiplication, can be performed as well simply using integer arithmetic, provided the effect on the fixed decimal is accounted for. Por exemplo, multiplicar dois inteiros de 16,8 usando um multiplicador inteiro produz um resultado de 32,16.For example, multiplying two 16.8 integers using an integer multiply produces a 32.16 result.

Representações de inteiro de ponto fixo são usadas de duas maneiras no Direct3D.Fixed point integer representations are used in two ways in Direct3D.

  • As posições de vértice pós-vinculadas no rasterizador são ajustadas para ponto fixo, para distribuir de maneira uniforme a precisão pela área RenderTarget.Post-clipped vertex positions in the rasterizer are snapped to fixed point, to uniformly distribute precision across the RenderTarget area. Muitas operações de rasterizador, incluindo o conjunto de face frontal como um exemplo, ocorrem em posições de ponto fixo ajustadas, enquanto outras operações, como instalação de interpolador do atributo, usam posições que foram convertidas de volta para um ponto flutuante das posições de ponto fixo ajustadas.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.
  • As coordenadas de textura para operações de amostragem são ajustadas para ponto fixo (após serem dimensionadas por tamanho de textura), para distribuir uniformemente a precisão no espaço de textura, ao escolher locais/pesos de toque de filtros.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. Os valores ponderados são convertidos de volta para ponto flutuante antes de a aritmética real de filtragem ser realizada.Weight values are converted back to floating point before actual filtering arithmetic is performed.
Tipo de dados de origemSource Data Type Tipo de dados de destinoDestination Data Type Regra de conversãoConversion Rule
FLUTUANTEFLOAT Inteiro de ponto fixoFixed Point Integer

A seguir está o procedimento geral para converter um número de ponto flutuante n para um inteiro de ponto fixo inteiro i,f, onde i é o número de bits de números inteiros (assinados) e f é o número de bits fracionários.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.

  • Calcular FixedMin = -2⁽ⁱ⁻¹⁾Compute FixedMin = -2⁽ⁱ⁻¹⁾
  • Calcular FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)
  • Se n for NaN, resultado = 0; se n for + Inf, resultado = FixedMax*2f; se n for -Inf, resultado = FixedMin* 2fIf n is a NaN, result = 0; if n is +Inf, result = FixedMax*2f; if n is -Inf, result = FixedMin*2f
  • Se n >= FixedMax, resultado = Fixedmax*2f; se n <= FixedMin, resultado = FixedMin*2fIf n >= FixedMax, result = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • Ou calcule n\*2f e converta em números inteiros.Else compute n\*2f and convert to integer.

As implementações são permitidas em D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unidade no último lugar tolerância no resultado inteiro, em vez do valor infinitamente preciso n\*2f depois do último passo acima.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.

Inteiro de ponto fixoFixed Point Integer FLUTUANTEFLOAT

Suponha que a representação de ponto fixo específico sendo convertida em flutuante não contenha mais do que um total de 24 bits de informações, não mais de 23 bits dos quais está no componente fracionário.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. Suponha que um dado número de ponto fixo, fxp, esteja na forma de i,f (i bits de números inteiros, f bits fracionários).Suppose a given fixed point number, fxp, is in i.f form (i bits integer, f bits fraction). A conversão para flutuante é semelhante ao pseudocódigo a seguir.The conversion to float is akin to the following pseudocode.

resultado flutuante= (flutuante) (fxp >> f) + //extrair inteirofloat result = (float)(fxp >> f) + // extract integer

((float) (FXP & (2f - 1))/(2f)); extrair fração((float)(fxp & (2f - 1)) / (2f)); // extract fraction

 

Tópicos relacionadosRelated topics

ApêndicesAppendices