Datenkonvertierungsregeln
In den folgenden Abschnitten wird beschrieben, wie Direct3D Konvertierungen zwischen Datentypen behandelt.
- Datentypterminologie
- Gleitkommakonvertierung
- Ganzzahlkonvertierung
- Ganzzahlige Konvertierung mit festem Punkt
- Zugehörige Themen
Datentypterminologie
Anschließend werden die folgenden Begriffe verwendet, um verschiedene Formatkonvertierungen zu charakterisieren.
| Begriff | Definition |
|---|---|
| SNORM | Normalisierte ganze Zahl mit Vorzeichen, d.h. für die Komplementnummer eines n-Bit-2 bedeutet der Höchstwert 1,0f (z.B. wird der 5-Bit-Wert 01111 1,0f zugeordnet), 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 von ganzzahligen Darstellungen für gleitkommawerte mit gleichmäßiger Leerstelle im Bereich (-1,0f... 0,0f) und eine ergänzende Gruppe 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-Werte 0,0f und alle 1-Werte 1,0f bedeuten. Eine Sequenz von gleitkommawerten mit geradem Abstand von 0,0f bis 1,0f wird dargestellt. Beispielsweise stellt eine 2-Bit-UNORM 0,0f, 1/3, 2/3 und 1,0f dar. |
| SINT | Ganze Zahl mit Vorzeichen. Die Komplement-Ganzzahl von 2. Beispielsweise stellt ein 3-Bit-SINT die Ganzzahlwerte -4, -3, -2, -1, 0, 1, 2, 3 dar. |
| UINT | Ganze Zahl ohne Vorzeichen. Beispielsweise stellt ein 3-Bit-UINT die Ganzzahlwerte 0, 1, 2, 3, 4, 5, 6, 7 dar. |
| GLEITKOMMAZAHL | Ein Gleitkommawert in einer der durch Direct3D definierten Darstellungen. |
| SRGB | Ähnlich wie bei UNORM bedeutet dies, dass für eine n-Bit-Zahl alle 0(e) 0,0f und alle 1 für 1,0f bedeuten. Im Gegensatz zu UNORM stellt die Sequenz von ganzzahligen Codierungen ohne Vorzeichen zwischen allen 1ern von 0 bis 1 jedoch einen nicht linearen Fortschritt in der Gleitkommainterpretation der Zahlen zwischen 0,0f und 1,0f dar. Wenn dieser nicht lineare Fortschritt (SRGB) in etwa als Sequenz von Farben angezeigt wird, wird er als lineare Rampe von Helligkeitsstufen für einen "durchschnittlichen" Beobachter unter "durchschnittlichen" Anzeigebedingungen auf einer "durchschnittlichen" Anzeige angezeigt. Ausführliche Informationen finden Sie im SRGB-Farbstandard IEC 61996-2-1 unter IEC (Internationale Elektrotechnische Kommission). |
Gleitkommakonvertierung
Immer wenn eine Gleitkommakonvertierung zwischen verschiedenen Darstellungen auftritt, einschließlich in oder aus Nicht-Gleitkommadarstellungen, gelten die folgenden Regeln.
Konververtierung von einer Darstellung eines höheren Bereichs zu einer Darstellung im unteren Bereich
- Round-to-Zero wird während der Konvertierung in ein anderes float-Format verwendet. Wenn das Ziel ein Ganzzahl- oder Festkommaformat ist, wird "Round-to-Nearest-even" verwendet, es sei denn, die Konvertierung wird explizit mit einem anderen Rundungsverhalten dokumentiert, z. B. "Round-to-Nearest" für FLOAT in SNORM, FLOAT in UNORM oder FLOAT in SRGB. Andere Ausnahmen sind die Ftoi- und ftou-Shaderanweisungen, die Round-to-Zero verwenden. Schließlich verfügen die vom Textur sampler und rasterizer verwendeten Gleitkommakonvertierungen in feste Werte über eine angegebene Toleranz, die in Unit-Last-Place von einem unendlich präzisen Ideal aus gemessen wird.
- Für Quellwerte, die größer als der dynamische Bereich eines Zielformats mit niedrigerem Bereich sind (z. B. Ein großer 32-Bit-Gleitkommawert wird in ein 16-Bit-Float-RenderTarget geschrieben. Dabei handelt es sich um die maximal darstellbaren (entsprechend signierten) Wertergebnisse, DIE NICHT mit Vorzeichen unendlich sind (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 hat, ist das Ergebnis 0.
- INF in einem höheren Bereichsformat wird im unteren Bereichsformat in INF konvertiert, falls verfügbar. Wenn das untere Format keine INF-Darstellung hat, wird es in den maximal darstellbaren Wert konvertiert. Das Vorzeichen wird beibehalten, wenn es im Zielformat verfügbar ist.
- Denorm 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 Vorzeichenbit wird beibehalten, wenn es im Zielformat verfügbar ist.
Konvertieren von einer Darstellung im unteren Bereich in eine höhere Bereichsdarstellung
- NaN in einem niedrigeren Bereichsformat wird in die NaN-Darstellung im höheren Bereichsformat konvertiert, sofern im höheren Bereichsformat verfügbar. Wenn das höhere Bereichsformat keine NaN-Darstellung hat, wird es in 0 konvertiert.
- INF in einem niedrigeren Bereichsformat wird in die INF-Darstellung im höheren Bereichsformat konvertiert, sofern im höheren Bereichsformat verfügbar. Wenn das höhere Format keine INF-Darstellung hat, wird es in den maximal darstellbaren Wert konvertiert (MAX _ FLOAT in diesem Format). Das Vorzeichen wird beibehalten, wenn es im Zielformat verfügbar ist.
- Denorm in einem niedrigeren Bereichsformat wird nach Möglichkeit in eine normalisierte Darstellung im höheren Bereichsformat konvertiert, oder in eine Denorm-Darstellung im höheren Bereichsformat, wenn die Denorm-Darstellung vorhanden ist. Wenn das höhere Bereichsformat nicht über eine Denorm-Darstellung verfügt, wird es in 0 konvertiert. Das Vorzeichen 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 für 32-Bit-Gleitkommawerte leert, um das Vorzeichen beizubehalten 0).
Ganzzahlkonvertierung
In der folgenden Tabelle werden Konvertierungen von verschiedenen oben beschriebenen Darstellungen in andere Darstellungen beschrieben. Es werden nur Konvertierungen angezeigt, die tatsächlich in Direct3D auftreten.
| Quelldatentyp | Zieldatentyp | Konvertierungsregel |
|---|---|---|
| SNORM | GLEITKOMMAZAHL | Bei einem n-Bit-Ganzzahlwert, der den Bereich mit Vorzeichen [-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 Bereich mit Vorzeichen [-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 finden Sie die ideale SRGB- in FLOAT-Konvertierung.
|
| GLEITKOMMAZAHL | SRGB | Im Folgenden finden Sie die ideale FLOAT -> SRGB-Konvertierung. Angenommen, die SRGB-Zielfarbkomponente verfügt über n Bits:
|
| SINT | SINT mit mehr Bits | Um von SINT in ein SINT mit mehr Bits zu konvertieren, wird das wichtigste Bit (MSB) der Startnummer " auf die zusätzlichen Bits erweitert, " die im Zielformat verfügbar sind. |
| UINT | SINT mit mehr Bits | Um von UINT in ein SINT mit mehr Bits zu konvertieren, wird die Zahl in die LSBs (Least Significant Bits) des Zielformats kopiert, und zusätzliche MSBs werden mit 0 aufgefüllt. |
| SINT | UINT mit mehr Bits | So konvertieren Sie von SINT in UINT mit mehr Bits: Wenn negativ, wird der Wert an 0 (null) klammern. Andernfalls wird die Zahl in die LSBs des Zielformats kopiert, und zusätzliche MSB-Dateien werden mit 0 aufgefüllt. |
| UINT | UINT mit mehr Bits | Zum Konvertieren von UINT in UINT mit mehr Bits wird die Zahl in die LSBs des Zielformats kopiert, und zusätzliche MSBs werden mit 0 aufgefüllt. |
| SINT oder UINT | SINT oder UINT mit weniger oder gleichen Bits | Zum Konvertieren von einem SINT- oder UINT-Wert in SINT oder UINT mit weniger oder gleichen Bits (und/oder Änderung der Vorzeichen) wird der Startwert einfach an den Bereich des Zielformats angepasst. |
Ganzzahlige Konvertierung mit festem Punkt
Ganzzahlen mit festem Punkt sind einfach ganze Zahlen mit einer Bitgröße, die ein implizites Dezimaltrennzeichen an einer festen Position aufweisen.
Der ubiquitäre Datentyp "integer" ist ein Sonderfall einer ganzzahligen Festkommazahl mit dem Dezimalwert am Ende der Zahl.
Darstellungen von Festkommazahlen sind folgendermaßen gekennzeichnet: i.f, wobei i die Anzahl ganzzahliger Bits und f die Anzahl der Bruchbits ist. Beispielsweise bedeutet 16,8 eine ganze Zahl von 16 Bits gefolgt von 8 Bits fraction. Der ganzzahlige Teil wird im Komplement von 2 gespeichert, zumindest wie hier definiert (obwohl es auch für ganze Zahlen ohne Vorzeichen gleich definiert werden kann). Der Bruchteil wird in nicht signierter Form gespeichert. Der Bruchteil stellt immer den positiven Bruch zwischen den beiden nächsten ganzzahligen Werten dar, beginnend mit dem negativsten.
Additions- und Subtraktionsvorgänge für Festkommazahlen werden einfach mithilfe von ganzzahligen Standardarithmetik durchgeführt, ohne dass berücksichtigt wird, wo die implizite Dezimalzahl liegt. Das Hinzufügen von 1 zu einer festen Punktzahl von 16,8 bedeutet lediglich das Hinzufügen von 256, da die Dezimalzahl 8 Stellen vom am wenigsten signifikanten Ende der Zahl entfernt ist. Andere Vorgänge wie die Multiplikation können auch einfach mit ganzzahliger Arithmetik ausgeführt werden, vorausgesetzt, die Auswirkung auf die feste Dezimalzahl wird berücksichtigt. Die Multiplikation von zwei 16,8 ganzzahligen Zahlen mit einer ganzzahligen Multiplikation führt beispielsweise zu einem Ergebnis von 32,16.
Ganzzahldarstellungen mit Festkommawerten werden in Direct3D auf zwei Arten verwendet.
- Nachgeschnittene Scheitelpunktpositionen im Rasterizer werden an einem festen Punkt ausgerichtet, um die Genauigkeit gleichmäßig auf den RenderTarget-Bereich zu verteilen. Viele Rasterizervorgänge, z. B. die Gesichtskeulung, treten an fixierten Positionen auf, während andere Vorgänge, z. B. die Einrichtung des Attributinterpolators, Positionen verwenden, die von den fixierten Positionen zurück in Gleitkomma konvertiert wurden.
- Texturkoordinaten für Samplingvorgänge werden an einem festen Punkt ausgerichtet (nachdem sie durch die Texturgröße skaliert wurden), um die Genauigkeit gleichmäßig auf den Texturraum zu verteilen, indem Die Positionen/Gewichtungen des Filtertippens ausgewählt werden. Gewichtungswerte werden wieder in Gleitkommawerte konvertiert, bevor die eigentliche Filterarithmetik durchgeführt wird.
| Quelldatentyp | Zieldatentyp | Konvertierungsregel |
|---|---|---|
| GLEITKOMMAZAHL | Ganze Zahl mit festem Punkt | Im Folgenden finden Sie das allgemeine Verfahren zum Konvertieren einer Gleitkommazahl n in eine ganzzahlige Festkommazahl i.f, wobei i die Anzahl der ganzzahligen Bits (mit Vorzeichen) und f die Anzahl der Bruchbits ist.
|
| Ganze Zahl mit festem Punkt | GLEITKOMMAZAHL | Angenommen, die spezifische Festkommadarstellung, die in float konvertiert wird, enthält nicht mehr als insgesamt 24 Bits an Informationen, von denen sich nicht mehr als 23 Bits in der Bruchteilkomponente befinden. Angenommen, eine angegebene feste Punktzahl, 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
|