BC6H-FormatBC6H format

Das BC6H-Format ist ein Textur Komprimierungs Format, das für die Unterstützung von HDR-Farbräumen (High Dynamic Range) in Quelldaten konzipiert ist.The BC6H format is a texture compression format designed to support high-dynamic range (HDR) color spaces in source data.

Informationen zum BC6H/DXGI- _ Format _ BC6HAbout BC6H/DXGI_FORMAT_BC6H

Das BC6H-Format bietet hochwertige Komprimierung für Bilder, die drei HDR-Farbkanäle verwenden, mit einem 16-Bit-Wert für jeden Farbkanal des Werts (16:16:16).The BC6H format provides high-quality compression for images that use three HDR color channels, with a 16-bit value for each color channel of the value (16:16:16). Es gibt keine Unterstützung für einen Alphakanal.There is no support for an alpha channel.

BC6H wird durch die folgenden DXGI- _ formatenumerationswerte angegeben:BC6H is specified by the following DXGI_FORMAT enumeration values:

  • DXGI _ Format _ BC6H _ typlose Formatierung.DXGI_FORMAT_BC6H_TYPELESS.
  • DXGI _ Format _ BC6H _ UF16.DXGI_FORMAT_BC6H_UF16. Dieses BC6H-Format verwendet kein Signier Bit in den 16-Bit-Farb Kanal Werten für Gleit Komma Zahlen.This BC6H format does not use a sign bit in the 16-bit floating point color channel values.
  • DXGI _ Format _ BC6H _ SF16.DXGI_FORMAT_BC6H_SF16. Dieses BC6H-Format verwendet ein Signier Bit in den 16-Bit-Farb Kanal Werten für Gleit Komma Zahlen.This BC6H format uses a sign bit in the 16-bit floating point color channel values.

Hinweis    Das 16-Bit-Gleit Komma Format für Farbkanäle wird häufig als "halb"-Gleit Komma Format bezeichnet.Note   The 16 bit floating point format for color channels is often referred to as a "half" floating point format. Dieses Format weist das folgende bitlayout auf:This format has the following bit layout: | | | |-----------------------|-------------------------------------------------| | UF16 (unsigned float)UF16 (unsigned float) | 5 Exponent Bits + 11 Mantisse Bits5 exponent bits + 11 mantissa bits | | SF16 (mit Vorzeichen signiert)SF16 (signed float) | 1 Vorzeichen Bit + 5 Exponent Bits + 10 Mantisse Bits1 sign bit + 5 exponent bits + 10 mantissa bits |

 

 

Das BC6H-Format kann für die Textur Ressourcen Texture2D (einschließlich Arrays), Texture3D oder texturecube (einschließlich Arrays) verwendet werden.The BC6H format can be used for Texture2D (including arrays), Texture3D, or TextureCube (including arrays) texture resources. Ebenso gilt dieses Format für alle mit diesen Ressourcen verknüpften MIP-Map-Oberflächen.Similarly, this format applies to any MIP-map surfaces associated with these resources.

BC6H verwendet eine fester Blockgröße von 16 Bytes (128 Bits) und eine fixierte Kachel Größe von 4 x 4 texeln.BC6H uses a fixed block size of 16 bytes (128 bits) and a fixed tile size of 4x4 texels. Wie bei früheren BC-Formaten werden Textur Bilder, die größer als die unterstützte Kachel Größe (4X4) sind, mithilfe mehrerer Blöcke komprimiert.As with previous BC formats, texture images larger than the supported tile size (4x4) are compressed by using multiple blocks. Diese Adressierungs Identität gilt auch für dreidimensionale Bilder, MIP-Maps, Cubemaps und Textur Arrays.This addressing identity applies also to three-dimensional images, MIP-maps, cube maps, and texture arrays. Alle Bildkacheln müssen das gleiche Format aufweisen.All image tiles must be of the same format.

