Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In den folgenden Abschnitten wird beschrieben, wie Direct3D Konvertierungen zwischen Datentypen verarbeitet.
- Terminologie für Datentypen
- Gleitkommakonvertierung
- Ganzzahlkonvertierung
- Festkomma-Ganzzahlkonvertierung
- Verwandte Themen
Terminologie für Datentypen
Der folgende Satz von Begriffen wird anschließend verwendet, um verschiedene Formatkonvertierungen zu charakterisieren.
Ausdruck | Definition |
---|---|
SNORM | Signierte normalisierte ganze Zahl, d. h. für die Ergänzungsnummer einer n-Bit 2 bedeutet der Maximalwert 1,0f (z. B. der 5-Bit-Wert 01111 entspricht 1,0f), und der Minimalwert bedeutet -1,0f (z. B. der 5-Bit-Wert 10000 entspricht -1,0f). Darüber hinaus entspricht die zweite Mindestzahl -1,0f (z. B. der 5-Bit-Wert 10001 entspricht -1,0f). 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äßige Gleitkommawerte im Bereich (-1,0f... 0,0f) und auch eine ergänzende Gruppe von Darstellungen für Zahlen im Bereich (0,0f... 1.0f) |
UNORM | Nicht signierte normalisierte ganze Zahl, was bedeutet, dass für eine n-Bit-Zahl alle 0 0 0,0f bedeuten, und alle 1 bedeutet 1,0f. Eine Abfolge von gleichmäßigen Gleitkommawerten von 0,0f bis 1,0f wird dargestellt. z. B. eine 2-Bit-UNORM steht für 0,0f, 1/3, 2/3 und 1,0f. |
SINT | Signierte ganze Zahl. Die Komplementzahl von 2. Beispielsweise stellt ein 3-Bit-SINT die integralen Werte -4, -3, -2, -1, 0, 1, 2, 3 dar. |
UINT | Ganzzahl ohne Vorzeichen. Beispielsweise stellt ein 3-Bit-UINT die integralen Werte 0, 1, 2, 3, 4, 5, 6, 7 dar. |
SCHWEBEN | Ein Gleitkommawert in einer der von Direct3D definierten Darstellungen. |
SRGB | Ähnlich wie UNORM bedeutet alle 0 für eine n-Bit-Zahl 0 0f und alle 1 1f 1.0f. Im Gegensatz zu UNORM stellen SRGB bei der Sequenz nicht signierter ganzzahliger Codierungen zwischen allen 0 und allen 1 eine nichtlineare Entwicklung in der Gleitkommainterpretation der Zahlen zwischen 0,0f und 1,0f dar. Wenn diese nichtlineare Entwicklung, SRGB, als Eine Reihe von Farben angezeigt wird, würde es als lineare Rampe der Leuchtdichtestufen zu einem "durchschnittlichen" Beobachter unter "durchschnittlichen" Anzeigebedingungen auf einer "durchschnittlichen" Anzeige erscheinen. Ausführliche Informationen finden Sie unter der SRGB-Farbnorm IEC 61996-2-1 bei IEC (International Electrotechnical Commission). |
Gleitkommakonvertierung
Immer wenn eine Gleitkommakonvertierung zwischen verschiedenen Darstellungen erfolgt, einschließlich zu oder aus nicht gleitkommafreien Darstellungen, gelten die folgenden Regeln.
Konvertieren von einer Darstellung eines höheren Bereichs zu einer Darstellung eines niedrigeren Bereichs
- Round-to-Zero wird während der Konvertierung in ein anderes Float-Format verwendet. Wenn das Ziel ein ganzzahliges oder festes Punktformat ist, wird round-to-nearest-even verwendet, es sei denn, die Konvertierung wird explizit unter Verwendung eines anderen Rundungsverhaltens dokumentiert, z. B. round-to-nearest for FLOAT to SNORM, FLOAT to UNORM oder FLOAT to SRGB. Andere Ausnahmen sind die Ftoi- und ftou-Shaderanweisungen, die round-to-zero verwenden. Schließlich haben die float-to-fixed Konvertierungen, die vom Textursampler und Rasterizer verwendet werden, eine angegebene Toleranz in Unit-Last-Place von einem unendlich genauen Ideal.
- Für Quellwerte, die größer als der dynamische Bereich eines niedrigeren Zielformats sind (z. B. ein großer 32-Bit-Float-Wert wird in einen 16-Bit-Float-RenderTarget geschrieben), die maximal darstellbaren (entsprechend signierten) Wertergebnisse, NICHT einschließlich signierter Unendlichkeit (aufgrund der oben beschriebenen Runde auf Null).
- NaN in einem Format für einen höheren Bereich wird in naN-Darstellung im Format des unteren Bereichs konvertiert, wenn die NaN-Darstellung im Format des unteren Bereichs vorhanden ist. Wenn das untere Format keine NaN-Darstellung aufweist, lautet das Ergebnis 0.
- INF in einem Format für einen höheren Bereich wird in INF im Format des unteren Bereichs konvertiert, falls verfügbar. Wenn das untere Format keine INF-Darstellung aufweist, wird es in den maximal dargestellten Wert konvertiert. Das Zeichen wird beibehalten, wenn es im Zielformat verfügbar ist.
- Denorm in einem Format für einen höheren Bereich wird in die Denorm-Darstellung im Unteren Bereichsformat konvertiert, sofern im Format für den unteren Bereich 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 eines niedrigeren Bereichs in eine Darstellung eines höheren Bereichs
- NaN in einem Format für einen niedrigeren Bereich wird in die NaN-Darstellung im Format für den höheren Bereich konvertiert, falls im Format für einen höheren Bereich verfügbar. Wenn das Format für den höheren Bereich keine NaN-Darstellung aufweist, wird es in 0 konvertiert.
- INF in einem Format für einen niedrigeren Bereich wird in die INF-Darstellung im Format höherer Bereiche konvertiert, wenn es im Format für einen höheren Bereich verfügbar ist. Wenn das höhere Format keine INF-Darstellung aufweist, wird es in den maximal dargestellten Wert konvertiert (MAX_FLOAT in diesem Format). Das Zeichen wird beibehalten, wenn es im Zielformat verfügbar ist.
- Denorm in einem Niedrigeren Bereichsformat wird nach Möglichkeit in eine normalisierte Darstellung im Format für einen höheren Bereich oder in eine Denorm-Darstellung im Format höherer Bereiche konvertiert, wenn die Denorm-Darstellung vorhanden ist. Wenn das Format für den höheren Bereich keine Denorm-Darstellung aufweist, wird das Format nicht in 0 konvertiert. 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 in 32-Bit-Floats geleert werden, um zu signieren, 0 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 auftreten.
Quelldatentyp | Zieldatentyp | Konvertierungsregel |
---|---|---|
SNORM | SCHWEBEN | Bei einem ganzzahligen n-Bit-Wert, der den signierten Bereich [-1,0f zu 1,0f] darstellt, lautet die Konvertierung in Gleitkomma wie folgt.
|
SCHWEBEN | SNORM | Bei einer Gleitkommazahl entspricht die Konvertierung in einen ganzzahligen n-Bit-Wert, der den signierten Bereich [-1,0f zu 1,0f] darstellt.
|
UNORM | SCHWEBEN | Der erste n-Bit-Wert wird in float (0,0f, 1,0f, 2,0f usw.) konvertiert und dann durch (2ⁿ-1) dividiert. |
SCHWEBEN | UNORM | Let c represent the starting value.
|
SRGB | SCHWEBEN | Es folgt die ideale SRGB to FLOAT-Konvertierung.
|
SCHWEBEN | SRGB | Es folgt die ideale FLOAT -> SRGB-Konvertierung. Vorausgesetzt, die Ziel-SRGB-Farbkomponente weist n Bits auf:
|
SINT | SINT mit weiteren Bits | Zum Konvertieren von SINT in einen SINT mit mehr Bits ist das wichtigste Bit (MSB) der Startnummer "sign-extended" auf die zusätzlichen Bits, die im Zielformat verfügbar sind. |
UINT | SINT mit weiteren Bits | Um von UINT in einen 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 weiteren Bits | Zum Konvertieren von SINT in UINT mit mehr Bits: Wenn negativ, wird der Wert auf 0 geklemmt. Andernfalls wird die Zahl in die LSBs des Zielformats kopiert, und zusätzliche MSB-Dateien werden mit 0 aufgefüllt. |
UINT | UINT mit weiteren Bits | Zum Konvertieren von UINT in UINT mit mehr Bits wird die Zahl in die LSBs des Zielformats kopiert, und zusätzliche MSB-Dateien werden mit 0 aufgefüllt. |
SINT oder UINT | SINT oder UINT mit weniger oder gleich Bits | Zum Konvertieren von SINT oder UINT in SINT oder UINT mit weniger oder gleicher Bits (und/oder Änderung der Signiertheit) wird der Startwert einfach an den Bereich des Zielformats geklemmt. |
Ganzzahlige Festkommakonvertierung
Festkommazahlen sind einfach ganze Zahlen mit einer Bitgröße, die an einer festen Position einen impliziten Dezimalkommapunkt aufweisen.
Der ubiquitöse Datentyp "integer" ist ein Sonderfall einer ganzzahligen Festen Punkt mit dem Dezimalzeichen am Ende der Zahl.
Festkommazahlendarstellungen sind gekennzeichnet als: i.f, wobei i die Anzahl der ganzzahligen Bits und f die Anzahl der Bruchbits ist. 16,8 bedeutet z. B. 16 Bit ganze Zahl gefolgt von 8 Bits Bruchzahl. Der ganzzahlige Teil wird in der Ergänzung von 2 gespeichert, zumindest wie hier definiert (obwohl er auch für nicht signierte ganze Zahlen gleich definiert werden kann). Der Bruchteil wird in nicht signierter Form gespeichert. Der Bruchteil stellt immer den positiven Bruch zwischen den beiden nächstgelegenen integralen Werten dar, beginnend mit dem negativsten.
Additions- und Subtraktionsvorgänge für Festkommazahlen werden einfach mit einer standardmäßigen ganzzahligen Arithmetik ausgeführt, ohne dass berücksichtigt wird, wo das implizierte Dezimalzeichen liegt. Das Hinzufügen von 1 zu einer 16,8 festen Punktzahl bedeutet lediglich das Hinzufügen von 256, da die Dezimalzahl 8 Stellen vom niedrigsten signifikanten Ende der Zahl ist. Andere Vorgänge wie die Multiplikation können auch einfach mit ganzzahliger Arithmetik durchgeführt werden, vorausgesetzt, der Effekt auf das feste Dezimaltrennzeichen wird berücksichtigt. Das Multiplizieren von zwei 16,8 ganzzahligen Zahlen mit einer ganzzahligen Multiplikation erzeugt beispielsweise ein Ergebnis von 32,16.
Ganzzahlige Festkommadarstellungen werden in Direct3D auf zwei Arten verwendet.
- Postgeschnittene Vertexpositionen im Rasterizer werden an festen Punkt angedockt, um die Genauigkeit gleichmäßig über den RenderTarget-Bereich zu verteilen. Viele Rasterizervorgänge, einschließlich Gesichts-Culling als Beispiel, treten an angedockten Positionen an festen Punkten auf, während andere Vorgänge, z. B. die Einrichtung von Attributinterpolator, Positionen verwenden, die von den angedockten Positionen des festen Punkts in Gleitkommastellen konvertiert wurden.
- Texturkoordinaten für Samplingvorgänge werden an festen Punkt angedockt (nachdem sie nach Texturgröße skaliert wurden), um die Genauigkeit gleichmäßig über den Texturraum zu verteilen, bei der Auswahl von Filterzapfpositionen/-gewichtungen. Gewichtungswerte werden zurück in Gleitkomma konvertiert, bevor die tatsächliche Filterarithmetik ausgeführt wird.
Quelldatentyp | Zieldatentyp | Konvertierungsregel |
---|---|---|
SCHWEBEN | Ganzzahliger Fixpunkt | Im Folgenden sehen Sie das allgemeine Verfahren zum Konvertieren einer Gleitkommazahl n in eine ganzzahlige Festkommazahl i.f, wobei i die Anzahl von (signierten) ganzzahligen Bits und f die Anzahl der Bruchbits ist.
|
Ganzzahliger Fixpunkt | SCHWEBEN | Gehen Sie davon aus, dass die spezifische Festkommadarstellung, die in Float konvertiert wird, nicht mehr als insgesamt 24 Bits von Informationen enthält, von denen sich nicht mehr als 23 Bit in der Bruchkomponente befindet. Angenommen, eine bestimmte Feste Punktzahl, fxp, ist in i.f-Form (i Bit ganze Zahl, f Bits Bruch). Die Konvertierung in float entspricht dem folgenden Pseudocode. float result = (float)(fxp >> f) + // extract integer
|
Verwandte Themen