1

我有一些 PVRTC 4bpp 图像数据需要在不解压缩的情况下就地垂直翻转。我编写的代码大部分都在工作,但翻页目前引入了小伪影,我不确定究竟是为什么。

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

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

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

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

4

1 回答 1

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 纹素的中心略有偏移(我认为原因在wikipedia 链接的 Graphics Hardware 2003 论文中有所描述)。我希望您唯一能做的就是实际评估每个像素,然后在翻转双线性颜色之后,找出四种可能性中的哪一种实际上是最接近的。在某种程度上,这将是一种重新压缩,但它应该相对较快。

于 2012-10-21T12:31:28.577 回答