解析PS2游戏存档3D图标
内容提要
本文介绍解析PS2游戏存档中3D动画图标的方法:先解析icon.sys配置文件,获取背景色、透明度、光照及图标文件名;再解析icon文件,其包含图标头、顶点段、动画段和纹理段。顶点段存储顶点、法线、纹理坐标和RGBA数据,动画段通过顶点插值实现动作,纹理为128x128的TIM格式,分未压缩BGR555和RLE压缩两种。
延伸解读
icon.sys:存档图标的配置核心
icon.sys是固定964字节的配置文件,位于每个PS2存档中。它定义了背景颜色(四个角)、透明度、三组光源的位置与颜色、环境光,以及三个图标文件名(普通、拷贝、删除)。解析这些数据是还原图标显示效果的基础,尤其是背景和光照参数直接影响最终渲染的视觉一致性。
icon文件结构:顶点、动画与纹理
icon文件由20字节的Icon头、顶点段、动画段和纹理段组成。Icon头包含顶点数量、动画形状数、纹理类型等关键信息。顶点段存储每个顶点的坐标、法线、纹理坐标和RGBA颜色,坐标需除以4096还原。动画段通过多个形状的顶点插值实现动作,纹理段为128x128的TIM格式,分未压缩BGR555和RLE压缩两种。
纹理处理:从BGR555到RGB24
纹理像素为128x128,未压缩时采用BGR555格式,每像素2字节。转换为RGB24时,需将5位色彩值左移3位(低3位补0)扩展为8位。压缩纹理使用简单的RLE算法,通过rle_code和rle_data交替解码。注意有些游戏(如ICO)没有纹理数据,图标会显示为全黑,解析时需根据Icon头的tex_type字段判断。
动画实现:顶点插值与形状循环
动画段包含动画头和多个动画帧,每个动画帧对应一个形状(一套顶点数据)。通过在不同形状的顶点之间进行插值,并循环渲染,即可形成动画效果。动画头中的frame length和frame count等字段有助于控制播放节奏,但部分字段含义尚不明确,实际实现时可主要依赖顶点插值来驱动动作。
Q&A
PS2游戏存档中的3D图标文件包含哪些主要部分?
PS2游戏存档中的3D图标文件(icon文件)主要包含四个部分:Icon头、顶点段、动画段和纹理段。Icon头固定20字节,存储顶点数量、动画形状数量、纹理类型等关键信息;顶点段保存模型的所有顶点、法线、纹理坐标和RGBA颜色数据;动画段保存动画帧信息;纹理段保存128x128的TIM格式纹理。
如何从PS2存档的icon.sys文件中获取背景颜色和光照信息?
icon.sys文件固定964字节,其中偏移12字节处是背景透明度(0-255),偏移16、32、48、64字节处分别存储背景左上、右上、左下、右下角的颜色(RGB,0-255)。光照信息位于偏移80、96、112字节处,分别是三个光源的位置(XYZ,0-1);偏移128、144、160字节处是三个光源的颜色(RGB,0-1);偏移176字节处是环境光颜色(RGB,0-1)。
PS2图标文件中的顶点数据是如何存储的?
顶点段包含所有顶点的数据,每个顶点包含顶点坐标、法线坐标、纹理坐标和RGBA颜色。顶点坐标每个占用8字节,包含int16的X、Y、Z坐标(使用时需除以4096)和一个未知的uint16;法线坐标结构与顶点坐标相同;纹理坐标占用4字节,包含int16的U、V坐标(使用时需除以4096);顶点RGBA每个占用4字节,分别为R、G、B、A(0-255)。
PS2图标动画是如何实现的?
PS2图标动画通过顶点插值实现。图标文件中包含多个“动画形状”(animation_shapes),每个形状对应一套顶点数据。动画段包含动画头和若干动画帧,每个动画帧包含若干关键帧。通过在不同形状的顶点数据之间进行插值,并循环渲染这些形状,即可形成动画效果。
PS2图标纹理的TIM格式如何解码?
纹理为128x128的TIM格式,根据Icon头中的tex_type字段分为未压缩和压缩两种。未压缩纹理像素格式为BGR555,每像素2字节,需转换为RGB24或RGBA32;压缩纹理使用RLE算法,数据以u16的rle_code和rle_data交替出现,解压后再转换为RGB24或RGBA32。
icon.sys文件中如何指定图标文件?
icon.sys文件中偏移260、324、388字节处分别存储了普通图标、拷贝图标和删除图标的文件名(空字符结尾)。每个游戏存档可以对应最多3个icon文件,分别在不同场景显示。有些游戏可能共用同一个图标文件。