BC6H 形式BC6H format

BC6H 形式は、ソース データのハイ ダイナミック レンジ (HDR) 色空間をサポートするように設計されたテクスチャ圧縮形式です。The BC6H format is a texture compression format designed to support high-dynamic range (HDR) color spaces in source data.

BC6H/DXGI _ 形式の BC6H について _About BC6H/DXGI_FORMAT_BC6H

BC6H 形式は、3 つの HDR カラー チャネルを使用した画像に、高品質の圧縮を提供します。各カラー チャネルに (16: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). アルファ チャネルはサポートされません。There is no support for an alpha channel.

BC6H は、次の DXGI 形式の列挙値によって指定され _ ます。BC6H is specified by the following DXGI_FORMAT enumeration values:

  • DXGI __BC6H _ の形式を指定しないでください。DXGI_FORMAT_BC6H_TYPELESS.
  • DXGI __BC6H _ UF16 の書式を設定します。DXGI_FORMAT_BC6H_UF16. この BC6H 形式は、16 ビット浮動小数点カラー チャネル値の符号ビットを使用しません。This BC6H format does not use a sign bit in the 16-bit floating point color channel values.
  • DXGI __BC6H _ SF16 の書式を設定します。DXGI_FORMAT_BC6H_SF16. この BC6H 形式は、16 ビット浮動小数点カラー チャネル値の符号ビットを使用します。This BC6H format uses a sign bit in the 16-bit floating point color channel values.

メモ   カラーチャネルの16ビット浮動小数点形式は、"ハーフ" 浮動小数点形式と呼ばれることがよくあります。Note   The 16 bit floating point format for color channels is often referred to as a "half" floating point format. この形式には、次のビット レイアウトがあります。This format has the following bit layout: | | | |-----------------------|-------------------------------------------------| | UF16 (符号なし浮動小数点)UF16 (unsigned float) | 5 指数ビット + 11 仮数ビット5 exponent bits + 11 mantissa bits | | SF16 (符号付き浮動小数点)SF16 (signed float) | 1 符号ビット + 5 指数ビット + 10 仮数ビット1 sign bit + 5 exponent bits + 10 mantissa bits |

 

 

BC6H 形式は、Texture2D (配列を含む)、Texture3D、または TextureCube (配列を含む) のテクスチャ リソースに使用できます。The BC6H format can be used for Texture2D (including arrays), Texture3D, or TextureCube (including arrays) texture resources. 同様に、この形式は、これらのリソースに関連付けられた任意のミップマップ サーフェスに適用されます。Similarly, this format applies to any MIP-map surfaces associated with these resources.

BC6H は、16バイト (128 ビット) の固定ブロックサイズと 4 × 4 テクセルの固定タイル サイズを使用します。BC6H uses a fixed block size of 16 bytes (128 bits) and a fixed tile size of 4x4 texels. 以前の BC 形式と同様に、サポートされるタイル サイズ (4 x 4) よりも大きなテクスチャ画像は、複数のブロックを使用して圧縮されます。As with previous BC formats, texture images larger than the supported tile size (4x4) are compressed by using multiple blocks. このアドレス指定 ID は、3 次元画像とミップマップ、キューブマップ、テクスチャ配列にも適用されます。This addressing identity applies also to three-dimensional images, MIP-maps, cube maps, and texture arrays. すべての画像タイルは同じ形式でなければなりません。All image tiles must be of the same format.

