Datenkonvertierungsregeln
In den folgenden Abschnitten wird beschrieben, wie Direct3D Konvertierungen zwischen Datentypen verarbeitet.
- Datentypterminologie
- Gleitkommakonvertierung
- Ganzzahlige Konvertierung
- Ganzzahlige Fixpunktkonvertierung
- Zugehörige Themen
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.
|
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.
|
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.
|
SRGB | GLEITKOMMAZAHL | Im Folgenden ist die ideale Konvertierung von SRGB in FLOAT aufgeführt.
|
GLEITKOMMAZAHL | SRGB | Im Folgenden ist die ideale FLOAT-> SRGB-Konvertierung aufgeführt. Angenommen, die Ziel-SRGB-Farbkomponente weist n Bits auf:
|
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.
|
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
|
Zugehörige Themen