強火で進め

このブログではプログラム関連の記事を中心に書いてます。

(iPhone)テクスチャを使う

(※当初、掲載していたプログラムは一部ミスが有ったの修正しました)

今回はiPhoneでテクスチャ(アルファ付き、無しの両方)を使用する方法を解説します。

iPhoneのプログラムのglDrawArrays()を使ったものとglDrawElements()を使ったサンプルを準備しました。こちらを確認しながら読み進めて下さい。

Mac版のプログラムはこちらを参照して下さい。

ブレンド関数の設定とブレンド処理の有効化

今回はアルファ値を含んだテクスチャを使用するためセットアップ処理の部分で以下の記述を追加します。

        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_BLEND);

テクスチャファイルの読み込み

テクスチャファイルは NSImage を使い、PNGファイルを読み込んでmallocで確保したメモリ上に展開しています。

詳細は以下のメソッドを参照下さい。
(※こちらのメソッドは32ビットと24ビットのPNGファイルをテクスチャとして読み込めるメソッドとなっています。ご自身のプログラムにてご自由にお使い下さい)

- (BOOL)loadTexture:(NSString *)filename toOutput:(unsigned char**)textureData andTextureSize:(int*)pTextureSize

フレームワークの追加

こちらのメソッドでは CoreGraphics フレームワークを使用していますので以下のパスから CoreGraphics.framework を追加して下さい。

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks/CoreGraphics.framework

ディレクトリ iPhoneOS2.2.1.sdk は対象にしするバージョン毎に異なります。自分がターゲットにするOSのディレクトリを選択して下さい。

- (BOOL)loadTexture:(NSString *)filename toOutput:(unsigned char**)textureData andTextureSize:(int*)pTextureSize

メソッドの引数の説明は以下となります。

filename テクスチャに使う画像ファイル(フルパスで指定)。
textureData テクスチャに使うメモリ領域を指すポインタ。画像ファイルの読み込みに成功した場合に malloc() で確保された領域が設定されます。アプリ終了前に free() して下さい。
pTextureSize テクスチャのサイズを返します。iPhoneでは縦、横のサイズが同一で有る必要があるためこの値が縦、横両方のサイズを示しています。

次にテクスチャ名を取得。

        glGenTextures(1, &flowerPanelTextureName);

それをBindし、カレントに設定します。

        glBindTexture(GL_TEXTURE_2D, flowerPanelTextureName);

これにより以降の処理はこのテクスチャ名に関連付けられます。

テクスチャ関連の各種設定を行います。

        glTexImage2D(GL_TEXTURE_2D, 
                     0,                         // MIPMAPのテクスチャ解像度(使用しないときは0)
                     GL_RGBA,                   // OpenGL内部でのピクセルデータのフォーマット
                     flowerPanelTextureSize,    // 幅
                     flowerPanelTextureSize,    // 高さ
                     0,                         // テクスチャの境界線の太さ
                     GL_RGBA,                   // メモリ上(格納前)のピクセルデータのフォーマット
                     GL_UNSIGNED_BYTE,          // メモリ上(格納前)のピクセルデータのデータ型
                     flowerPanelTextureData     // メモリ上(格納前)のピクセルデータへのポインタ
                     );
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);    // S方向(横方向)で元のテクスチャ画像外の位置が
        // 指定されたときの処理方法
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);    // T方向(縦方向)で元のテクスチャ画像外の位置が
        // 指定されたときの処理方法
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);       // テクスチャ拡大時の補完方法を指定
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);       // テクスチャ縮小時の補完方法を指定 

描画

描画処理の主な部分は以下となります。

まずはテクスチャのBindを行います。これにより以降の処理でテクスチャが必要になった場合、 flowerPanelTextureName で設定したデータが使われます。

    glBindTexture(GL_TEXTURE_2D, flowerPanelTextureName);

そして次にメインの描画コマンドを実行します。

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

以上となります。テクスチャの画像ファイルを変更するなど自分でも色々と試してみて下さい。

iPhone3Dプログラミング講座の一覧はこちら