0

我正在尝试从 dds 文件中读取图像信息。我设法让 DXT1 和 DXT5 格式正常工作,但是我对 DXT3 格式(也称为BC2)的 alpha 数据有疑问。查看压缩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;

这是正确的,还是我看错了?

4

1 回答 1

1

这就是这个规范似乎要说的:

块中位置 (x,y) 处的纹素的 alpha 分量
由 alpha(x,y) / 15 给出。

因为结果应该在 [0 .. 1] 中,而不是 [0 .. 255] 中。

由于 255 可被 15 整除,因此将转换为 [0 .. 255] 可能更容易理解为

uint8_t alpha = bitvalue * 17;

现在更明显的是,正在发生的是通常的“复制”映射(就像 CSS 短颜色代码一样),它提供了输出值的良好分布(允许对最小值和最大值进行编码,并且具有相等的步长所有值之间)。

于 2016-12-06T15:23:17.580 回答