0

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

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

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

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

4

2 回答 2

1

是的。

  1. 解压文件格式。
  2. 缩放原始图像数据
  3. 压缩新的缩放数据并保存

第一步,请参见https://github.com/Volcore/quickpvr或 PowerVR 的 SDK。

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

但是,鉴于您的情况,我会将这一切作为预处理步骤进行,并在您的应用程序中包含两个版本的纹理。

于 2011-12-04T06:33:13.723 回答
1

如果您不需要纹理自动重复/换行,而只是将 480 x 320 纹素用作 512x512 纹理的子集,并且从不访问 X > 480 和 y > 320 的部分,那么您可以重新排列数据。

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

请注意,您需要考虑存储顺序(可能在 bronxbomber92 提供的链接中进行了描述),但我突然想到可能有一种更简单的方法。压缩数据以 64 位块排列/交织。如果您使用恒定颜色填充源图像,则在压缩后(至少使用 IMG PVRTextool 压缩器)应该有合理的百分比(~38%)相同的 64 位块。例如,您可以使用一组标志来标记哪些 64 位字使用此“相同”常量以避免存储该数据。

于 2012-01-03T14:44:31.780 回答