Freigeben über


Datenkonvertierungsregeln

In den folgenden Abschnitten wird beschrieben, wie Direct3D Konvertierungen zwischen Datentypen verarbeitet.

Datentypterminologie

Die folgenden Begriffe werden anschließend verwendet, um verschiedene Formatkonvertierungen zu charakterisieren.

Begriff Definition
SNORM Ganzzahl mit Vorzeichen, was bedeutet, dass für die Komplementnummer eines n-Bits 2 der Maximalwert 1,0f bedeutet (z. B. der 5-Bit-Wert 01111 entspricht 1,0f), und der Mindestwert bedeutet -1,0f (z. B. der 5-Bit-Wert 10000 entspricht -1,0f). Darüber hinaus wird die zweite Mindestzahl -1.0f zugeordnet (z. B. wird der 5-Bit-Wert 10001 -1.0f zugeordnet). Es gibt also zwei ganzzahlige Darstellungen für -1.0f. Es gibt eine einzelne Darstellung für 0.0f und eine einzelne Darstellung für 1.0f. Dies führt zu einer Reihe ganzzahliger Darstellungen für gleichmäßig angeordnete Gleitkommawerte im Bereich (-1,0f... 0.0f), und auch ein ergänzender Satz von Darstellungen für Zahlen im Bereich (0,0f... 1.0f)
UNORM Normalisierte ganze Zahl ohne Vorzeichen, was bedeutet, dass für eine n-Bit-Zahl alle 0 0 0f und alle 1 1 1 für 1.0f bedeuten. Es wird eine Sequenz gleichmäßiger Gleitkommawerte von 0,0f bis 1,0f dargestellt. Beispielsweise stellt eine 2-Bit-UNORM 0,0f, 1/3, 2/3 und 1,0f dar.
SINT Ganzzahl mit Vorzeichen. 2's ganze Komplementzahl. z. B. stellt ein 3-Bit-SINT die integralen Werte -4, -3, -2, -1, 0, 1, 2, 3 dar.
UINT Ganzzahl ohne Vorzeichen. Ein 3-Bit-UINT stellt z. B. die integralen Werte 0, 1, 2, 3, 4, 5, 6, 7 dar.
GLEITKOMMAZAHL Ein Gleitkommawert in einer der von Direct3D definierten Darstellungen.
SRGB Ähnlich wie UNORM bedeutet bei einer n-Bit-Zahl alle 0 0f und alle 1 1 1 1f. Im Gegensatz zu UNORM stellt bei SRGB die Sequenz der ganzzahligen Codierungen ohne Vorzeichen zwischen allen 0's und allen 1 eine nichtlineare Progression in der Gleitkommainterpretation der Zahlen zwischen 0,0f und 1,0f dar. Grob gesagt, wenn diese nichtlineare Progression, SRGB, als farbliche Sequenz angezeigt wird, würde sie als lineare Rampe der Helligkeitsstufen für einen "durchschnittlichen" Beobachter unter "durchschnittlichen" Sichtbedingungen auf einer "durchschnittlichen" Anzeige erscheinen. Ausführliche Informationen finden Sie in der SRGB-Farbnorm IEC 61996-2-1 bei IEC (International Electrotechnical Commission).

 

Gleitkommakonvertierung

Immer wenn eine Gleitkommakonvertierung zwischen verschiedenen Darstellungen erfolgt, einschließlich in oder aus Gleitkommadarstellungen ohne Gleitkomma, gelten die folgenden Regeln.

