垂直翻转PVRTC压缩图像数据

时间:2012-10-21 04:00:26

标签: ios opengl-es compression textures pvrtc

我有一些PVRTC 4bpp图像数据需要在不进行解压缩的情况下就地垂直翻转。我写的代码大部分都在工作,但翻版目前引入的是小文物,我不确定原因。

PVRTC翻转代码首先将8字节4x4压缩块移动到其翻转位置,这是由PowerVR SDK中的PVRTDecompress.cpp的TwiddleUV()函数计算的。这部分似乎是正确的。

其次,代码遍历所有8字节压缩块,反转包含存储在2bpp中的4x4调制数据的第二个4字节的顺序。块的前4个字节包含颜色数据,保持不变。

这似乎非常接近正确,但它在翻转的图像中留下了小的伪像,这些伪像在原始图像中不存在,并且主要表现为小的灰色水平线。如果翻转代码运行两次,那么人工制品就会消失,图像与原始图像保持不变。

任何具有PVRTC经验的人都可以解释翻转压缩图像数据还需要做些什么吗?我认为这个问题可能与调制数据的翻转有关,但我在PVRTC文档中的尝试还没有得出答案。

1 个答案:

答案 0 :(得分:2)

为了使这更容易理解,您需要知道PVRTC解码数据的方式,因为它与基于块的方案(如ETC1或S3TC / DXTC)略有不同。为简单起见,我只描述4bpp变体。

PVRTC由2个低分辨率15 / 16bpp图像A和B组成,它们是最终纹理分辨率的1/4 * 1/4,以及全分辨率但2bpp调制图像。为了“逻辑地”解码纹素,XY,A和B图像双线性放大到目标分辨率,然后根据调制图像中的像素混合得到的颜色Axy和Bxy。为了使解码在硬件中更简单,A和B图像与调制数据交错,每个像素的速率为1个像素,调制数据为16个,为64位字。

现在,它没有完全使用位混乱的原因是因为4x4双线性高档与4x4纹素的中心稍微偏移(我认为其原因在图形硬件2003论文linked from wikipedia中有所描述)。我希望你能做的唯一事情就是实际评估每个像素,然后在完成双线性颜色的翻转之后,找出四种可能性中的哪一种实际上是最接近的。在某种程度上,它是一种再压缩,但应该相对较快。