Einschränkungen im BC6H-Format:Caveats with the BC6H format:

  • BC6H unterstützt die Floating-Point-Denormalisierung, unterstützt jedoch nicht inf (unendlich) und NaN (keine Zahl).BC6H supports floating point denormalization, but does not support INF (infinity) and NaN (not a number). Die Ausnahme ist der signierte Modus von BC6H (DXGI _ Format _ BC6H _ SF16), der-INF unterstützt (minus unendlich).The exception is the signed mode of BC6H (DXGI_FORMAT_BC6H_SF16), which supports -INF (negative infinity). Diese Unterstützung für-INF ist lediglich ein Element des Formats selbst und wird nicht ausdrücklich von Encodern für dieses Format unterstützt.This support for -INF is merely an artifact of the format itself, and is not specifically supported by encoders for this format. Wenn ein Encoder in der Regel inf-(positive oder negative) oder NaN-Eingabedaten erkennt, sollte der Encoder diese Daten in den maximal zulässigen nicht-INF-Darstellungs Wert konvertieren und Nan vor der Komprimierung zu 0 zuordnen.In general, when an encoder encounters INF (positive or negative) or NaN input data, the encoder should convert that data to the maximum allowable non-INF representation value, and map NaN to 0 prior to compression.
  • BC6H unterstützt keinen Alphakanal.BC6H does not support an alpha channel.
  • Der BC6H-Decoder führt die Komprimierung aus, bevor die Textur Filterung durchführt.The BC6H decoder performs decompression before it performs texture filtering.
  • Die BC6H-Komprimierung muss etwas genau sein. Das heißt, dass die Hardware Ergebnisse zurückgeben muss, die mit dem in dieser Dokumentation beschriebenen Decoder identisch sind.BC6H decompression must be bit-accurate; that is, the hardware must return results that are identical to the decoder described in this documentation.

BC6H-ImplementierungBC6H implementation

Ein BC6H-Block besteht aus modusbits, komprimierten Endpunkten, komprimierten Indizes und einem optionalen Partitions Index.A BC6H block consists of mode bits, compressed endpoints, compressed indices, and an optional partition index. Dieses Format gibt 14 verschiedene Modi an.This format specifies 14 different modes.

Eine Endpunktfarbe wird als RGB-Dreieck gespeichert.An endpoint color is stored as an RGB triplet. BC6H definiert eine Palette von Farben in einer ungefähren Linie für eine Reihe definierter Farb Endpunkte.BC6H defines a palette of colors on an approximate line across a number of defined color endpoints. Abhängig vom Modus kann eine Kachel auch in zwei Bereiche aufgeteilt oder als eine einzelne Region behandelt werden, in der eine Kachel mit zwei Regionen über einen separaten Satz von Farb Endpunkten für jede Region verfügt.Also, depending on the mode, a tile can be divided into two regions or treated as a single region, where a two-region tile has a separate set of color endpoints for each region. BC6H speichert einen Palettenindex pro Texel.BC6H stores one palette index per texel.

Im Fall von zwei Regionen gibt es 32 mögliche Partitionen.In the two-region case, there are 32 possible partitions.

Decodieren des BC6H-FormatsDecoding the BC6H format

Der folgende Pseudo Code zeigt die Schritte zum Dekomprimieren des Pixels bei (x, y), wenn der 16-Byte-BC6H-Block angegeben wird.The pseudocode below shows the steps to decompress the pixel at (x,y) given the 16 byte BC6H block.

decompress_bc6h(x, y, block)
{
    mode = extract_mode(block);
    endpoints;
    index;
    
    if(mode.type == ONE)
    {
        endpoints = extract_compressed_endpoints(mode, block);
        index = extract_index_ONE(x, y, block);
    }
    else //mode.type == TWO
    {
        partition = extract_partition(block);
        region = get_region(partition, x, y);
        endpoints = extract_compressed_endpoints(mode, region, block);
        index = extract_index_TWO(x, y, partition, block);
    }
    
    unquantize(endpoints);
    color = interpolate(index, endpoints);
    finish_unquantize(color);
}

Die folgende Tabelle enthält die Bitanzahl und die Werte für jedes der 14 möglichen Formate für BC6H-Blöcke.The following table contains the bit count and values for each of the 14 possible formats for BC6H blocks.