Konververtieren von einer Darstellung eines höheren Bereichs zu einer Darstellung im unteren Bereich

  • Round-to-Zero wird während der Konvertierung in ein anderes Floatformat verwendet. Wenn das Ziel ein Ganzzahl- oder Fixpunktformat ist, wird round-to-nearest-even verwendet, es sei denn, die Konvertierung wird explizit durch verwendung eines anderen Rundungsverhaltens dokumentiert, z. B. round-to-nearest für FLOAT to SNORM, FLOAT in UNORM oder FLOAT in SRGB. Andere Ausnahmen sind die Ftoi- und ftou-Shaderanweisungen, die round-to-zero verwenden. Schließlich weisen die vom Textur-Sampler und Rasterisierer verwendeten Float-zu-Fixed-Konvertierungen eine angegebene Toleranz auf, die in Unit-Last-Place von einem unendlich präzisen Ideal gemessen wird.
  • Für Quellwerte, die größer sind als der dynamische Bereich eines Zielformats eines niedrigeren Bereichs (z. B. wird ein großer 32-Bit-Float-Wert in einen 16-Bit-Float-RenderTarget geschrieben), ergibt sich der maximal darstellbare (entsprechend signierte) Wert, nicht einschließlich unendlicher Vorzeichen (aufgrund der oben beschriebenen Rundung auf Null).
  • NaN in einem Höheren Bereichsformat wird in eine NaN-Darstellung im unteren Bereichsformat konvertiert, wenn die NaN-Darstellung im unteren Bereichsformat vorhanden ist. Wenn das untere Format keine NaN-Darstellung aufweist, ist das Ergebnis 0.
  • INF in einem Höheren Bereichsformat wird im unteren Bereichsformat in INF konvertiert, sofern verfügbar. Wenn das niedrigere Format keine INF-Darstellung aufweist, wird es in den maximal darstellbaren Wert konvertiert. Das Zeichen wird beibehalten, wenn es im Zielformat verfügbar ist.
  • Die Denormierung in einem höheren Bereichsformat wird in die Denorm-Darstellung im unteren Bereichsformat konvertiert, sofern im unteren Bereichsformat verfügbar, und die Konvertierung ist möglich, andernfalls ist das Ergebnis 0. Das Zeichenbit wird beibehalten, wenn es im Zielformat verfügbar ist.

Konvertieren von einer Darstellung im unteren Bereich in eine Darstellung mit höherem Bereich

  • NaN in einem niedrigeren Bereichsformat wird in die NaN-Darstellung im höheren Bereichsformat konvertiert, sofern im Format mit höherem Bereich verfügbar. Wenn das Format des höheren Bereichs keine NaN-Darstellung aufweist, wird es in 0 konvertiert.
  • INF in einem niedrigeren Bereichsformat wird in die INF-Darstellung im höheren Bereichsformat konvertiert, sofern im Format mit höherem Bereich verfügbar. Wenn das höhere Format keine INF-Darstellung aufweist, wird es in den maximal darstellbaren Wert (MAX_FLOAT in diesem Format) konvertiert. Das Zeichen wird beibehalten, wenn es im Zielformat verfügbar ist.
  • Die Denormierung in einem niedrigeren Bereichsformat wird nach Möglichkeit in eine normalisierte Darstellung im Höheren Bereichsformat oder in eine Denorm-Darstellung im höheren Bereichsformat konvertiert, wenn die Denorm-Darstellung vorhanden ist. Wenn dies nicht der Fall ist, wird es in 0 konvertiert, wenn das Format des höheren Bereichs keine Denorm-Darstellung aufweist. Das Zeichen wird beibehalten, wenn es im Zielformat verfügbar ist. Beachten Sie, dass 32-Bit-Gleitkommazahlen als Format ohne Denorm-Darstellung zählen (da Denorms in Vorgängen auf 32-Bit-Floats leer wird, um 0 zu signieren beibehalten).

Ganzzahlige Konvertierung

In der folgenden Tabelle werden Konvertierungen aus verschiedenen oben beschriebenen Darstellungen in andere Darstellungen beschrieben. Es werden nur Konvertierungen angezeigt, die tatsächlich in Direct3D erfolgen.

Quelldatentyp Zieldatentyp Konvertierungsregel
SNORM GLEITKOMMAZAHL Bei einem ganzzahligen N-Bit-Wert, der den vorzeichenierten Bereich [-1.0f bis 1.0f] darstellt, erfolgt die Konvertierung in Gleitkomma wie folgt.
  • Der negativste Wert wird -1.0f zugeordnet. Der 5-Bit-Wert 10000 wird z. B. -1.0f zugeordnet.
  • Jeder andere Wert wird in einen Float konvertiert (nennen Sie ihn c), und dann ergebnis = c * (1,0f / (2⁽ⁿ⁻¹⁾-1)). Beispielsweise wird der 5-Bit-Wert 10001 in -15.0f konvertiert und dann durch 15.0f geteilt, was -1.0f ergibt.
