逆向:GT2 Texturefile文件结构

来自歌颂之丘
星云nebulas讨论 | 贡献2024年2月27日 (二) 13:09的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

此处记录对用于PSVita的GT2 Texturefile文件(典型扩展名为*.gtx)之结构的分析成果。

此处所有uint32_t均为小端序。

文件头结构

uint8_t  magi[4] = {0x47, 0x54, 0x58, 0x01};// GTX\x01
uint32_t header_length; // without magi, normally 0x78
uint8_t  nodata1[4] = { 0 };
uint32_t texture_length_with_metadata;
uint32_t building_data_length; //normally 0x68
uint8_t  nodata2[0x14] = { 0 }
uint32_t builder_message_length; // normally 0x41
uint32_t builder_message_length + 1; // normally 0x42
uint8_t  unknown1[0x04] = {0x04, 0x00, 0x00, 0x00};
uint8_t  bulider_message[]; // normally 0x44, ASCII, start and end with 0x0A, padding with 0x00 to 4n.

元数据结构

uint8_t  metadata_magi[4] = {0x00, 0x05, 0x07, 0x00};
uint32_t filename_length;
uint32_t filename_length + 1;
uint8_t  unknown2[0x0C] = {0x3C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00}
uint32_t texture_width;
uint32_t texture_height;
uint32_t texture_width * 4;
uint8_t  unknown3[0x08] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}
uint8_t  vita_texture_FourCC[4];
uint32_t unknown4; //maybe texture block size?
uint8_t  unknown5[0x10] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
uint32_t texture_length;
uint32_t filename_padding_length + 4; // with self
uint8_t  filename[]; //ASCII, padding with 0x00 to 4n.

纹理数据

已知的纹理格式有UBC1与UBC3两种。这里使用的代号为vita_texture_FourCC字段的内容。

与通用的gxt文件相同,UBC1为DXT1的别名,UBC3为DXT5的别名。同时纹理数据也经过了SWIZZLED处理以优化读取。