ModeMode Partitions IndizesPartition Indices PartitionPartition Farb EndpunkteColor Endpoints ModusbitsMode Bits
11 46 Bits46 bits 5 Bits5 bits 75 Bits (10,555, 10,555, 10,555)75 bits (10.555, 10.555, 10.555) 2 Bits (00)2 bits (00)
22 46 Bits46 bits 5 Bits5 bits 75 Bits (7666, 7666, 7666)75 bits (7666, 7666, 7666) 2 Bits (01)2 bits (01)
33 46 Bits46 bits 5 Bits5 bits 72 Bits (11,555, 11,444, 11,444)72 bits (11.555, 11.444, 11.444) 5 Bits (00010)5 bits (00010)
44 46 Bits46 bits 5 Bits5 bits 72 Bits (11,444, 11,555, 11,444)72 bits (11.444, 11.555, 11.444) 5 Bits (00110)5 bits (00110)
55 46 Bits46 bits 5 Bits5 bits 72 Bits (11,444, 11,444, 11,555)72 bits (11.444, 11.444, 11.555) 5 Bits (01010)5 bits (01010)
66 46 Bits46 bits 5 Bits5 bits 72 Bits (9555, 9555, 9555)72 bits (9555, 9555, 9555) 5 Bits (01110)5 bits (01110)
77 46 Bits46 bits 5 Bits5 bits 72 Bits (8666, 8555, 8555)72 bits (8666, 8555, 8555) 5 Bits (10010)5 bits (10010)
88 46 Bits46 bits 5 Bits5 bits 72 Bits (8555, 8666, 8555)72 bits (8555, 8666, 8555) 5 Bits (10110)5 bits (10110)
99 46 Bits46 bits 5 Bits5 bits 72 Bits (8555, 8555, 8666)72 bits (8555, 8555, 8666) 5 Bits (11010)5 bits (11010)
1010 46 Bits46 bits 5 Bits5 bits 72 Bits (6666, 6666, 6666)72 bits (6666, 6666, 6666) 5 Bits (11110)5 bits (11110)
1111 63 Bits63 bits 0 Bits0 bits 60 Bits (10,10, 10,10, 10,10)60 bits (10.10, 10.10, 10.10) 5 Bits (00011)5 bits (00011)
1212 63 Bits63 bits 0 Bits0 bits 60 Bits (11,9, 11,9, 11,9)60 bits (11.9, 11.9, 11.9) 5 Bits (00111)5 bits (00111)
1313 63 Bits63 bits 0 Bits0 bits 60 Bits (12,8, 12,8, 12,8)60 bits (12.8, 12.8, 12.8) 5 Bits (01011)5 bits (01011)
1414 63 Bits63 bits 0 Bits0 bits 60 Bits (16,4, 16,4, 16,4)60 bits (16.4, 16.4, 16.4) 5 Bits (01111)5 bits (01111)

 

Jedes Format in dieser Tabelle kann durch die modusbits eindeutig identifiziert werden.Each format in this table can be uniquely identified by the mode bits. Die ersten zehn Modi werden für Kacheln mit zwei Regionen verwendet, und das Bitfeld des Modus kann entweder zwei oder fünf Bits lang sein.The first ten modes are used for two-region tiles, and the mode bit field can be either two or five bits long. Diese Blöcke verfügen auch über Felder für die komprimierten Farb Endpunkte (72 oder 75 Bits), die Partition (5 Bits) und die Partitions Indizes (46 Bits).These blocks also have fields for the compressed color endpoints (72 or 75 bits), the partition (5 bits), and the partition indices (46 bits).

Für die komprimierten Farb Endpunkte notieren die Werte in der obigen Tabelle die Genauigkeit der gespeicherten RGB-Endpunkte und die Anzahl der Bits, die für die einzelnen Farbwerte verwendet werden.For the compressed color endpoints, the values in the preceding table note the precision of the stored RGB endpoints, and the number of bits used for each color value. Beispielsweise gibt Modus 3 eine farbend Punktgenauigkeit von 11 und die Anzahl der Bits an, die zum Speichern der Delta Werte der transformierten Endpunkte für die Farben rot, blau und grün (5, 4 bzw. 4) verwendet werden.For example, mode 3 specifies a color endpoint precision level of 11, and the number of bits used to store the delta values of the transformed endpoints for the red, blue and green colors (5, 4, and 4 respectively). Der Modus 10 verwendet keine Delta Komprimierung und speichert stattdessen alle vier Farb Endpunkte explizit.Mode 10 does not use delta compression, and instead stores all four color endpoints explicitly.