GLEITKOMMAZAHL SNORM Bei einer Gleitkommazahl erfolgt die Konvertierung in einen ganzzahligen n-Bit-Wert, der den Vorzeichenbereich [-1.0f bis 1.0f] darstellt, wie folgt.
  • Lassen Sie c den Startwert darstellen.
  • Wenn c NaN ist, ist das Ergebnis 0.
  • Wenn c > 1.0f, einschließlich INF, wird es auf 1,0f geklemmt.
  • Wenn c < -1.0f, einschließlich -INF, wird es auf -1.0f geklemmt.
  • Konvertieren von Float-Skalierung in ganzzahlige Skalierung: c = c * (2ⁿ⁻¹-1).
  • Konvertieren Sie wie folgt in eine ganze Zahl.
    • Wenn c >= 0, dann c = c + 0,5f, andernfalls c = c - 0,5f.
    • Löschen Sie den Dezimalbruch, und der verbleibende Gleitkommawert (integraler Wert) wird direkt in eine ganze Zahl konvertiert.
Diese Konvertierung ist eine Toleranz von D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_Unit-Last-Place Unit-Last-Place (auf der Ganzzahlseite) zulässig. Dies bedeutet, dass nach der Konvertierung von float in ganzzahlige Skalierung jeder Wert innerhalb von D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place eines darstellbaren Zielformatwerts diesem Wert zugeordnet werden darf. Durch die zusätzliche Anforderung zur Datenumkehrbarkeit wird sichergestellt, dass die Konvertierung über den gesamten Bereich hinweg nicht erweitert wird und alle Ausgabewerte erreichbar sind. (In den hier gezeigten Konstanten sollte xx durch die Direct3D-Version ersetzt werden, z. B. 10, 11 oder 12.)
UNORM GLEITKOMMAZAHL Der N-Bit-Startwert wird in float (0.0f, 1.0f, 2.0f usw.) konvertiert und dann durch (2ⁿ-1) geteilt.
GLEITKOMMAZAHL UNORM Lassen Sie c den Startwert darstellen.
  • Wenn c NaN ist, ist das Ergebnis 0.
  • Wenn c > 1.0f, einschließlich INF, wird es auf 1,0f geklemmt.
  • Wenn c < 0,0f, einschließlich -INF, wird es auf 0,0f eingespannt.
  • Konvertieren von Float-Skalierung in ganzzahlige Skalierung: c = c * (2ⁿ-1).
  • In ganze Zahl konvertieren.
    • c = c + 0,5f.
    • Der Dezimalbruch wird gelöscht, und der verbleibende Gleitkommawert (ganzzahlig) wird direkt in eine ganze Zahl konvertiert.
Für diese Konvertierung ist eine Toleranz von D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (auf der Ganzzahlseite) zulässig. Dies bedeutet, dass nach der Konvertierung von float in ganzzahlige Skalierung jeder Wert innerhalb von D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place eines darstellbaren Zielformatwerts diesem Wert zugeordnet werden darf. Durch die zusätzliche Anforderung zur Datenumkehrbarkeit wird sichergestellt, dass die Konvertierung im gesamten Bereich nicht erweitert wird und alle Ausgabewerte erreichbar sind.
SRGB GLEITKOMMAZAHL Im Folgenden ist die ideale Konvertierung von SRGB in FLOAT aufgeführt.
  • Nehmen Sie den anfangs n-Bit-Wert, und konvertieren Sie ihn in einen Float (0,0f, 1,0f, 2,0f usw.); rufen Sie dies c auf.
  • c = c * (1.0f / (2ⁿ-1))
  • Wenn (c < = D3Dxx_SRGB_TO_FLOAT_THRESHOLD) dann: result = c / D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_1, andernfalls: result = ((c + D3Dxx_SRGB_TO_FLOAT_OFFSET)/D3Dxx_SRGB_TO_FLOAT_DENOMINATOR_2)D3Dxx_SRGB_TO_FLOAT_EXPONENT
