DXT3 (BC2) 压缩格式 alpha 数据
DXT3 (BC2) compression format alpha data
我正在尝试从 dds 文件中读取图像信息。我设法让 DXT1 和 DXT5 格式正常工作,但是我对 DXT3 格式(也称为 BC2)的 alpha 数据有疑问。
查看压缩后的布局时 BC2 block,它显示 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;
这是正确的,还是我看错了?
这就是 this specification 的意思:
The alpha component for a texel at location (x,y) in the block is
given by alpha(x,y) / 15.
因为结果应该在 [0 .. 1] 中,而不是 [0 .. 255]。
由于 255 可以被 15 整除,因此将 [0 .. 255] 转换为
可能更容易理解
uint8_t alpha = bitvalue * 17;
现在更明显的是,通常的 "replicate" 映射(就像 CSS 短颜色代码一样)可以很好地传播输出值(允许最小值和要编码的最大值,并且所有值之间的步长相等)。
我正在尝试从 dds 文件中读取图像信息。我设法让 DXT1 和 DXT5 格式正常工作,但是我对 DXT3 格式(也称为 BC2)的 alpha 数据有疑问。 查看压缩后的布局时 BC2 block,它显示 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;
这是正确的,还是我看错了?
这就是 this specification 的意思:
The alpha component for a texel at location (x,y) in the block is
given by alpha(x,y) / 15.
因为结果应该在 [0 .. 1] 中,而不是 [0 .. 255]。
由于 255 可以被 15 整除,因此将 [0 .. 255] 转换为
可能更容易理解uint8_t alpha = bitvalue * 17;
现在更明显的是,通常的 "replicate" 映射(就像 CSS 短颜色代码一样)可以很好地传播输出值(允许最小值和要编码的最大值,并且所有值之间的步长相等)。