【破解心得】DXT结构软解码操作[psp平台]

这两天我在破解某个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值