我想在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。
答案 0 :(得分:1)
当然可以。
对于第一步,请参阅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位字使用了这个'相同的'常量以避免存储该数据。