Conversione dei tipi di datiData type conversion

Le sezioni seguenti descrivono in che modo Direct3D gestisce le conversioni tra tipi di dati.The following sections describe how Direct3D handles conversions between data types.

Terminologia del tipo di datiData Type Terminology

I termini indicati di seguito sono utilizzati successivamente per caratterizzare le varie conversioni di formato.The following set of terms are subsequently used to characterize various format conversions.

TermineTerm DefinizioneDefinition
SNORMSNORM Intero con segno normalizzato, vale a dire che, per un numero di complemento a 2 bit, il valore massimo corrisponde a 1,0 f (ad esempio, il valore a 5 bit 01111 viene mappato a 1,0 f) e il valore minimo indica-1.0 f (ad esempio, il valore a 5 bit 10000 viene mappato a-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). Inoltre, il secondo numero minimo viene mappato a-1.0 f (ad esempio, il valore a 5 bit 10001 viene mappato a-1.0 f).In addition, the second-minimum number maps to -1.0f (for example, the 5-bit value 10001 maps to -1.0f). Esistono pertanto due rappresentazioni di integer per -1.0f.There are thus two integer representations for -1.0f. Esiste una rappresentazione singola per 0.0f e una rappresentazione singola per 1.0f.There is a single representation for 0.0f, and a single representation for 1.0f. Ciò dà come risultato un set di rappresentazioni di integer per valori a virgola mobile con spaziatura uniforme nell'intervallo (-1.0f...0.0 ), nonché un set di rappresentazioni complementare per i numeri nell'intervallo (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 Integer senza segno normalizzato, significa che per un numero a n bit, tutti gli 0 rappresentano 0.0f e tutti gli 1 rappresentano 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. È rappresentata una sequenza di valori a virgola mobile con spaziatura uniforme da 0.0f a 1.0f.A sequence of evenly spaced floating point values from 0.0f to 1.0f are represented. ad esempio, un UNORM a 2 bit rappresenta 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 Integer con segno.Signed integer. Integer complemento a 2.2's complement integer. ad esempio, un oggetto SINT a 3 bit rappresenta i valori integrali-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 Integer senza segno.Unsigned integer. ad esempio, un UINT a 3 bit rappresenta i valori integrali 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 Un valore a virgola mobile in una qualsiasi delle rappresentazioni definite da Direct3D.A floating-point value in any of the representations defined by Direct3D.
SRGBSRGB Simile a UNORM, in quanto per un numero a n bit tutti gli 0 rappresentano 0.0f e tutti gli 1 rappresentano 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. Tuttavia, a differenza di UNORM, con SRGB la sequenza delle codifiche di integer senza segno da tutti gli 0 a tutti gli 1 rappresenta una progressione non lineare nell'interpretazione a virgola mobile dei numeri, da 0.0f a 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. Approssimativamente, se questa progressione non lineare, SRGB, è visualizzata come una sequenza di colori, appare come una scala lineare di livelli di luminosità a un osservatore medio, in condizioni di visualizzazione medie su un display medio.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. Per dettagli completi, fare riferimento allo standard di colore SRGB, IEC 61996-2-1, IEC (International Electrotechnical Commission).For complete detail, refer to the SRGB color standard, IEC 61996-2-1, at IEC (International Electrotechnical Commission).

 

I termini precedenti sono spesso utilizzati come "modificatori del nome di formato", in quanto descrivono sia il layout dei dati nella memoria sia quale conversione eseguire nel percorso di trasporto (incluso il potenziale filtro) dalla memoria a un'unità pipeline, ad esempio uno shader.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.

Conversione da virgola mobileFloating Point Conversion

Ogni volta che si ha una conversione a virgola mobile tra diverse rappresentazioni, incluse quelle a o da rappresentazioni non a virgola mobile, si applicano le regole seguenti.Whenever a floating point conversion between different representations occurs, including to or from non-floating point representations, the following rules apply.

Conververting da una rappresentazione di intervallo superiore a una rappresentazione di un intervallo inferioreConververting from a higher range representation to a lower range representation

  • Viene utilizzato l'arrotondamento a zero durante la conversione in un altro formato mobile.Round-to-zero is used during conversion to another float format. Se la destinazione è un formato integer o a virgola fissa, viene utilizzato l'arrotondamento al numero pari più vicino, a meno che non sia documentato in modo esplicito che la conversione utilizzi un altro comportamento di arrotondamento, ad esempio l'arrotondamento al numero più vicino per la conversione da FLOAT a SNORM, da FLOAT a UNORM o da FLOAT a 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. Altre eccezioni sono le istruzioni di shader ftoi e ftou che utilizzano l'arrotondamento a zero.Other exceptions are the ftoi and ftou shader instructions, which use round-to-zero. Infine, le conversioni da mobile a fisso utilizzate dall'unità di rasterizzazione e dal campionamento delle trame hanno una tolleranza specificata, misurata come Unit-Last-Place da un ideale 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.
  • Per i valori di origine superiori all'intervallo dinamico di un formato di destinazione di intervallo inferiore (ad esempioFor source values greater than the dynamic range of a lower range target format (eg. un grande valore float a 32 bit viene scritto in un valore RenderTarget float a 16 bit), risulta il valore massimo rappresentabile (con segno appropriato) che NON include l'infinito con segno (a causa dell'arrotondamento a zero descritto sopra).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 un formato di intervallo superiore viene convertito nella rappresentazione NaN nel formato di intervallo inferiore se tale rappresentazione esiste.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 il formato inferiore non ha una rappresentazione NaN, il risultato è 0.If the lower format does not have a NaN representation, the result will be 0.
  • INF in un formato di intervallo superiore viene convertito in INF nel formato di intervallo inferiore, se disponibile.INF in a higher range format will be converted to INF in the lower range format if available. Se il formato inferiore non ha una rappresentazione INF, viene convertito nel valore massimo rappresentabile.If the lower format does not have an INF representation, it will be converted to the maximum value representable. Se disponibile nel formato di destinazione, il segno viene mantenuto.The sign will be preserved if available in the target format.
  • Denorm in un formato di intervallo superiore viene convertito nella rappresentazione Denorm nel formato di intervallo inferiore, se disponibile nel formato di intervallo inferiore e se la conversione è possibile, in caso contrario il risultato è 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. Se disponibile nel formato di destinazione, il bit del segno viene mantenuto.The sign bit will be preserved if available in the target format.

Conversione da una rappresentazione di intervallo inferiore a una rappresentazione di un intervallo superioreConverting from a lower range representation to a higher range representation

  • NaN in un formato di intervallo inferiore viene convertito nella rappresentazione NaN nel formato di intervallo superiore se disponibile in tale formato.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 il formato di intervallo superiore non ha una rappresentazione NaN, viene convertito in 0.If the higher range format does not have a NaN representation, it will be converted to 0.
  • INF in un formato di intervallo inferiore viene convertito nella rappresentazione INF nel formato di intervallo superiore se disponibile in tale formato.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 il formato superiore non dispone di una rappresentazione INF, viene convertito nel valore massimo rappresentabile (MAX_FLOAT in tale 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). Se disponibile nel formato di destinazione, il segno viene mantenuto.The sign will be preserved if available in the target format.
  • Denorm in un formato di intervallo inferiore viene convertito in una rappresentazione normalizzata nel formato di intervallo superiore se possibile, altrimenti in una rappresentazione Denorm nel formato di intervallo superiore se tale rappresentazione esiste.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. In caso contrario, se il formato di intervallo superiore non ha una rappresentazione Denorm, viene convertito in 0.Failing those, if the higher range format does not have a Denorm representation, it will be converted to 0. Se disponibile nel formato di destinazione, il segno viene mantenuto.The sign will be preserved if available in the target format. Si noti che i numeri float a 32 bit hanno un formato senza rappresentazione Denorm (poiché i Denorm nelle operazioni su numeri float a 32 bit si allineano allo 0 che mantiene il segno).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).

Conversione integerInteger Conversion

La tabella seguente descrive le conversioni da diverse rappresentazioni descritte in precedenza in altre rappresentazioni.The following table describes conversions from various representations described above to other representations. Vengono visualizzate solo le conversioni che avvengono effettivamente in Direct3D.Only conversions that actually occur in Direct3D are shown.

Con gli integer, se non viene specificato diversamente, tutte le conversioni tra rappresentazioni di integer e rappresentazioni flat descritte di seguito vengono eseguite esattamente.With integers, unless otherwise specified, all conversions to/from integer representations to float representations described below will be done exactly.

Tipo di dati di origineSource Data Type Tipo di dati di destinazioneDestination Data Type Regola di conversioneConversion Rule
SNORMSNORM FLOATFLOAT

Dato un valore integer a n bit che rappresenta l'intervallo con segno [-1.0f - 1.0f], la conversione in virgola mobile è la seguente.Given an n-bit integer value representing the signed range [-1.0f to 1.0f], conversion to floating-point is as follows.

  • Il valore più negativo viene mappato a -1.0f.The most-negative value maps to -1.0f. ad esempio, il valore a 5 bit 10000 viene mappato a-1.0 f.for example, the 5-bit value 10000 maps to -1.0f.
  • Ogni altro valore viene convertito in un valore float (chiamato c) e dà come risultato = c \* (1.0f / (2⁽ⁿ⁻¹⁾-1)).Every other value is converted to a float (call it c), and then result = c \* (1.0f / (2⁽ⁿ⁻¹⁾-1)). Ad esempio il valore a 5 bit 10001 viene convertito in -15.0f e quindi diviso per 15.0f, che cede il controllo a -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

Dato un numero a virgola mobile, la conversione in un valore integer a n bit che rappresenta l'intervallo con segno [-1.0f - 1.0f] è la seguente.Given a floating-point number, conversion to an n-bit integer value representing the signed range [-1.0f to 1.0f] is as follows.

  • Si supponga che c rappresenti il valore iniziale.Let c represent the starting value.
  • Se c è NaN, il risultato è 0.If c is NaN, the result is 0.
  • Se c > 1.0f, incluso INF, viene bloccato su 1.0f.If c > 1.0f, including INF, it is clamped to 1.0f.
  • Se c < -1.0f, incluso -INF, viene bloccato su -1.0f.If c < -1.0f, including -INF, it is clamped to -1.0f.
  • Conversione da scala float a scala integer: c = c \* (2ⁿ⁻¹-1).Convert from float scale to integer scale: c = c \* (2ⁿ⁻¹-1).
  • Conversione in un numero integer come indicato di seguito.Convert to an integer as follows.
    • Se c >= 0, c = c + 0.5f, in caso contrario c = c -0.5f.If c >= 0 then c = c + 0.5f, otherwise, c = c - 0.5f.
    • Eliminare la frazione decimale e il restante valore (integrale) a virgola mobile viene convertito direttamente in un numero integer.Drop the decimal fraction, and the remaining floating point (integral) value is converted directly to an integer.

Per questa conversione è consentita una tolleranza di D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (lato integer).This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (on the integer side). Ciò significa che dopo la conversione dalla scala float alla scala integer, qualsiasi valore all'interno di D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place di un valore in formato di destinazione rappresentabile è mappabile a tale valore.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. Il requisito aggiuntivo Data Invertability garantisce che la conversione non sia decrescente nell'intervallo e che tutti i valori di output siano raggiungibili.The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable. Nelle costanti illustrate qui, xx deve essere sostituito con la versione di Direct3D, ad esempio 10, 11 o 12.(In the constants shown here, xx should be replaced with the Direct3D version, for example 10, 11, or 12.)

UNORMUNORM FLOATFLOAT

Il valore a n bit iniziale viene convertito in float (0.0f, 1.0f, 2.0f e così via) e quindi diviso per (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

Si supponga che c rappresenti il valore iniziale.Let c represent the starting value.

  • Se c è NaN, il risultato è 0.If c is NaN, the result is 0.
  • Se c > 1.0f, incluso INF, viene bloccato su 1.0f.If c > 1.0f, including INF, it is clamped to 1.0f.
  • Se c <0.0f, incluso -INF, viene bloccato su 0.0f.If c < 0.0f, including -INF, it is clamped to 0.0f.
  • Conversione da scala float a scala integer: c = c \* (2ⁿ-1).Convert from float scale to integer scale: c = c \* (2ⁿ-1).
  • Conversione in integer.Convert to integer.
    • c = c + 0.5f.c = c + 0.5f.
    • La frazione decimale viene eliminata e il restante valore (integrale) a virgola mobile viene convertito direttamente in un integer.The decimal fraction is dropped, and the remaining floating point (integral) value is converted directly to an integer.

Per questa conversione è consentita una tolleranza di D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (lato integer).This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (on the integer side). Ciò significa che dopo la conversione dalla scala float alla scala integer, qualsiasi valore all'interno di D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place di un valore in formato di destinazione rappresentabile è mappabile a tale valore.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. Il requisito aggiuntivo Data Invertability garantisce che la conversione non sia decrescente nell'intervallo e che tutti i valori di output siano raggiungibili.The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable.

SRGBSRGB FLOATFLOAT

Di seguito è riportata la conversione ideale da SRGB a FLOAT.The following is the ideal SRGB to FLOAT conversion.

  • Accettare il valore a n bit iniziale, convertirlo in un valore float (0.0f, 1.0f, 2.0f ecc.); chiamarlo 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) ne risulta = c / D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_1, altrimenti ne risulta = ((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

Per questa conversione è consentita una tolleranza di D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (lato SRGB).This conversion is permitted a tolerance of D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (on the SRGB side).

FLOATFLOAT SRGBSRGB

Di seguito è riportata la conversione ideale FLOAT -> SRGB.The following is the ideal FLOAT -> SRGB conversion.

Si supponga che il componente di colore SRGB abbia n bit:Assuming the target SRGB color component has n bits:

  • Si supponga che il valore iniziale sia c.Suppose the starting value is c.
  • Se c è NaN, il risultato è 0.If c is NaN, the result is 0.
  • Se c > 1.0f, incluso INF, viene bloccato su 1.0f.If c > 1.0f, including INF, is clamped to 1.0f.
  • Se c <0.0f, incluso -INF, viene bloccato su 0.0f.If c < 0.0f, including -INF, it is clamped to 0.0f.
  • Se (c <= D3Dxx_FLOAT_TO_SRGB_THRESHOLD) ne risulta che c = D3Dxx_FLOAT_TO_SRGB_SCALE_1 \* c, altrimenti ne risulta che 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
  • Conversione da scala float a scala integer: c = c \* (2ⁿ-1).Convert from float scale to integer scale: c = c \* (2ⁿ-1).
  • Conversione in integer:Convert to integer:
    • c = c + 0.5f.c = c + 0.5f.
    • La frazione decimale viene eliminata e il restante valore (integrale) a virgola mobile viene convertito direttamente in un integer.The decimal fraction is dropped, and the remaining floating point (integral) value is converted directly to an integer.

Per questa conversione è consentita una tolleranza di D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (lato integer).This conversion is permitted a tolerance of D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (on the integer side). Ciò significa che dopo la conversione dalla scala float alla scala integer, qualsiasi valore all'interno di D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place di un valore in formato di destinazione rappresentabile è mappabile a tale valore.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. Il requisito aggiuntivo Data Invertability garantisce che la conversione non sia decrescente nell'intervallo e che tutti i valori di output siano raggiungibili.The additional Data Invertability requirement ensures that the conversion is nondecreasing across the range and all output values are attainable.

SINTSINT SINT con più bitSINT With More Bits

Per convertire da SINT a SINT con più bit, si applica il bit più significativo (MSB) del numero iniziale "con segno esteso" ai bit aggiuntivi disponibili nel formato di destinazione.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 con più bitSINT With More Bits

Per convertire da UINT a SINT con più bit, il numero viene copiato nei bit meno significativi del formato di destinazione (LSB) e gli MSB aggiuntivi sono riempiti con 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 con più bitUINT With More Bits

Per convertire da SINT a UINT con più bit: se negativo il valore è bloccato su 0.To convert from SINT to UINT with more bits: If negative, the value is clamped to 0. In caso contrario, il numero viene copiato negli LSB del formato di destinazione e gli MSB aggiuntivi sono riempiti con 0.Otherwise the number is copied to the target format's LSBs and additional MSB's are padded with 0.

UINTUINT UINT con più bitUINT With More Bits

Per convertire da UINT a UINT con più bit, il numero viene copiato negli LSB del formato di destinazione e gli MSB aggiuntivi sono riempiti con 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 o UINTSINT or UINT SINT o UINT con un numero minore o uguale di bitSINT or UINT With Fewer or Equal Bits

Per convertire da SINT o UINT a SINT o UINT con un numero minore o uguale di bit (e/o modificare il segno), il valore iniziale è semplicemente bloccato nell'intervallo del formato di destinazione.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.

 

Conversione integer a virgola fissaFixed Point Integer Conversion

Gli integer a virgola fissa sono semplicemente integer di alcuni bit che hanno una virgola decimale implicita in una posizione fissa.Fixed point integers are simply integers of some bit size that have an implicit decimal point at a fixed location.

Il tipo di dati integer universale è un caso speciale di integer a virgola fissa con il segno decimale alla fine del numero.The ubiquitous "integer" data type is a special case of a fixed point integer with the decimal at the end of the number.

Le rappresentazioni di numeri a virgola fissa sono caratterizzate come: i.f, in cui i è il numero di bit integer e f è il numero di bit frazionari.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, ad esempio, indica un Integer a 16 bit seguito da 8 bit della frazione.for example, 16.8 means 16 bits integer followed by 8 bits of fraction. La parte integer è archiviata in un complemento a 2, almeno secondo la definizione data qui (anche se la definizione può essere analoga per gli integer senza segno).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). La parte frazionaria viene archiviata in formato senza segno.The fractional part is stored in unsigned form. La parte frazionaria rappresenta sempre la frazione positiva tra i due valori integrali più vicini, a partire dal più negativo.The fractional part always represents the positive fraction between the two nearest integral values, starting from the most negative.

Le operazioni di aggiunta e sottrazione su numeri a virgola fissa sono eseguite semplicemente usando i calcoli aritmetici standard, senza alcuna considerazione della posizione dei decimali impliciti.Addition and subtraction operations on fixed point numbers are performed simply using standard integer arithmetic, without any consideration for where the implied decimal lies. L'aggiunta di 1 a un numero a virgola fissa 16.8 significa semplicemente l'aggiunta di 256, poiché la virgola decimale è a 8 posizioni dall'estremità meno significativa del numero.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. Altre operazioni, ad esempio la moltiplicazione, possono essere eseguite altrettanto semplicemente mediante i calcoli aritmetici tra integer, purché si tenga in considerazione l'effetto sulla virgola decimale fissa.Other operations such as multiplication, can be performed as well simply using integer arithmetic, provided the effect on the fixed decimal is accounted for. Ad esempio, se si moltiplicano due integer 16.8 utilizzando una moltiplicazione si ha il risultato di 32.16.For example, multiplying two 16.8 integers using an integer multiply produces a 32.16 result.

Le rappresentazioni di integer a virgola fissa vengono utilizzate in due modi in Direct3D.Fixed point integer representations are used in two ways in Direct3D.

  • Le posizioni di vertice dopo il ritaglio nell'unità di rasterizzazione sono ancorate alla virgola fissa, per distribuire la precisione in modo uniforme nell'area RenderTarget.Post-clipped vertex positions in the rasterizer are snapped to fixed point, to uniformly distribute precision across the RenderTarget area. Molte operazioni di rasterizzazione, ad esempio il face culling, vengono eseguite su posizioni ancorate a virgola fissa, mentre altre, ad esempio l'impostazione di interpolatori di attributo, utilizzano posizioni che sono state riconvertite a virgola mobile da posizioni ancorate a virgola fissa.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.
  • Le coordinate di trama per le operazioni di campionamento sono ancorate a virgola fissa (dopo l'adattamento in scala per le dimensioni delle trame), per distribuire in modo uniforme la precisione nello spazio della trama, nella scelta di percorsi/pesi del filtro.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. I valori di peso vengono riconvertiti a virgola mobile prima dell'effettiva esecuzione dell'aritmetica di filtro.Weight values are converted back to floating point before actual filtering arithmetic is performed.
Tipo di dati di origineSource Data Type Tipo di dati di destinazioneDestination Data Type Regola di conversioneConversion Rule
FLOATFLOAT Integer a virgola fissaFixed Point Integer

Di seguito è riportata la procedura generale per la conversione di un numero a virgola mobile in un integer a virgola fissa i.f, in cui i è il numero di bit integer (con segno) e f è il numero di bit frazionari.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.

  • Calcolare FixedMin = -2⁽ⁱ⁻¹⁾Compute FixedMin = -2⁽ⁱ⁻¹⁾
  • Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)
  • Se n è NaN, il risultato è = 0; se n è +Inf, il risultato è = FixedMax*2f; se n è -Inf, il risultato è = 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, il risultato è = Fixedmax*2f; se n <= FixedMin, il risultato è = FixedMin*2fIf n >= FixedMax, result = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • Altrimenti calcolare n\*2f e convertire in integer.Else compute n\*2f and convert to integer.

Alle implementazioni è consentita la tolleranza D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP nel risultato integer, anziché il valore infinitamente preciso n\*2f dopo l'ultimo passaggio precedente.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.

Integer a virgola fissaFixed Point Integer FLOATFLOAT

Si supponga che la rappresentazione a virgola fissa specifica che viene convertita in float non contenga più di un massimo di 24 bit di informazioni, non più di 23 dei quali sono nel componente frazionario.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. Si supponga che un determinato numero a virgola fissa, fxp, sia in formato i.f (i bit integer, f bit frazionari).Suppose a given fixed point number, fxp, is in i.f form (i bits integer, f bits fraction). La conversione in float è simile allo pseudocodice seguente.The conversion to float is akin to the following pseudocode.

float dà come risultato = (float)(fxp >> f) + // estrarre integerfloat result = (float)(fxp >> f) + // extract integer

((float) (FXP & (2f - 1))/(2f)); Estrai frazione((float)(fxp & (2f - 1)) / (2f)); // extract fraction

 

Argomenti correlatiRelated topics

AppendiciAppendices