BC6H 形式の注意事項:Caveats with the BC6H format:

  • BC6H は浮動小数点非正規化数をサポートしていますが、INF (無限大) と NaN (非数) をサポートしていません。BC6H supports floating point denormalization, but does not support INF (infinity) and NaN (not a number). 例外は、 _ _ _ -INF (負の無限大) をサポートする BC6H (DXGI FORMAT BC6H SF16) の署名モードです。The exception is the signed mode of BC6H (DXGI_FORMAT_BC6H_SF16), which supports -INF (negative infinity). この -INF のサポートは、形式そのものの結果に過ぎず、この形式のエンコーダーでは特にサポートされていません。This support for -INF is merely an artifact of the format itself, and is not specifically supported by encoders for this format. 一般に、エンコーダーが INF (正または負) または NaN 入力データを検出する場合には、圧縮前にそのデータを最大許容非 INF 表現値に変換したり、NaN を 0 にマッピングする必要があります。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 はアルファ チャネルをサポートしません。BC6H does not support an alpha channel.
  • BC6H デコーダーは、テクスチャ フィルタリングを実行する前に、圧縮解除を実行します。The BC6H decoder performs decompression before it performs texture filtering.
  • BC6H の圧縮解除はビットアキュレートである必要があります。ハードウェアは、このドキュメントで説明されているデコーダーと同じ結果を返す必要があります。BC6H decompression must be bit-accurate; that is, the hardware must return results that are identical to the decoder described in this documentation.

BC6H の実装BC6H implementation

BC6H ブロックは、モードビット、圧縮エンドポイント、圧縮インデックス、パーティション インデックス (オプション) で構成されています。A BC6H block consists of mode bits, compressed endpoints, compressed indices, and an optional partition index. この形式は、14 の異なるモードを指定します。This format specifies 14 different modes.

エンドポイント カラーは RGB トリプレットとして保存されます。An endpoint color is stored as an RGB triplet. BC6H は、いくつかの定義されたカラー エンドポイントを横切る近似線上に色のパレットを定義します。BC6H defines a palette of colors on an approximate line across a number of defined color endpoints. また、モードによっては、タイルを 2 つの領域に分割したり、1 つの領域として扱うこともできます。2 つの領域を持つタイルには、各領域にカラー エンドポイントが別々に設定されます。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 はテクセルごとに 1 つのパレット インデックスを格納します。BC6H stores one palette index per texel.

2 つの領域の場合、可能なパーティションは 32 です。In the two-region case, there are 32 possible partitions.

BC6H 形式のデコードDecoding the BC6H format

次の擬似コードは、16 バイトの BC6H ブロックを指定して(x, y) のピクセルを圧縮解除する手順の概要を示しています。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);
}

次の表に、BC6H ブロックで使用可能な 14 の形式のビット数と値を示します。The following table contains the bit count and values for each of the 14 possible formats for BC6H blocks.

モードMode パーティション インデックスPartition Indices PartitionPartition カラー エンドポイントColor Endpoints モード ビットMode Bits
11 46 ビット46 bits 5 ビット5 bits 75 ビット (10.555, 10.555, 10.555)75 bits (10.555, 10.555, 10.555) 2 ビット (00)2 bits (00)
22 46 ビット46 bits 5 ビット5 bits 75 ビット (7666, 7666, 7666)75 bits (7666, 7666, 7666) 2 ビット (01)2 bits (01)
33 46 ビット46 bits 5 ビット5 bits 72 ビット (11.555, 11.444, 11.444)72 bits (11.555, 11.444, 11.444) 5 ビット (00010)5 bits (00010)
44 46 ビット46 bits 5 ビット5 bits 72 ビット (11.444, 11.555, 11.444)72 bits (11.444, 11.555, 11.444) 5 ビット (00110)5 bits (00110)
55 46 ビット46 bits 5 ビット5 bits 72 ビット (11.444, 11.444, 11.555)72 bits (11.444, 11.444, 11.555) 5 ビット (01010)5 bits (01010)
66 46 ビット46 bits 5 ビット5 bits 72 ビット (9555, 9555, 9555)72 bits (9555, 9555, 9555) 5 ビット (01110)5 bits (01110)
77 46 ビット46 bits 5 ビット5 bits 72 ビット (8666, 8555, 8555)72 bits (8666, 8555, 8555) 5 ビット (10010)5 bits (10010)
88 46 ビット46 bits 5 ビット5 bits 72 ビット (8555, 8666, 8555)72 bits (8555, 8666, 8555) 5 ビット (10110)5 bits (10110)
99 46 ビット46 bits 5 ビット5 bits 72 ビット (8555, 8555, 8666)72 bits (8555, 8555, 8666) 5 ビット (11010)5 bits (11010)
1010 46 ビット46 bits 5 ビット5 bits 72 ビット (6666, 6666, 6666)72 bits (6666, 6666, 6666) 5 ビット (11110)5 bits (11110)
1111 63 ビット63 bits 0 ビット0 bits 60 ビット (10.10, 10.10, 10.10)60 bits (10.10, 10.10, 10.10) 5 ビット (00011)5 bits (00011)
1212 63 ビット63 bits 0 ビット0 bits 60 ビット (11.9, 11.9, 11.9)60 bits (11.9, 11.9, 11.9) 5 ビット (00111)5 bits (00111)
1313 63 ビット63 bits 0 ビット0 bits 60 ビット (12.8, 12.8, 12.8)60 bits (12.8, 12.8, 12.8) 5 ビット (01011)5 bits (01011)
1414 63 ビット63 bits 0 ビット0 bits 60 ビット (16.4, 16.4, 16.4)60 bits (16.4, 16.4, 16.4) 5 ビット (01111)5 bits (01111)

 