Die letzten vier Block Modi werden für Kacheln der einzelnen Regionen verwendet, wobei das Feld Modus 5 Bits ist.The last four block modes are used for one-region tiles, where the mode field is 5 bits. Diese Blöcke verfügen über Felder für die Endpunkte (60 Bits) und die komprimierten Indizes (63 Bits).These blocks have fields for the endpoints (60 bits) and the compressed indices (63 bits). Der Modus 11 (z. b. Modus 10) verwendet keine Delta Komprimierung, sondern speichert beide Farb Endpunkte explizit.Mode 11 (like Mode 10) does not use delta compression, and instead stores both color endpoints explicitly.

Die Modi 10011, 10111, 11011 und 11111 (nicht angezeigt) sind reserviert.Modes 10011, 10111, 11011, and 11111 (not shown) are reserved. Verwenden Sie diese nicht im Encoder.Do not use these in your encoder. Wenn die Hardware Blöcke mit einem dieser Modi überschritten werden, muss der resultierende dekomprimierte Block alle Nullen in allen Kanälen mit Ausnahme des Alphakanals enthalten.If the hardware is passed blocks with one of these modes specified, the resulting decompressed block must contain all zeroes in all channels except for the alpha channel.

Bei BC6H muss der Alphakanal unabhängig vom Modus immer 1,0 zurückgeben.For BC6H, the alpha channel must always return 1.0 regardless of the mode.

BC6H-Partitions SatzBC6H partition set

Es gibt 32 mögliche Partitions Sätze für eine Kachel mit zwei Regionen, die in der folgenden Tabelle definiert sind.There are 32 possible partition sets for a two-region tile, and which are defined in the table below. Jeder 4X4-Block stellt eine einzelne Form dar.Each 4x4 block represents a single shape.

Tabelle von bc6h-Partitions Sätzen

In dieser Tabelle mit Partitions Sätzen ist der fett formatierten und unterstrichene Eintrag der Speicherort des fixupindex für die Teilmenge 1 (die mit einem geringeren Bit angegeben wird).In this table of partition sets, the bolded and underlined entry is the location of the fix-up index for subset 1 (which is specified with one less bit). Der fixupindex für Teilmenge 0 ist immer Index 0, da die Partitionierung immer so angeordnet ist, dass Index 0 immer in der Teilmenge 0 ist.The fix-up index for subset 0 is always index 0, as the partitioning is always arranged such that index 0 is always in subset 0. Die Partitions Reihenfolge wechselt von oben links nach unten rechts, von links nach rechts und von oben nach unten.Partition order goes from top-left to bottom-right, moving left to right and then top to bottom.

BC6H-komprimiertes Endpunkt FormatBC6H compressed endpoint format

Bitfelder für bc6h-komprimierte Endpunkt Formate

Diese Tabelle zeigt die Bitfelder für die komprimierten Endpunkte als Funktion des Endpunkt Formats an, wobei jede Spalte eine Codierung und jede Zeile, die ein Bitfeld angibt, angibt.This table shows the bit fields for the compressed endpoints as a function of the endpoint format, with each column specifying an encoding and each row specifying a bit field. Bei diesem Ansatz werden 82 Bits für Kacheln mit zwei Regionen und 65 Bits für Kacheln der einzelnen Regionen benötigt.This approach takes up 82 bits for two-region tiles and 65 bits for one-region tiles. Beispielsweise sind die ersten 5 Bits für die oben genannte 1-Region [ 16 4- ] Codierung (insbesondere die Spalte ganz rechts) Bits m [ 4:0 ] , die nächsten 10 Bits sind Bits RW [ 9:0 ] , usw. mit den letzten 6 Bits, die BW 10:15 enthalten [ ] .As an example, the first 5 bits for the one-region [16 4] encoding above (specifically the right-most column) are bits m[4:0], the next 10 bits are bits rw[9:0], and so on with the last 6 bits containing bw[10:15].

Die Feldnamen in der obigen Tabelle sind wie folgt definiert:The field names in the table above are defined as follows:

