我有一个应用程序,我需要使用 OpenGL 纹理在屏幕上绘制文本。在我的渲染循环中,我从我的 TextureController 请求纹理,它具有以下功能
- (GLuint)textureForImageNamed:(NSString*)fileName;
{
// we're checking a hash.. possibly slow
NSNumber* textureHandle = [textures objectForKey:fileName];
if(!textureHandle)
textureHandle = [self loadTexture:fileName];
GLuint handle = (GLuint)[textureHandle unsignedIntValue];
return handle;
}
其中 loadTexture 像这样将纹理加载到内存中
- (NSNumber*)loadTexture:(NSString*)fileName
{
GLuint texID = [GLKTextureLoader textureWithCGImage:
[[UIImage imageNamed:@"star.png"] CGImage]
options:nil
error:nil].name;
NSNumber* num = [NSNumber numberWithUnsignedInt:texID];
[textures setObject:num forKey:fileName];
return num;
}
以及类似的文本功能:
- (GLuint)textureForTextWithString:(NSString*)text;
- (NSNumber*)loadTextureForString:(NSString*)text;
当我在渲染循环之前请求图像一次时,这一切都很好,但重点是需要绘制的文本和图像事先不知道。所以我希望能够调用textureForTextWithString:@"fooBar"
并给我纹理(如果之前加载过),或者加载它——将它添加到字典中,然后给我。但是,对于所有未预加载的纹理(即textureForTextWithString:@"fooBar"
在我开始渲染循环之前未调用的纹理),我得到了一个黑色纹理。
渲染循环中的相关代码:
GLuint secondTex = [textures textureForTextWithString:@"NO"];
glBindTexture(GL_TEXTURE_2D, secondTex);
glBindBuffer(GL_ARRAY_BUFFER, some_vertex_buffer);
glDrawArrays(GL_POINTS, 0, num);
我正在寻找解决方案,或者更好的解决方案——关于如何更好地处理这个特定问题的建议。
编辑:有问题的两个文件可以在这里找到:
- https://gist.github.com/3153940 - 主要的 OpenGL VC
- https://gist.github.com/3153941 - 纹理控制器