この表の各形式は、モード ビットによって一意に識別できます。Each format in this table can be uniquely identified by the mode bits. 最初の 10 個のモードは 2 領域のタイルに使用され、モード ビット フィールドは 2 または 5 ビット長とすることができます。The first ten modes are used for two-region tiles, and the mode bit field can be either two or five bits long. これらのブロックには、圧縮されたカラー エンドポイント (72 または 75 ビット)、パーティション (5ビット)、およびパーティション インデックス (46ビット) のフィールドもあります。These blocks also have fields for the compressed color endpoints (72 or 75 bits), the partition (5 bits), and the partition indices (46 bits).

圧縮されたカラー エンドポイントの場合、上記の表の値は、保存された RGB エンドポイントの精度と、各カラー値に使用されるビット数を示します。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. たとえば、モード 3 では、カラー エンドポイントの精度レベル 11 と、赤、青、緑の色の変換されたエンドポイントのデルタ値を保存するために使用するビット数 (それぞれ 5、4、4) を指定します。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). モード 10 はデルタ圧縮を使用せず、4 つのカラー エンドポイントをすべて明示的に保存します。Mode 10 does not use delta compression, and instead stores all four color endpoints explicitly.

最後の 4 つのブロック モードは 1 領域タイルに使用され、モード フィールドは 5 ビットです。The last four block modes are used for one-region tiles, where the mode field is 5 bits. これらのブロックには、エンドポイント (60 ビット) と圧縮インデックス (63 ビット) のフィールドがあります。These blocks have fields for the endpoints (60 bits) and the compressed indices (63 bits). モード 11 ではモード 10 と同様にデルタ圧縮を使用せず、その代わりに両方のカラー エンドポイントを明示的に保存します。Mode 11 (like Mode 10) does not use delta compression, and instead stores both color endpoints explicitly.

モード 10011、10111、11011、および11111 (示されていません) は予約されています。Modes 10011, 10111, 11011, and 11111 (not shown) are reserved. これらをエンコーダーで使用しないでください。Do not use these in your encoder. これらのモードの1 つを指定してハードウェアにブロックが渡された場合、その結果の圧縮解除されたブロックは、アルファ チャネルを除くすべてのチャネルにゼロを含む必要があります。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.

BC6H では、アルファ チャネルはモードに関係なく常に 1.0 を返す必要があります。For BC6H, the alpha channel must always return 1.0 regardless of the mode.

BC6H パーティションセットBC6H partition set

2 領域のタイルでは 32 のパーティション セットが使用可能で、それらは下の表で定義されています。There are 32 possible partition sets for a two-region tile, and which are defined in the table below. 各 4 x 4 ブロックは単一の形状を表しています。Each 4x4 block represents a single shape.

