在iPhone4上使用OpenGL ES加载大纹理时的glError 0x0501

时间:2014-08-10 07:54:23

标签: ios opengl-es cocos2d-x texturepacker

当我尝试在设备上加载PVR图像时出现此错误。它适用于iPhone 5s,5,4s和iPad,但在4中它不起作用。我的PVR图片尺寸为:width = 4096height = 2048

Cocos2d: cocos2d: TexturePVR: Error uploading compressed texture level: 0 . glError: 0x0501
Cocos2d: cocos2d: Couldn't load PVR image /var/mobile/Applications/7CF6C347-8B63-4C1E-857A-41F48C8ACBEF/Race.app/Images/BackGround/bg1.pvr.ccz
Cocos2d: cocos2d: Couldn't add PVRImage:Images/BackGround/bg1.pvr.ccz in CCTextureCache

我从link获得此表单:

  

支持的尺寸为:iPhone 3gs / iPhone 4 / iPad 1 / iPod 3/4:2048x2048 iPad 2/3/4 / Mini / iPhone 4S / 5 / iPod 5:4096x4096

顺便说一句,您可以在4096x4096处导入纹理并打开mip贴图,这会在旧设备上自动使用较小的分辨率纹理。

但是如何打开mip-maps ..这是做什么的?

// support mipmap filtering

sprite->getTexture()->generateMipmap();
ccTexParams texParams = { GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE };
sprite->getTexture()->setTexParameters(&texParams);

1 个答案:

答案 0 :(得分:4)

好吧,你试图创建一个大于GL_MAX_TEXTURE_SIZE的纹理,所以它会失败。没有办法解决这个问题。

  

顺便说一下,你可以在4096x4096导入纹理并打开mip贴图,这个   会在旧设备上自动使用较小分辨率的纹理。

不,你不能。这不是mipmaps的用途。它们在采样纹理时使用,以避免在纹理显示较小时由于稀疏采样而产生的伪影。您仍在尝试创建4096x4096纹理,这根本无法在该设备上运行。

要解决此问题,您应该将纹理大小限制为要支持的所有目标设备的最小支持大小,或者在尝试使用之前动态查询GL_MAX_TEXTURE_SIZE限制并缩减数据。 GL,或提供不同的分辨率供选择。

如果您绝对需要那么多像素,您还可以使用一些纹理平铺方法并将其拆分为多个图块 - 但这可能需要对渲染代码进行一些重大更改,并且可能还会导致性能问题。