这两天我在破解某个psp游戏时碰到了一种以前没有见过的图片格式,后经cg的Xinyu、阿豆以及汉化群里的泡泡の桃等人的帮助提示下,实现了对该种图片格式的软解码操作。在此对他们表示感谢。问题原帖地址:
撮我
该种图片格式就是DXT格式。
关于DXT格式的详细介绍请参阅Xinyu写的文章,地址: 浅析PSP平台GIM图片文件中的DXT系列格式
该文章里除了对具体4x4像素块(texel)数据的分布没有写清楚之外,其余都写得十分好。
我在参考了msdn中相关文章以及实际的解码操作后搞清楚了具体的分布情况,所以这里我就举例来说明DXT中每个块(texel)的详细分布情况。
另:由于在游戏中没有DXT3的图片格式,故DXT3的块分布情况欠奉。
msdn中的相关文章:
DXT1: Opaque and 1-Bit Alpha Textures (Direct3D 9)
DXT3/DXT5: Textures with Alpha Channels (Direct3D 9)
===============DXT1====================================
我们抽取一个DXT1 4x4像素块来举例说明。
原始数据为:02 BD FF E8 C8 52 E6 39
02 BD FF E8为4x4 2bit索引矩阵,C8 52 E6 39为两个16bitRGB565颜色值即C0、C1
先说4x4 2bit索引矩阵,因为是小尾系统(Little-Endian )的关系,其读入内存后是这个样子的:E8 FF BD 02,
转换成二进制的话就是这样: 11 10 10 00 11 11 11 11 10 11 11 01 00 00 00 10
4x4 2bit索引矩阵地址依次为:[3][3],[3][2],[3][1],[3][0],[2][3],[2][2],[2][1],[2][0],[1][3],[1][2],[1][1],[1][0],[0][3],[0][2],[0][1],[0][0]
4x4 2bit索引矩阵块就会是这样:
10 00 00 00
01 11 11 10
11 11 11 11
00 10 10 11
然后再说两个16bitRGB565颜色值C0、C1,因为是小尾系统(Little-Endian )的关系,其读入内存后是这个样子:39 E6 52 C8
所以C0为52 C8,C1为39 E6
以C0为例说明RGB565的颜色掩码:
转换成二进制: 01010 010110 01000
R G B
===============DXT5=====================================
DXT5的4x4像素块大小为64bit,前面低地址的32bit和DXT1是一样的,后面高地址的32bit是4x4 alpha数据块
同样抽取一个4x4块来举例说明。
原始数据为:00 00 00 00 00 00 00 00 49 92 24 49 92 24 FF 00
前面低地址的32bit数据00 00 00 00 00 00 00 00是和DXT1一样的,不再复述。
后面高地址的32bit数据49 92 24 49 92 24 FF 00是4x4 alpha数据块
其中49 92 24 49 92 24为4x4 3bit的alpha索引矩阵,FF 00是两个8bit的alpha值即A0、A1
先说4x4 3bit的alpha索引矩阵,因为是小尾系统(Little-Endian )的关系,读入内存后要把它倒置拼接成这样:24 92 49 24 92 49
转换成二进制:0010 0100 1001 0010 0100 1001 0010 0100 1001 0010 0100 1001
再把它按3bit排整齐的话应该是这样: 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001
4x4 3bit的alpha索引矩阵地址依次为:[3][3],[3][2],[3][1],[3][0],[2][3],[2][2],[2][1],[2][0],[1][3],[1][2],[1][1],[1][0],[0][3],[0][2],[0][1],[0][0]
所以4x4 3bit的alpha索引矩阵块就会是这个样子:
001 001 001 001
001 001 001 001
001 001 001 001
001 001 001 001
然后是两个8bit的alpha值A0、A1,同样因为是小尾系统(Little-Endian )的关系,其读入内存后是这个样子:00 FF
所以A0为FF,A1为00
由此可以看出该DXT5块(texel)是全透明的。
by qqj1228
该种图片格式就是DXT格式。
关于DXT格式的详细介绍请参阅Xinyu写的文章,地址: 浅析PSP平台GIM图片文件中的DXT系列格式
该文章里除了对具体4x4像素块(texel)数据的分布没有写清楚之外,其余都写得十分好。
我在参考了msdn中相关文章以及实际的解码操作后搞清楚了具体的分布情况,所以这里我就举例来说明DXT中每个块(texel)的详细分布情况。
另:由于在游戏中没有DXT3的图片格式,故DXT3的块分布情况欠奉。
msdn中的相关文章:
DXT1: Opaque and 1-Bit Alpha Textures (Direct3D 9)
DXT3/DXT5: Textures with Alpha Channels (Direct3D 9)
===============DXT1====================================
我们抽取一个DXT1 4x4像素块来举例说明。
原始数据为:02 BD FF E8 C8 52 E6 39
02 BD FF E8为4x4 2bit索引矩阵,C8 52 E6 39为两个16bitRGB565颜色值即C0、C1
先说4x4 2bit索引矩阵,因为是小尾系统(Little-Endian )的关系,其读入内存后是这个样子的:E8 FF BD 02,
转换成二进制的话就是这样: 11 10 10 00 11 11 11 11 10 11 11 01 00 00 00 10
4x4 2bit索引矩阵地址依次为:[3][3],[3][2],[3][1],[3][0],[2][3],[2][2],[2][1],[2][0],[1][3],[1][2],[1][1],[1][0],[0][3],[0][2],[0][1],[0][0]
4x4 2bit索引矩阵块就会是这样:
10 00 00 00
01 11 11 10
11 11 11 11
00 10 10 11
然后再说两个16bitRGB565颜色值C0、C1,因为是小尾系统(Little-Endian )的关系,其读入内存后是这个样子:39 E6 52 C8
所以C0为52 C8,C1为39 E6
以C0为例说明RGB565的颜色掩码:
转换成二进制: 01010 010110 01000
R G B
===============DXT5=====================================
DXT5的4x4像素块大小为64bit,前面低地址的32bit和DXT1是一样的,后面高地址的32bit是4x4 alpha数据块
同样抽取一个4x4块来举例说明。
原始数据为:00 00 00 00 00 00 00 00 49 92 24 49 92 24 FF 00
前面低地址的32bit数据00 00 00 00 00 00 00 00是和DXT1一样的,不再复述。
后面高地址的32bit数据49 92 24 49 92 24 FF 00是4x4 alpha数据块
其中49 92 24 49 92 24为4x4 3bit的alpha索引矩阵,FF 00是两个8bit的alpha值即A0、A1
先说4x4 3bit的alpha索引矩阵,因为是小尾系统(Little-Endian )的关系,读入内存后要把它倒置拼接成这样:24 92 49 24 92 49
转换成二进制:0010 0100 1001 0010 0100 1001 0010 0100 1001 0010 0100 1001
再把它按3bit排整齐的话应该是这样: 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001 001
4x4 3bit的alpha索引矩阵地址依次为:[3][3],[3][2],[3][1],[3][0],[2][3],[2][2],[2][1],[2][0],[1][3],[1][2],[1][1],[1][0],[0][3],[0][2],[0][1],[0][0]
所以4x4 3bit的alpha索引矩阵块就会是这个样子:
001 001 001 001
001 001 001 001
001 001 001 001
001 001 001 001
然后是两个8bit的alpha值A0、A1,同样因为是小尾系统(Little-Endian )的关系,其读入内存后是这个样子:00 FF
所以A0为FF,A1为00
由此可以看出该DXT5块(texel)是全透明的。
by qqj1228