Diese Konvertierung ist eine Toleranz von D3Dxx_SRGB_TO_FLOAT_TOLERANCE_IN_ULP Unit-Last-Place (auf srGB-Seite) zulässig.
GLEITKOMMAZAHL SRGB Im Folgenden ist die ideale FLOAT-> SRGB-Konvertierung aufgeführt.
Angenommen, die Ziel-SRGB-Farbkomponente weist n Bits auf:
  • Angenommen, der Anfangswert ist c.
  • Wenn c naN ist, ist das Ergebnis 0.
  • Wenn c > 1.0f, einschließlich INF, auf 1.0f eingespannt wird.
  • Wenn c < 0,0f, einschließlich -INF, wird es auf 0,0f eingespannt.
  • Wenn (c <= D3Dxx_FLOAT_TO_SRGB_THRESHOLD) dann: c = D3Dxx_FLOAT_TO_SRGB_SCALE_1 * c, andernfalls: 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
  • Konvertieren von Float-Skalierung in ganzzahlige Skalierung: c = c * (2ⁿ-1).
  • In ganze Zahl konvertieren:
    • c = c + 0,5f.
    • Der Dezimalbruch wird gelöscht, und der verbleibende Gleitkommawert (ganzzahlig) wird direkt in eine ganze Zahl konvertiert.
Für diese Konvertierung ist eine Toleranz von D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place (auf der Ganzzahlseite) zulässig. Dies bedeutet, dass nach der Konvertierung von float in ganzzahlige Skalierung jeder Wert innerhalb von D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place eines darstellbaren Zielformatwerts diesem Wert zugeordnet werden darf. Durch die zusätzliche Anforderung zur Datenumkehrbarkeit wird sichergestellt, dass die Konvertierung im gesamten Bereich nicht erweitert wird und alle Ausgabewerte erreichbar sind.
SINT SINT mit mehr Bits Um von SINT zu einem SINT mit mehr Bits zu konvertieren, ist das wichtigste Bit (MSB) der Startnummer "sign-extended" auf die zusätzlichen Bits, die im Zielformat verfügbar sind.
UINT SINT mit mehr Bits Um von UINT zu einem SINT mit mehr Bits zu konvertieren, wird die Zahl in die am wenigsten signifikanten Bits (LSBs) des Zielformats kopiert, und zusätzliche MSBs werden mit 0 aufgefüllt.
SINT UINT mit mehr Bits So konvertieren Sie von SINT zu UINT mit mehr Bits: Wenn der Wert negativ ist, wird der Wert auf 0 geklemmt. Andernfalls wird die Zahl in die LSBs des Zielformats kopiert, und zusätzliche MSB werden mit 0 aufgefüllt.
UINT UINT mit mehr Bits Um von UINT zu UINT mit mehr Bits zu konvertieren, wird die Zahl in die LSBs des Zielformats kopiert, und zusätzliche MSB's werden mit 0 aufgefüllt.
SINT oder UINT SINT oder UINT mit weniger oder gleichen Bits Um von einem SINT oder UINT in SINT oder UINT mit weniger oder gleichen Bits (und/oder Änderung der Signatur) zu konvertieren, wird der Startwert einfach in den Bereich des Zielformats eingespannt.

 

Fixpunkt-Ganzzahlkonvertierung

Ganze Fixpunkte sind einfach ganze Zahlen mit einer Bitgröße, die ein implizites Dezimaltrennzeichen an einer festen Position aufweisen.

Der allgegenwärtige Datentyp "integer" ist ein Sonderfall einer ganzzahligen Fixpunktzahl mit dem Dezimaltrennzeichen am Ende der Zahl.

Darstellungen von Fixpunktzahlen werden als i.f gekennzeichnet, wobei i die Anzahl der ganzzahligen Bits und f die Anzahl der Bitbruchteile ist. z. B. 16.8 bedeutet 16 Bits Integer gefolgt von 8 Bits Bruch. Der ganzzahlige Teil wird im Komplement von 2 gespeichert, zumindest wie hier definiert (obwohl er auch für ganze Zahlen ohne Vorzeichen gleichermaßen definiert werden kann). Der Teilbruchteil wird in nicht signierter Form gespeichert. Der Bruchteil stellt immer den positiven Bruch zwischen den beiden nächsten integralen Werten dar, beginnend mit dem negativsten.

