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);
この特定の問題をより適切に処理する方法についてのアドバイスを探しています。
EDIT : 問題の 2 つのファイルは次の場所にあります。
- https://gist.github.com/3153940 - メインの OpenGL VC
- https://gist.github.com/3153941 - テクスチャ コントローラ