PVR纹理压缩平铺(暴露边缘上下文)

时间:2009-08-05 14:33:37

标签: iphone objective-c opengl textures

我的iPhone游戏中PVR纹理压缩工作都很开心,但是在将多个纹理拼接在一起时我遇到了问题。基本上,我有一个非常大的背景,分为多个512x512瓷砖,所有PVR压缩。然后他们被拉到一起看起来像一个大的背景图像。 PVR的工作方式,因为它不知道它应该压缩纹理就好像它是一个非常大的纹理 - 即使用邻居的平铺信息来确定如何执行PVR压缩。

我想到可能有几种方法可以做到这一点。

1)以某种方式告诉texturetool命令行程序以适应其他相邻的图像 2)使用命令行程序生成一个巨大的PVR纹理,代表整个图像,然后以某种方式将字节分成多个图像 - 可能是不可能的。
3)做一些很好地融合边缘的OpenGL ES技巧。
4)在每个瓷砖中有冗余信息然后在绘制纹理时剪切这些区域时请做一些技巧(请不要)。

希望我可以做1,2或3,或者还有一些其他众所周知的解决方案。

2 个答案:

答案 0 :(得分:4)

我最终选择了选项4.我不认为这是PVRTC不合适的情况 - 事实上它几乎是必需品。当我一次在内存中总共有24个512x512纹理(代表非常大的背景和前景)时,将那些未压缩的纹理放在自杀状态。所以我只是正常使用PVR压缩,然后我在我的平铺算法中编辑了几行代码,以便它们在每一端的15个像素上重叠和修剪。瞧,看起来很棒。花了几天时间并且非常烦人,但我认为这对于那些在iPhone上需要非常大的平铺背景的人来说是个不错的选择。

答案 1 :(得分:1)

我最好的建议,但不是你问的,是知道什么时候PVRTC不合适。到目前为止,最简单的解决方案是不要将PVRTC用于那些瓷砖。我花了很多时间试图让PVRTC在不适合的情况下工作。

那就是说,

使用PVRTC时,纹理始终假定为平铺(自身),因此右边缘上的像素会影响左边缘的像素(与顶部和底部相同)。因此,选择1或2可能不起作用。

一种可能性是在瓷砖上添加一个alpha通道,让它们在边缘周围淡出,这样当它们重叠时,它们会相互淡化。请记住,PVRTC往往会逐渐降低alpha渐变效果。硬alpha边缘通常在PVRTC中有伪影。