Additions- und Subtraktionsoperationen für Fixpunktzahlen werden einfach mithilfe von Ganzzahl-Standardarithmetik ausgeführt, ohne dass berücksichtigt wird, wo das implizierte Dezimalkomma liegt. Das Hinzufügen von 1 zu einer 16,8-Fixpunktzahl bedeutet lediglich das Hinzufügen von 256, da das Dezimalzeichen 8 Stellen vom geringstmöglichen Ende der Zahl ausgibt. Andere Vorgänge, z. B. Multiplikation, können auch einfach mit ganzzahliger Arithmetik ausgeführt werden, sofern die Auswirkung auf das feste Dezimalkomma berücksichtigt wird. Wenn Sie z. B. zwei ganze Zahlen mit 16,8 mit einer ganzzahligen Multiplikation multiplizieren, wird ein 32,16-Ergebnis erzeugt.

Feste Ganzzahldarstellungen werden in Direct3D auf zwei Arten verwendet.

  • Nachbeschneidete Vertexpositionen im Rasterizer werden an einen festen Punkt angedockt, um die Genauigkeit gleichmäßig auf den RenderTarget-Bereich zu verteilen. Viele Rasterizer-Vorgänge, einschließlich Gesichtskulling als Beispiel, treten auf fixpunktgerackten Positionen auf, während andere Vorgänge, z. B. die Einrichtung des Attributinterpolators, Positionen verwenden, die von den angedockten Fixpunktpositionen zurück in gleitkommagestellte Positionen konvertiert wurden.
  • Texturkoordinaten für Samplingvorgänge werden an einen festen Punkt angedockt (nachdem sie nach Texturgröße skaliert wurden), um die Genauigkeit gleichmäßig auf den Texturraum zu verteilen, indem Filterpunktpositionen/-gewichtungen ausgewählt werden. Gewichtungswerte werden zurück in Gleitkommawerte konvertiert, bevor die eigentliche Filterarithmetik ausgeführt wird.
Quelldatentyp Zieldatentyp Konvertierungsregel
GLEITKOMMAZAHL Ganze Fixpunktzahl Im Folgenden wird das allgemeine Verfahren zum Konvertieren einer Gleitkommazahl n in eine ganzzahlige Fixpunktzahl i.f beschrieben, wobei i die Anzahl der (signierten) ganzzahligen Bits und f die Anzahl der Bruchbits ist.
  • Compute FixedMin = -2⁽ⁱ⁻¹⁾
  • Compute FixedMax = 2⁽ⁱ⁻¹⁾ - 2(-f)
  • Wenn n ein NaN ist, ergebnis = 0; wenn n +Inf ist, ergebnis = FixedMax*2f; wenn n -Inf ist, ergebnis = FixedMin*2f
  • Wenn n >= FixedMax, result = Fixedmax*2f; if n <= FixedMin, result = FixedMin*2f
  • Andernfalls wird n*2f berechnet und in eine ganze Zahl konvertiert.
Implementierungen sind D3Dxx_FLOAT32_TO_INTEGER_TOLERANCE_IN_ULP Unit-Last-Place-Toleranz im Ganzzahlergebnis statt des unendlich genauen Werts n*2f nach dem letzten Schritt oben zulässig.
Ganze Fixpunktzahl GLEITKOMMAZAHL Angenommen, die spezifische Fixpunktdarstellung, die in float konvertiert wird, enthält nicht mehr als 24 Bits an Informationen, von denen sich nicht mehr als 23 Bits in der Bruchkomponente befinden. Angenommen, eine angegebene Fixpunktzahl, fxp, hat die Form i.f (i Bits integer, f bits fraction). Die Konvertierung in float ähnelt dem folgenden Pseudocode.
float result = (float)(fxp >> f) + // extract integer
((float)(fxp & (2f - 1)) / (2f)); Extrahieren des Bruchteils

 

Ressourcen (Direct3D 10)