在iOS中将NPOT PVR纹理转换为POT

时间:2011-12-04 03:06:11

标签: ios opengl-es pvrtc

我想在iOS上手动加载NPOT PVR纹理(我不是指在OpenGL内存中加载纹理,我的意思是将其加载到自定义数据结构中,允许访问图像数据以放大画布并保存它再次作为一个新的PVR)。

我问这个是因为我们正在实现一个具有大量背景纹理的OpenGL iOS应用程序(非视网膜显示器上的480 x 320)。我们打算将这些纹理存储为NPOT PVR文件,因此我们在3GS + iPhone上有内存增益。

3G-iPhone无法在非OpenGL内存中加载NPOT PVR纹理。我的目的是为3G设备实现一个预处理步骤,将所有NPOT PVR纹理转换为POT PVR并将它们存储在应用程序的Cache文件夹中。

是否可以这种方式加载和处理PVR?例如,TexturePacker生成了PVR。

2 个答案:

答案 0 :(得分:1)

当然可以。

  1. 解压缩文件格式。
  2. 缩放原始图像数据
  3. 压缩新的缩放数据并保存
  4. 对于第一步,请参阅https://github.com/Volcore/quickpvr或PowerVR的SDK。

    对于第三步,没有公开的PVRTC压缩文档或实现。所以你有几个选择。使用class-dump和otx的组合来反编译Apple s texturetool(不建议),或者(并且可能更容易)根据您可以从步骤1中提取的文件格式的任何规范编写自己的编码器。

    但是,根据您的情况,我会将其全部作为预处理步骤进行,并在您的应用程序中包含两个版本的纹理。

答案 1 :(得分:1)

如果您不需要纹理来自动重复/换行,并且只是使用您的480 x 320纹素作为512x512纹理的子集,并且永远不会访问X>的部分。 480和y> 320,然后你可以重新排列数据。

一个建议是将源图像填充到512x512(使用一些恒定颜色),压缩它们,然后只存储纹理的相关部分。当您在应用程序中加载纹理时,只需使用丢失的压缩数据重新填充。 (刚才意识到这并不是最清晰的描述: - |)。

请注意,您需要考虑存储顺序(可能在bronxbomber92给出的链接中有所描述),但我刚想到可能有一种更简单的方法。 压缩数据以64位块的形式排列/交错。如果您使用恒定颜色填充源图像,在压缩之后(至少使用IMG PVRTextool压缩器),则应该有相同百分比(~38%)的64位块。例如,你可以使用一组标志来标记哪些64位字使用了这个'相同的'常量以避免存储该数据。