BC6H パーティション セットの表

このパーティション・セットの表では、太字の下線付きの項目は、サブセット 1 の修正インデックスの位置です (1 つ少ないビットで指定されます)。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). パーティションは常にインデックス 0 がサブセット 0 になるように配置されるため、サブセット 0 の修正インデックスは常にインデックス 0 です。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. パーティションの順序は、左上から右下、つまり左から右へ、上から下へとなります。Partition order goes from top-left to bottom-right, moving left to right and then top to bottom.

BC6H 圧縮エンドポイント形式BC6H compressed endpoint format

BC6H 圧縮エンドポイント形式のビット フィールド

この表は、圧縮エンドポイントのビット フィールドを、エンドポイント形式の関数として示しています。各列がエンコードを示し、各行がビット フィールドを示しています。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. この方法では、2 領域タイルで 82 ビット、1 領域タイルで 65 ビットを使用します。This approach takes up 82 bits for two-region tiles and 65 bits for one-region tiles. 例として、上の1つの地域の 16 4 エンコーディングの最初の5ビット [ ] (具体的には右端の列) は、ビット m [ 4:0 ] 、次の10ビットは bits rw [ 9:0 ] 、および bw 10:15 を含む最後の6ビットになり [ ] ます。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].

上記の表のフィールド名は、次のように定義されています。The field names in the table above are defined as follows:

フィールドField 変数Variable
mm modemode
dd shape indexshape index
rwrw endpt [ 0 ] 。[0]endpt[0].A[0]
rxrx endpt [ 0 ] 。B [ 0]endpt[0].B[0]
ryry endpt [ 1 ] 。[0]endpt[1].A[0]
rzrz endpt [ 1 ] 。B [ 0]endpt[1].B[0]
gwgw endpt [ 0 ] 。[1]endpt[0].A[1]
gxgx endpt [ 0 ] 。B [ 1]endpt[0].B[1]
gygy endpt [ 1 ] 。[1]endpt[1].A[1]
gzgz endpt [ 1 ] 。B [ 1]endpt[1].B[1]
bwbw endpt [ 0 ] 。[2]endpt[0].A[2]
bxbx endpt [ 0 ] 。B [ 2]endpt[0].B[2]
byby endpt [ 1 ] 。[2]endpt[1].A[2]
bzbz endpt [ 1 ] 。B [ 2]endpt[1].B[2]

 

Endpt [ i ] (i は0または 1) で、それぞれ0番目または1番目のエンドポイントを参照します。Endpt[i], where i is either 0 or 1, refers to the 0th or 1st set of endpoints respectively.

エンドポイント値の符号拡張Sign extension for endpoint values

2 領域タイルでは、符号拡張が可能な 4 つのエンドポイント値があります。For two-region tiles, there are four endpoint values that can be sign extended. Endpt [ 0 ] 。は、形式が符号付き形式の場合にのみ署名されます。他のエンドポイントは、エンドポイントが変換された場合、または形式が符号付きの場合にのみ署名されます。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. 以下のコードは、2 領域のエンドポイント値の符号を拡張するアルゴリズムを示しています。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]);
      }
    }
}

1つの地域のタイルでは、動作は同じですが、endpt 1 が削除された場合にのみ使用され [ ] ます。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]);
    }
}

エンドポイント値の変換の反転Transform inversion for endpoint values

2つの領域からなるタイルの場合、変換によって、差分エンコードの逆の値が適用され、endpt 0 に基本値が追加され [ ] ます。合計で9個の追加操作のための、他の3つのエントリへの。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. 下の画像では、基本値は「A0」として表され、最も高い浮動小数点精度を持ちます。In the image below, the base value is represented as "A0" and has the highest floating point precision. 「A1」「B0」「B1」は全てアンカー値から算出されたデルタであり、これらのデルタ値は、より低い精度で表されます。"A1," "B0," and "B1" are all deltas calculated from the anchor value, and these delta values are represented with lower precision. (A0 は endpt 0 に相当 [ ] します。、B0 は endpt 0 に対応し [ ] ます。B、A1 は endpt 1 に対応 [ ] します。、B1 は 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.)