FeldField VariableVariable
mm Modusmode
dd Shape-Indexshape index
RWrw Endpt [ 0 ] . Ein [ 0]endpt[0].A[0]
RXrx Endpt [ 0 ] . B [ 0]endpt[0].B[0]
Wahnry Endpt [ 1 ] . Ein [ 0]endpt[1].A[0]
RZrz Endpt [ 1 ] . B [ 0]endpt[1].B[0]
GWgw Endpt [ 0 ] . A [ 1]endpt[0].A[1]
GXgx Endpt [ 0 ] . B [ 1]endpt[0].B[1]
schlankgy Endpt [ 1 ] . A [ 1]endpt[1].A[1]
gzgz Endpt [ 1 ] . B [ 1]endpt[1].B[1]
BWbw Endpt [ 0 ] . A [ 2]endpt[0].A[2]
BXbx Endpt [ 0 ] . B [ 2]endpt[0].B[2]
byby Endpt [ 1 ] . A [ 2]endpt[1].A[2]
BZbz Endpt [ 1 ] . B [ 2]endpt[1].B[2]

 

"Endpt [ i" ] , wobei "0" oder "1" ist, bezieht sich auf den bzw. den jeweils ersten Satz von Endpunkten.Endpt[i], where i is either 0 or 1, refers to the 0th or 1st set of endpoints respectively.

Signieren der Erweiterung für Endpunkt WerteSign extension for endpoint values

Für Kacheln mit zwei Regionen gibt es vier Endpunkt Werte, für die das Vorzeichen erweitert werden kann.For two-region tiles, there are four endpoint values that can be sign extended. Endpt [ 0 ] . Ein wird nur signiert, wenn das Format ein signiertes Format ist. die anderen Endpunkte werden nur signiert, wenn der Endpunkt transformiert wurde, oder, wenn das Format ein signiertes Format ist.Endpt[0].A is signed only if the format is a signed format; the other endpoints are signed only if the endpoint was transformed, or if the format is a signed format. Der folgende Code veranschaulicht den Algorithmus zum Erweitern des Vorzeichen von Endpunkt Werten mit zwei Regionen.The code below demonstrates the algorithm for extending the sign of two-region endpoint values.

static void sign_extend_two_region(Pattern &p, IntEndpts endpts[NREGIONS_TWO])
{
    for (int i=0; i<NCHANNELS; ++i)
    {
      if (BC6H::FORMAT == SIGNED_F16)
        endpts[0].A[i] = SIGN_EXTEND(endpts[0].A[i], p.chan[i].prec);
      if (p.transformed || BC6H::FORMAT == SIGNED_F16)
      {
        endpts[0].B[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].delta[0]);
        endpts[1].A[i] = SIGN_EXTEND(endpts[1].A[i], p.chan[i].delta[1]);
        endpts[1].B[i] = SIGN_EXTEND(endpts[1].B[i], p.chan[i].delta[2]);
      }
    }
}

Bei Kacheln der einzelnen Regionen ist das Verhalten identisch, nur wenn Endpt [ 1 ] entfernt wurde.For one-region tiles, the behavior is the same, only with endpt[1] removed.

static void sign_extend_one_region(Pattern &p, IntEndpts endpts[NREGIONS_ONE])
{
    for (int i=0; i<NCHANNELS; ++i)
    {
    if (BC6H::FORMAT == SIGNED_F16)
        endpts[0].A[i] = SIGN_EXTEND(endpts[0].A[i], p.chan[i].prec);
    if (p.transformed || BC6H::FORMAT == SIGNED_F16) 
        endpts[0].B[i] = SIGN_EXTEND(endpts[0].B[i], p.chan[i].delta[0]);
    }
}

Inversion für Endpunkt Werte transformierenTransform inversion for endpoint values

Bei Kacheln mit zwei Regionen wendet die Transformation die Umkehrung der Differenz Codierung an und fügt den Basiswert bei Endpt [ 0 hinzu ] . Eine zu den drei anderen Einträgen für insgesamt 9 Add-Vorgänge.For two-region tiles, the transform applies the inverse of the difference encoding, adding the base value at endpt[0].A to the three other entries for a total of 9 add operations. In der folgenden Abbildung wird der Basiswert als "a0" dargestellt und verfügt über die höchste Gleit Komma Genauigkeit.In the image below, the base value is represented as "A0" and has the highest floating point precision. "A1", "B0" und "B1" sind alle Deltas, die aus dem Anker Wert berechnet werden, und diese Delta Werte werden mit niedrigerer Genauigkeit dargestellt."A1," "B0," and "B1" are all deltas calculated from the anchor value, and these delta values are represented with lower precision. (A0 entspricht Endpt [ 0 ] . A, B0 entspricht Endpt [ 0 ] . B, a1 entspricht Endpt [ 1 ] . A und B1 entsprechen Endpt [ 1 ] . B.)(A0 corresponds to endpt[0].A, B0 corresponds to endpt[0].B, A1 corresponds to endpt[1].A, and B1 corresponds to endpt[1].B.)

