我正在解压缩使用 DXT5 压缩的图像。根据描述,每个 16 字节的块以 2 字节的 alpha 数据开头。如果我在十六进制编辑器中查看我的文件,我会发现 90% 的图像的 alpha 值小于 0.04(文件中的值 < 10),这不应该是这种情况。
如果我用 OpenGL 渲染图像并让 glCompressedTexImage 完成工作,它看起来没问题。使用我的代码,图像是透明的,正如我对那些小的 alpha 值所期望的那样。我用来生成 alpha 值的代码如下所示:
byte alpha1 = reader.ReadByte();
byte alpha2 = reader.ReadByte();
uint[] alphaValues = new uint[8]
{
alpha1,
alpha2,
0, 0, 0, 0, 0, 0
};
if (alpha1 > alpha2)
{
for (int i = 0; i < 6; ++i)
{
byte value = (byte)(((6.0f - i) * alpha1 + (1.0f + i) * alpha2) / 7.0f);
alphaValues[i + 2] = value;
}
}
else
{
for (int i = 0; i < 4; ++i)
{
byte value = (byte)(((4.0f - i) * alpha1 + (1.0f + i) * alpha2) / 5.0f);
alphaValues[i + 2] = value;
}
alphaValues[6] = 0;
alphaValues[7] = 255;
}
alpha1 和 alpha2 通常是相同的(值如 8 或 3 或 9,但图像中的最大 alpha 值是 96)。
不过颜色还可以。如果我渲染没有 alpha 值的图像,它看起来很完美。启用 alpha -> 透明。