変換の反転のエンドポイント値の計算

1 領域のタイルでは、デルタ オフセットは 1 つだけであるため、3 つの加算演算のみとなります。For one-region tiles there is only one delta offset, and therefore only 3 add operations.

伸張では、逆変換の結果が endpt [ 0. a の有効桁数をオーバーフローしないようにする必要があります。 ]The decompressor must ensure that that the results of the inverse transform will not overflow the precision of endpt[0].a. オーバーフローの場合には、反転から生じる値は、同じビット数内でラップする必要があります。In the case of an overflow, the values resulting from the inverse transform must wrap within the same number of bits. A0 の精度が「p」ビットの場合、変換アルゴリズムは次のようになります。If the precision of A0 is "p" bits, then the transform algorithm is:

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

符号付き形式の場合、デルタ計算の結果も符号拡張される必要があります。For signed formats, the results of the delta calculation must be sign extended as well. 符号拡張演算が両方の符号を拡張することを考慮する場合には、0 が正、1 が負であり、0 の符号拡張がこのクランプの処理を行います。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. 同様に、このクランプ後に、値 1 (負) のみ符号拡張する必要があります。Equivalently, after the clamp above, only a value of 1 (negative) needs to be sign extended.

カラー エンドポイントの非量子化Unquantization of color endpoints

圧縮されていないエンドポイントでは、次のステップはカラー エンドポイントの最初の非量子化を実行することです。Given the uncompressed endpoints, the next step is to perform an initial unquantization of the color endpoints. これを行うには、3 つの手順を実行します。This involves three steps:

  • カラー パレットの非量子化An unquantization of the color palettes
  • パレットの補間Interpolation of the palettes
  • 非量子化の最終化Unquantization finalization

非量子化プロセスを 2 つの部分 (補間前のカラー パレットの非量子化と、補間後の最終の非量子化) に分離することにより、パレット補間前の完全非量子化プロセスと比較して必要な乗算演算の数が減少します。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.

下のコードは、元の 16 ビット カラー値の見積もりを取得し、提供されたウェイト値を使用して 6 つの追加のカラー値をパレットに追加するプロセスを示しています。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. 同じ操作が各チャネルで実行されます。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);
}

次のコード サンプルでは、補間のプロセスを示しています。次のようなことがわかります。The next code sample demonstrates the interpolation process, with the following observations:

  • 非量子化関数 (下記) のカラー値の有効な範囲は -32768 〜 65535 であるため、インターポレーターは 17 ビット符号付き算術演算を使って実装されています。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.
  • 補間後、値は 終了 _ unquantize 関数 (このセクションの3番目のサンプルで説明します) に渡されます。これにより、最終的なスケーリングが適用されます。After interpolation, the values are passed to the finish_unquantize function (described in the third sample in this section), which applies the final scaling.
  • すべてのハードウェアの圧縮解除プログラムは、これらの関数でビットアキュレートの結果を返す必要があります。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;
}

finish _ unquantize は、パレット補間の後に呼び出されます。finish_unquantize is called after palette interpolation. Unquantize 関数は、符号付きの場合は 31/32、符号なしの場合は 31/64 で、スケーリングを延期します。The unquantize function postpones the scaling by 31/32 for signed, 31/64 for unsigned. この動作は、パレット補間の完了後の最終値を有効な半範囲 (-0x7BFF〜0x7BFF) にして、必要な乗算の数を減らすために必要です。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. finish _ unquantizeは、最終的なスケーリングを適用し、半分に解釈される符号なし short値を返します。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);
    }
}

関連トピックRelated topics

テクスチャのブロック圧縮Texture block compression