工場裏のアーカイブス

素人によるiPhoneアプリ開発の学習記

OpenGL ES 2.0 と GLKit

OpenGL ES 2.0の高い壁

iPhoneでも、OpenGLを用いて3Dグラフィックス全開なアプリが作成出来ると聞いて、前々からのOpenGL使いである私は早速学習に乗り出しました。しかし、iPhoneのようなスマホ向けに用いられているのは「OpenGL ES」という、本家とは異なるサブセットであることを知ったのです。

最初は「サブセットとは言っても、基本的な文法はきっとそんなに変わらないよね」とタカを括りながら学習を始めました。しかし、特に現在メインとなっているOpenGL ES 2.0では固定機能シェーダが廃止されており、それに伴って glBegin/glEnd とか、glPushMatrix/glPopMatrix とか、glOrtho とか glLight とか glMaterial とか、とにかく本家で慣れ親しんだ関数たちがごっそり消滅していました。その代わりにOpenGL ES 2.0 ではプログラマブルシェーダ(頂点シェーダ、フラグメントシェーダ)のみが実装されており、自前でシェーダプログラムを書くことによって、従来の固定機能シェーダよりも遥かに自由度の高いグラフィックス処理が可能であるようです。

しかし自由度が高くなった分、習得するためのハードルも高くなってしまったようです。素のOpenGL ES 2.0では、ちょっとした図形を描くだけでも、シェーダで視点、照明、座標変換といった様々な行列計算などを自前で実装しないといけずに、シェーダの文法などに関する知識は当然として、幾何学とか行列計算についても相応に高度な知識が必要とされる雰囲気でした。あらかじめ用意された関数やライブラリに頼るプログラミングにドップリ浸っていた自分には、非常に敷居が高く感じてしまいました。

便利なGLKitフレームワーク

そこで、Apple社が私のような存在を見かねてか(笑)、iOS 5.0のリリースと同時に「GLKit」というフレームワークを提供し始めたそうです。これは一言で言うと、シェーダを書くこと無しに、割と従来のOpenGLと近い感覚で、OpenGL ES 2.0によるプログラミングを可能にしてくれるフレームワークです。GLKitには、主に以下のような機能が備わっているそうです。

  • 行列やベクトルなどの数学的計算機能や、更には従来の glOrtho や glFrustrum や gluLookAt といった視点変換行列の生成関数と同等の機能を持つ関数を提供するGLKMath
  • 自力で画像ファイルをピクセルデータの配列に変換しなくても、画像ファイルのパスを指定するだけで、自動的にテクスチャを生成してくれるGLKTextureLoader
  • UIViewクラスから派生しており、各種バッファの処理や画面のスナップショット機能なども備えたGLKView、GLKViewのビューコントローラーであり、アニメーションのFPS設定や一時停止、再開などの機能も備えたGLKViewController
  • 自前でシェーダを書くこと無しに、視点変換行列、照明、マテリアル、テクスチャなどの設定や利用を、従来のOpenGLと近い感覚で行うことが可能になるGLKBaseEffect


この記事を執筆時点で私が用いている XCode 4.6 では、「OpenGL Game」というiOS Application向けのテンプレートが用意されており、シェーダプログラムを用いるパターンと、GLKitを用いるパターンの両方で、OpenGL ES 2.0により立方体を描画するアプリを自動生成してくれます。これを足掛かりとして、実際にGLKitを使って色々プログラムを書いてみましたが、実際に非常に便利なフレームワークです。シェーダプログラムを一切書かなくても、結構な範囲のグラフィックス処理が実現出来そうです(現在公開している「iPendulumWaves」というアプリは、GLKitだけで作成しました)。

まだまだGLKitについての情報はネット上にも書籍などにも少ないようですので、自分なりにGLKitを学習して理解したことがあったら、このブログにメモとして公開して行きたいと思います。もちろんGLKitだけで何もかも出来るというわけではなさそうですので、シェーダについても平行して学習して行きたいと思います。


参考図書:
OpenGL ES2.0 プログラミングガイド
詳解iOS 5 プログラミング