PS2纹理图片编码算法「A1B5G5R5」

PS2纹理图片编码算法「A1B5G5R5」

💡 原文中文,约1000字,阅读约需3分钟。
📝

内容提要

PS2纹理贴图采用A1B5G5R5编码,每像素2字节,alpha占1位,RGB各占5位,可解码为32位RGBA。该格式有损,每通道丢失低3位,但压缩比达2:1,配合RLE可进一步缩小纹理体积。纹理不宜用jpg/png,因GPU需直接按坐标读取像素。

🔎

延伸解读

为何纹理不用JPG或PNG

文章指出,纹理由GPU直接读取渲染,若使用JPG或PNG,GPU每次取像素都需先解码整张图,效率极低。因此PS2采用未压缩的位图格式,如A1B5G5R5,可按坐标直接获取RGB数据,适合实时渲染。

A1B5G5R5的精度损失与压缩收益

该格式每像素2字节,alpha仅1位,RGB各5位。解码为32位RGBA时,每通道低3位被丢弃,属于有损编码。但换来2:1的压缩比,纹理体积减半,再结合RLE可进一步缩小,适合PS2有限的内存与带宽。

解码实现的关键步骤

伪代码展示了从16位数据还原32位RGBA的过程:读取2字节,按位掩码提取R、G、B分量,并左移3位填充到8位通道。注意alpha位未在代码中处理,实际使用时需单独提取。这种位操作是理解PS2纹理格式的基础。

❓

Q&A

PS2纹理贴图为什么不适合用jpg或png格式?

因为纹理需要由GPU直接按像素坐标读取RGB数据进行渲染,而jpg或png是压缩格式,GPU无法直接读取单个像素,必须先解码整个图片,这会影响渲染效率。因此最理想的格式是未经压缩的位图格式。

A1B5G5R5编码中每个像素占用多少字节?各个颜色通道如何分配?

每个像素占用2字节(16位),其中alpha通道占1位,R、G、B三个颜色通道各占5位。

如何将A1B5G5R5编码解码为32位RGBA?

解码时,从2字节中提取各通道值:R = (b & 0x1F) << 3,G = ((b >> 5) & 0x1F) << 3,B = ((b >> 10) & 0x1F) << 3,alpha位单独处理。这样将5位通道值左移3位扩展到8位,得到32位RGBA数据。

A1B5G5R5编码是有损还是无损?压缩比是多少?

A1B5G5R5是一种有损编码格式,因为将32位RGBA编码成16位时,每种颜色通道会丢失低3位数据。但它的压缩比达到2:1,使图片大小减半。

A1B5G5R5编码如何与RLE编码配合使用?

A1B5G5R5编码本身已经将纹理压缩到每像素2字节,再配合RLE(游程编码)可以进一步缩小纹理图片的体积。

PS2纹理图片通常以什么形式存储?像素数量是多少?

PS2纹理图片通常以位图形式存储,例如从PS2存档中提取的纹理图片,像素数量为128x128。

🏷️

标签

➡️

继续阅读