我正在尝试从DDS文件读取图像信息。我设法使DXT1和DXT5格式工作正常,但是我有一个有关DXT3格式的alpha数据(也称为BC2)的问题。查看压缩BC2块的布局时,它显示了16像素块的alpha数据存储在数据的前8个字节中,每个值占4位。
。这意味着,由于存储的alpha值只能为0-15,因此实际alpha数据的计算如下:
unsigned char bitvalue = GetAlphaBitValue(); // assume this works and gets the 4-bit value i am looking for
unsigned char alpha = (bitvalue / 15.0f) * 255;
这是正确的,还是我看错了?
这是此规范所说的:
在块中的位置(x,y)处的texel的alpha组件为
由alpha(x,y)/15给出。
因为结果应该在[0 .. 1]中,而不是[0 .. 255]。
由于255可以排15,因此将转换为[0 .. 255]的转换可能更容易
uint8_t alpha = bitvalue * 17;
现在,更明显的是,发生的事情是通常的"重复"映射(例如CSS简短颜色代码),它可以很好地扩展输出值(允许编码最小值和最大值,并且可以编码最大值和最大值在所有值之间都有相等的步骤)。