CocoaでTexture

Cocoa Browserでオブジェクトを見ていたときにNSImageRepなるものを発見.
まぁ,これをなんとか使えないかなぁと調べているとNSBitmapImageRepというクラスがありました.このクラスを使うと画像ファイルがいとも簡単に読み込めてしまうのです.

NSGLTextureクラス

NSBitmapImageRepから派生させてNSGLTextureを作りました.
NSBitmapImageRepは,ファイル名を指定するとインスタンスを作成し,その中に画像ファイルのビットデータを保持するクラスメソッドを持ちます.

+(NSBitmapImageRep*)imageRepWithContentsOfFile:(NSString*)

これがあるのでファイル読み込みのメソッドの追加はしなくていいかと思ったのですが,バンドルファイルを読み込みたいので,以下のクラスメソッドを追加しました.

+(NSBitmapImageRep*)imageRepWithContentsOfBundleFile:(NSString*)

こいつは,バンドルファイル名を入力すると,バンドルファイルのフルパスを取得して,その画像を開いてくれるというわけです.このTipsは備忘録もかねているので,いかに記述.

NSBundle* mainBundle;
NSString* fileName;
id returnSelf;
// get bundle object
mainBundle = [NSBundle mainBundle];
// Get images from bundle resource
fileName = [mainBundle pathForImageResource:name];
returnSelf = [super imageRepWithContentsOfFile:fileName];
// return instance pointor
return returnSelf;

なんと便利な・・・うう.まぁ用はNSBundleによる処理をimageRepWith〜にラップしているんです.これでプロジェクトに挿入したファイルをさくっと取り出せるわけです.

テクスチャの読み込み

ここが一番肝心.の割にやっぱりすんなりいきます. 特筆するならGIFの読み込みだけ気をつければいい感じでした.しかし,その読み込んだファイルがどんなフォーマットのなのかということはNSBitmapImageRepには保存されていないのです.このクラスは読み込んでしまうとさっさとビットデータを作成してしまい,ファイルのデータは高さ,幅,画素あたりのバイト数などくらいしかありません.
というわけで,バイト数がその要と言うことになります.
それぞれのデータは以下のメッセージで読めます.

[self pixelsHigh];
[self pixelsWide];
unsigned char* file_data = [self bitmapData];

これで画像のデータは採集できます.そして画像自体のビットデータは,これで読めます.

[self bitmapData];

これでビットデータのポインタがもらえます.戻り値は(BYTE*)なっていました.BYTE型が,signedなのかunsignedなのかわからなかったのですが,とりあえず,unsigned char*で受けました.コンパイラから警告受けていないので同じでしょう(^^;たぶん.
BMP,JPEG,PNG形式はそのまま読み込めます.24bitカラーしかない?のでそのまま受け取り,
glTexImage2DにGL_RGBで渡しました.
くせ者はTIFFとGIFです.まずこいつら複数のレイヤーまたはフレームを持ちます.めんどうくさいのでこの場合は無視します.TIFFの方は24bitカラー+Alpha 8bitなのでglTexImage2DにGL_RGBAで渡しましてやればさっくりいくのですが,GIFはそう簡単にはいきません.
GIF自体は,すでにNSBitmapImageRepによってカラーパレットから色を抜き出したかたちでビットデータを提供されるのですが,bitPerPixelが8bitってだけじゃ,いったいどんなデータかわからないっすよ.というわけで何種類かGIFを用意し,試しました.

  • グレイスケール・非透明・・・8bit
  • グレイスケール・透明・・・16bit
  • 256色・非透明・・・24bit
  • 256色・透明・・・32bit
  • ま,これでOKというわけです.
    GIFだけみたいに書きましたけど,考えればBMPファイルにもいろいろありますよね.
    ってことは,この上の記述はどのファイルにも共通ってことなのでしょう.というわけで調べた見たのが以下です.

  • 24bitカラー・・・24bit
  • 24bitカラー+透明またはアルファ・・・32bit
  • ちょっといい加減かなぁ.ま,百聞は一見に如かず.
    サンプルをダウンロードしてみてください.
    http://code.google.com/p/sonson-code/source/browse/#svn/trunk/mac/texture