2011年10月16日TweetPocket今までiPhoneでOpenGLアプリケーションを作るときに面倒だった要素の一つとして、テクスチャのロードの問題がありました。DirectX等はテクスチャを使いたい際に画像ファイルを指定するだけでそこから自動でテクスチャを生成してくれたりするのですが、OpenGLの場合はそういった機能は用意されていないので、iPhoneの場合も自分で画像ファイルを展開してからビットマップの配列に変換してテクスチャを生成する必要がありました。GLKitではテクスチャローダーというクラスが用意されていて、ファイルを指定するだけでテクスチャを使えるようになりました。後述の通りこの部分に関しては公式ドキュメントと実際のSDKのAPIの仕様に差異があるため、不確かな情報となっています(2011.10.16現在)。十分に注意してください。GLKTextureLoaderこれがファイルからテクスチャを生成してくれるクラスです。textureWithContentsOfFile:options:error:]を使ってみましょう。GameテンプレートのsetupGLの中で読み込んでみます。わかりやすさ優先で、読み込みオプションやエラーハンドリングは今回は実装しないので、とりあえずoptionsとerrorにはnilを入れておきます。256)GLKTextureInfoGLKTextureLoaderは、読み込んだテクスチャの情報が含まれているGLKTextureInfoクラスのインスタンスを返すのですが、使ってみるとわかりますが正式リリースされたSDKと公式ドキュメントは説明されている内容に差異があります。どちらが正式な仕様なのかわかりませんが、とりあえずSDKの実際の実装を基に説明すると、このGLKTextureInfoクラスのうち実際にこの後使うのはnameプロパティです。これは、自前でプロパティを生成したときにglGenTextures()等で割り当てたIDと同様に、OpenGL上でそのテクスチャを示すIDとして扱われ、後でGLKBaseEffectで描画時のテクスチャを指定する際にもこのプロパティを使います。公式資料で言及されているわけではないので不確かな情報ですが、GLKitにはテクスチャを削除するためのクラスは特に用意されていないようなので、読み込んだテクスチャを削除する場合はglDeleteTexturesを使ってこのIDを指定して削除することになりそうです。heightプロパティ等があります。基本的にはGLKTextureLoaderを使う場合でも読み込むファイルの縦横は2のn乗のサイズになっている必要があります。GLKBaseEffectを使ったテクスチャ描画GLKBaseEffectにはテクスチャに関するプロパティがいくつか用意されていて、それらを使って描画する物体にテクスチャを貼付ける事ができます。ここにも公式ドキュメントと実際のAPIに差異があります。textureEnabledというプロパティがあり、これがGL_TRUEの時にテクスチャが有効になるという記述があるのですが、実際のSDKにはこのプロパティがありません。ドキュメントによると、デフォルトの値がそもそもGL_TRUEになっているようなのですが、実際このプロパティを明示的にセットしなくてもテクスチャの機能を有効にすることができます。GLKBaseEffectでは一つの描画に対して二つまでテクスチャを設定することができるようになっています(texture2d0とtexture2d1)。それらのテクスチャの描画順番をtextureOrderプロパティで変更することもできたりするのですが、とりあえずややこしいので今回はテクスチャを一個だけ使います。GLKEffectPropertyTexturetexture2d0とtexture2d1はGLKEffectPropertyTextureクラスのプロパティですが、read-onlyで既にGLKBaseEffectのインスタンスを作ったときにそれぞれインスタンスが設定されているので、使いたいときはこれらのインスタンスの中のプロパティを書き換える形で使います。ここのプロパティ名にもドキュメントとの差異があります。先ほどテクスチャローダで読み込んだテクスチャをセットするには、下記のようなコードを書きます。textureInfo.name;マッピングの設定GLKitを使った場合でも、当然ながらテクスチャを使った描画ではマッピング情報を含めなければいけません。textureV,とuv座標を加えましょう。※要素の数が増えるのでgCubeVertexData配列のサイズを書き直すのを忘れずに。最後にテクスチャマッピングのデータを転送します。8要素(座標XYZ+法線XYZ+マッピングUV))に変更します。転送先はGLKVertexAttribTexCoord0にします。texture2d1を使う場合はGLKVertexAttribTexCoord1を使います。Gameテンプレートにあるもう一方のShaderを使った描画はそっちも書き換えないと要素数が変わった事によって問題がおきてしまうので、とりあえずコメントアウトしておくことをお勧めします。上の方法で使える事は確認できたけど、公式ドキュメントとSDKの差異が早く修正されてほしいです。スチャを生成する機能は提供していないので、自前でファイルを展開してビットマップを作る必要がありましたが、GLKitではその部分の機能が提供されてます。詳細はこの前のポストで。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイトご意見、ご感想をお願いします。その2ARを学ぶ10連休。折り返し地点までの記録。その110連休に改めてARを勉強することにした。1日目から3日目まで。