Berechnung der Endpunkt Werte der Transformations Umkehrung

Für Kacheln der 1-Region gibt es nur einen Delta Offset und somit nur drei Add-Vorgänge.For one-region tiles there is only one delta offset, and therefore only 3 add operations.

Der-Debug muss sicherstellen, dass die Ergebnisse der umgekehrten Transformation nicht die Genauigkeit von Endpt [ 0 ] . a überlaufen.The decompressor must ensure that that the results of the inverse transform will not overflow the precision of endpt[0].a. Im Fall eines Überlaufs müssen die Werte, die sich aus der umgekehrten Transformation ergeben, innerhalb der gleichen Anzahl von Bits umschlossen werden.In the case of an overflow, the values resulting from the inverse transform must wrap within the same number of bits. Wenn die Genauigkeit von a0 "p" ist, lautet der Transformations Algorithmus wie folgt:If the precision of A0 is "p" bits, then the transform algorithm is:

B0 = (B0 + A0) & ((1 << p) - 1)

Bei signierten Formaten müssen die Ergebnisse der Delta Berechnung ebenfalls mit Vorzeichen erweitert werden.For signed formats, the results of the delta calculation must be sign extended as well. Wenn beim Vorgang zum Signieren der Signierung beide Zeichen erweitert werden, wobei 0 positiv und 1 negativ ist, wird die oben genannte Klammer durch die Signierungs Erweiterung 0 übernommen.If the sign extension operation considers extending both signs, where 0 is positive and 1 is negative, then the sign extension of 0 takes care of the clamp above. Gleichwertig, nach der obigen Klammer, muss nur der Wert 1 (negativ) mit Extended signiert werden.Equivalently, after the clamp above, only a value of 1 (negative) needs to be sign extended.

Unquantifization von Farb EndpunktenUnquantization of color endpoints

Bei den nicht komprimierten Endpunkten ist der nächste Schritt das Ausführen einer anfänglichen unquantisierung der Farb Endpunkte.Given the uncompressed endpoints, the next step is to perform an initial unquantization of the color endpoints. Dies umfasst drei Schritte:This involves three steps:

  • Eine unquantisierung der Farbpaletten.An unquantization of the color palettes
  • Interpolations der PalettenInterpolation of the palettes
  • Beendigung der nicht quantifialisierungUnquantization finalization

Wenn Sie den unquantisierungsprozess in zwei Teile aufteilen (vor Interpolations-und abschließende unquantisierung nach der interpolung), wird die Anzahl der Multiplikations Vorgänge verringert, die im Vergleich zu einem vollständigen unquantisierungsprozess vor der paletteninterpolung erforderlich sind.Separating the unquantization process into two parts (color palette unquantization before interpolation and final unquantization after interpolation) reduces the number of multiplication operations required when compared to a full unquantization process before palette interpolation.

Der folgende Code veranschaulicht den Prozess zum Abrufen von Schätzungen der ursprünglichen 16-Bit-Farbwerte und verwendet dann die angegebenen Gewichtungswerte, um der Palette 6 zusätzliche Farbwerte hinzuzufügen.The code below illustrates the process for retrieving estimates of the original 16-bit color values, and then using the supplied weight values to add 6 additional color values to the palette. Der gleiche Vorgang wird für jeden Kanal ausgeführt.The same operation is performed on each channel.

int aWeight3[] = {0, 9, 18, 27, 37, 46, 55, 64};
int aWeight4[] = {0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64};

