【发布时间】:2012-01-26 12:27:09
【问题描述】:
我正在使用 GLKit 使用 OpenGL ES 2.0 制作 iPhone 应用程序。我正在使用 GLKTextureLoader 同步加载纹理。
问题是对于某个纹理,第一次加载失败。它给出了这个错误:
The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)
对于这个错误代码,苹果文档说明如下:
GLKTextureLoaderErrorUncompressedTextureUpload
An uncompressed texture could not be uploaded.
Available in iOS 5.0 and later.
Declared in GLKTextureLoader.h.
(不是很多)。
我可以在 opengl 上下文处于繁忙状态或类似情况时尝试加载纹理吗?
注意事项:
- 在加载此纹理之前,我会加载其他纹理,这些纹理在第一次尝试时就可以使用。 此外,完全相同的纹理文件将在第二次尝试时正常加载。
- 应该有足够的可用视频内存,因为在此之前我只加载了几个纹理。
- 纹理是带有 alpha 的未压缩 PNG,但我也尝试过使用 TGA(24 位和 32 位),但没有成功。
欢迎任何想法,谢谢
编辑:
更多信息:
opengl 上下文在我的所有屏幕之间共享。我这样做是为了让我的着色器和纹理在屏幕之间加载。
当我进入第二个屏幕时会出现上述问题。在第一个屏幕中,我毫无问题地绘制了带纹理的东西(不过其他纹理)。
当我在游戏世界中加载我的内容(游戏实体)时,会出现上述问题。每个实体都尝试加载纹理。我有一个简单的缓存系统,它只加载一次纹理,然后为所有其他实体返回相同的 id。我正在以一种方法同步加载实体。第一个实体加载纹理失败,然后第二个实体加载成功,然后第三个实体获取缓存的 id。
我在
viewDidAppear中调用加载实体方法,并尝试在加载任何实体之前添加睡眠 2 秒,但没有任何改变。
编辑:
纹理加载代码:
- (GLKTextureInfo *)loadTextureAtPath:(NSString*)path ofType:(NSString*)type withKey:(NSString *)key
{
GLKTextureInfo* tex;
tex = [self textureWithKey:key];
if (tex)
return tex;
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO],
GLKTextureLoaderOriginBottomLeft,
nil];
NSError * error;
NSString *bundlepath = [[NSBundle mainBundle] pathForResource:path ofType:type];
tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&error];
if (tex == nil)
DLOG_LOCAL(@"Error loading texture: %@", [error localizedDescription]);
else
[textures setObject:tex forKey:key];
return tex;
}
【问题讨论】:
-
你说你在有问题的纹理之前加载了其他纹理 - 所有这些(包括失败的纹理)都是用相同的方法吗?如果不是,很可能是当前的 gl 上下文尚未设置。
-
感谢您的评论。我在问题中添加了更多信息
-
嗯,您正在同步加载纹理(不仅仅是实体),例如:+ (GLKTextureInfo *)textureWithContentsOfFile:(NSString *)fileName options:(NSDictionary *)textureOperations error:(NSError ** )outError ?
-
完全正确。我已经在上面发布了我的纹理加载代码
-
您是否尝试在 viewDidLoad 中加载实体而不是 viewDidAppear ?
标签: iphone opengl-es ios5 opengl-es-2.0 glkit