3

我正在从 JPG 格式加载非常大的纹理,在 iOS5 之前,我将使用 Apple 示例 Texture2D 类将 JPG 纹理从 RGB888 转换为 RGB565 格式,以将所需的内存空间减半。然后它将以 RGB565 格式上传到带有 glTexImage2D 的 GPU。

使用 iOS5,我将调用转换为使用新的 GLKTextureLoader。然而,即使 JPG 没有 alpha 通道,它似乎也只是使用 RGB888,因此占用了 GPU 内存的两倍。

有没有办法让 GLKTextureLoader 在上传到 GPU 时使用 RGB565?我现在正在使用 [GLKTextureLoader textureWithContentsOfFile:jpgFile]。我还尝试了 [GLKTextureLoader textureWithContentsOfData:data] 并将原始 RGB565 位图的 NSData 传递给它,但是当我尝试这样做时出现错误“{GLKTextureLoaderErrorKey=图像解码失败}”。

4

1 回答 1

7

“textureWithContentsOfData”似乎是一个损坏的方法(注意:缺少它的文档 - 没有规范说明它接受什么)Apple尚未实现 - 它对于我尝试的所有标准 NSData 输入都失败了。

然后我使用标准的 gl* 方法调用将它们直接交给 OpenGL,它们运行良好,所以错误在 GLKit 中。

我已经向 Apple 记录了一个支持请求,要求他们解释他们的方法,并记录它接受的内容。在那之前,我强烈建议你忽略 GLTextureInfo 类(这是一个好主意,但它有太多问题,不值得 - 放弃这个类让我的性能立即提高了 5 倍!)


更新:Apple 的回应(释义)“嗯。我们也不知道。请将其记录为错误”。

...并且:Apple 在收到错误时的回应:“这不是错误,它是按照设计的,我们认为没有必要记录它。它的作用很明显”

(他们的“显而易见”是:您必须仅向其发送 PNG 或 JPG 或 PVR 格式的数据……(并且当您在特定硬件上运行时才允许使用 PVR)其他任何东西都会崩溃。)

他们的最终建议是:使用 OpenGL 纹理调用来上传纹理,即在纹理加载时完全忽略 GLKit - 因为 OpenGL 可以工作,记录在案等。令人失望,但似乎是真的 - 在现场项目中, OpenGL 纹理调用通常比 Apple 的 GLKit TextureInfo 类快十倍。说真的 - 不要使用它,这太可怕了:(。

于 2013-03-01T20:47:39.790 回答