// c1, c2: endpoints of a component
void generate_palette_unquantized(UINT8 uNumIndices, int c1, int c2, int prec, UINT16 palette[NINDICES])
{
    int* aWeights;
    if(uNumIndices == 8)
        aWeights = aWeight3;
    else  // uNumIndices == 16
        aWeights = aWeight4;

    int a = unquantize(c1, prec); 
    int b = unquantize(c2, prec);

    // interpolate
    for(int i = 0; i < uNumIndices; ++i)
        palette[i] = finish_unquantize((a * (64 - aWeights[i]) + b * aWeights[i] + 32) >> 6);
}

Im nächsten Codebeispiel wird der Interpolations Prozess mit den folgenden Beobachtungen veranschaulicht:The next code sample demonstrates the interpolation process, with the following observations:

  • Da der vollständige Bereich von Farbwerten für die unquantifize -Funktion (unten) zwischen-32768 und 65535 liegt, wird der interpolators mit einer 17-Bit-Arithmetik mit Vorzeichen implementiert.Since the full range of color values for the unquantize function (below) are from -32768 to 65535, the interpolator is implemented using 17-bit signed arithmetic.
  • Nach der interpolung werden die Werte an die Funktion zur Fertigstellung von ** _ unquantifize** (im dritten Beispiel in diesem Abschnitt beschrieben) weitergegeben, die die endgültige Skalierung anwendet.After interpolation, the values are passed to the finish_unquantize function (described in the third sample in this section), which applies the final scaling.
  • Alle Hardware-Dekompressoren müssen mit diesen Funktionen bitgenaue Ergebnisse zurückgeben.All hardware decompressors are required to return bit-accurate results with these functions.
int unquantize(int comp, int uBitsPerComp)
{
    int unq, s = 0;
    switch(BC6H::FORMAT)
    {
    case UNSIGNED_F16:
        if(uBitsPerComp >= 15)
            unq = comp;
        else if(comp == 0)
            unq = 0;
        else if(comp == ((1 << uBitsPerComp) - 1))
            unq = 0xFFFF;
        else
            unq = ((comp << 16) + 0x8000) >> uBitsPerComp;
        break;

    case SIGNED_F16:
        if(uBitsPerComp >= 16)
            unq = comp;
        else
        {
            if(comp < 0)
            {
                s = 1;
                comp = -comp;
            }

            if(comp == 0)
                unq = 0;
            else if(comp >= ((1 << (uBitsPerComp - 1)) - 1))
                unq = 0x7FFF;
            else
                unq = ((comp << 15) + 0x4000) >> (uBitsPerComp-1);

            if(s)
                unq = -unq;
        }
        break;
    }
    return unq;
}

" _ unquantize beenden " wird nach der paletteninterpolung aufgerufen.finish_unquantize is called after palette interpolation. Die Funktion " unquantifize " verschiebt die Skalierung um 31/32 für "signiert", 31/64 für "unsigned".The unquantize function postpones the scaling by 31/32 for signed, 31/64 for unsigned. Dieses Verhalten ist erforderlich, um den endgültigen Wert in einen gültigen halben Bereich (-0x7bff ~ 0x7bff) zu bringen, nachdem die paletteninterpolung abgeschlossen ist, um die Anzahl der erforderlichen Multiplikationen zu verringern.This behavior is required to get the final value into valid half range(-0x7BFF ~ 0x7BFF) after the palette interpolation is completed in order to reduce the number of necessary multiplications. " _ unquantize abschließen " wendet die endgültige Skalierung an und gibt einen kurzen Wert ohne Vorzeichen zurück, der in eine Hälftereinterpretiert wird.finish_unquantize applies the final scaling and returns an unsigned short value that gets reinterpreted into half.

unsigned short finish_unquantize(int comp)
{
    if(BC6H::FORMAT == UNSIGNED_F16)
    {
        comp = (comp * 31) >> 6;                                         // scale the magnitude by 31/64
        return (unsigned short) comp;
    }
    else // (BC6H::FORMAT == SIGNED_F16)
    {
        comp = (comp < 0) ? -(((-comp) * 31) >> 5) : (comp * 31) >> 5;   // scale the magnitude by 31/32
        int s = 0;
        if(comp < 0)
        {
            s = 0x8000;
            comp = -comp;
        }
        return (unsigned short) (s | comp);
    }
}

Verwandte ThemenRelated topics

TexturblockkomprimierungTexture block compression