0

I'm trying to read image info from a dds file. I managed to get the DXT1 and DXT5 formats working fine, however I have a question concerning the alpha data of the DXT3 format (Also know as BC2). When looking at the layout of a compressed BC2 block, it shows the alpha data for the 16-pixel block is stored in the first 8 bytes of the data, with each value taking up 4 bits.

Does this mean that, since the stored alpha value can only be 0-15, the actual alpha data is calculated as follows:

unsigned char bitvalue = GetAlphaBitValue(); // assume this works and gets the 4-bit value i am looking for
unsigned char alpha = (bitvalue / 15.0f) * 255;

Is this correct, or am I looking at it wrong?

Reinier Torenbeek
  • 16,669
  • 7
  • 46
  • 69
xEric_xD
  • 506
  • 1
  • 5
  • 12

1 Answers1

1

That's what this specification seems to say:

The alpha component for a texel at location (x,y) in the block is
given by alpha(x,y) / 15.

Because the result there is supposed to be in [0 .. 1], not [0 .. 255].

Since 255 is divisible by 15, it's probably easier to think of the transformation to [0 .. 255] as

uint8_t alpha = bitvalue * 17;

It is now more obvious that what's going on is the usual "replicate" mapping (just like eg CSS short color codes) that gives a nice spreading of output values (allows both the minimum and the maximum values to be encoded, and has equal steps between all values).

harold
  • 61,398
  • 6
  • 86
  • 164