UIImageからOpenGLのテクスチャーを作る (備忘録)

OpenGL ESは非常に柔軟で強力なAPIを提供してくれています。
しかしその一方でOpen GL ESが非常に柔軟過ぎるが為にどこから取っ付いて良いか分からなくなってしまうのが、その移行への障害になっているように思います。

iOSではUIImageを始めとして非常に使い勝手の良い画像処理用のクラスが用意されています。しかしそれをOpenGLで使おうとすると画像フォーマットの変換やCPUとGPU間のメモリー転送等、考慮しなければいけない課題が多いように思います。

OpenGLで提供されている画像イメージはTextureの概念に拘束されます。従って、iOSで一般的に使用されているUIImageやCGImageとTextureの間の画像フォーマット変換とメモリーの転送の効率は非常に重要な問題になると思います。

調べているうちにiOS5からは便利なクラスが提供されていました。

GLKTextureLoader

このクラスを使用するとファイル上のイメージデータやUIImage(CGImageに変換した後)をかなり効率的にOpenGL ESのTextureに変換出来ます。

UIImage* uiImage;
CGImage* cgImage;
uiImage = [UIImage imageNamed:@"xxxx.png"];
cgImage = uiImage.CGImage;

NSMutableDictionary* dic;
NSError* error;

dic = [NSMutableDictionary alloc];
dic = [dic initWithCapacity:0];
[dic setObject:[NSNumber numberWithBool:YES] forKey:GLKTextureLoaderApplyPremultiplication];
[dic setObject:[NSNumber numberWithBool:NO] forKey:GLKTextureLoaderGenerateMipmaps];
[dic setObject:[NSNumber numberWithBool:NO] forKey:GLKTextureLoaderOriginBottomLeft];
[dic setObject:[NSNumber numberWithBool:NO] forKey:GLKTextureLoaderGrayscaleAsAlpha];

textureInfo = [GLKTextureLoader textureWithCGImage:cgImage options:dic error:&error];
[textureInfo retain];

他のビットマップイメージを直接アクセスしながら変換する方法と、パフォーマンスの違いがどの程度あるのかは、今のところ測定していませんが、Appleから直接提供されているAPIですのである程度は信頼出来るのではないかと思います。

最終的に取得される GLKTextureInfo の nameプロパティでTextureにアクセス出来ます。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

CAPTCHA


WP-SpamFree by Pole Position Marketing