開発関連の人たちで流行になっているRaspberryPiでOpenGLのスタディをしてみました。

まず動画をみてください。

この動画は、RaspberryPiで作ったサンプルを実行したものをキャプチャしてYoutubeにアップしたものです。実際は60fpsで描画されていますが、キャプチャの都合上30fpsになっています。

なにかのデモアプリという雰囲気で作ってます。想定としては、InstagramやFlickr等のサーバーから画像を読み込んできて、3D空間に並べて写真を閲覧するビューアというところでしょうか。
途中画像にズームして切り替わるシーンがありますが、あれは実際にカーソルキーで操作して動かしています。それ以外の浮遊した感じは、スクリーンセーバーのような待機状態をイメージしています。

画像は僕のInstagramからとった写真です。プライベートな感じです。。。ちょっと恥ずかしいですが。
デモなので、画像はサーバーから読んでる風ですが、実際はSDカードにもともとコピーしてあります。

今回のスタディは、OpenGL ES 1をベースにしています。本当はES2をベースにして作ろうと思ったのですが、Shaderを使う予定がなかったので楽をして1ベースにしました。

いずれソースコードを公開しようと思っていますが、とりあえずはなにをやったかだけ紹介します。

1. もともとRaspbian(RaspberryPiでうごくlinuxディストリビューション)に入ってるhello_video、hello_triangleを見た
2. hello_triangle等のコードを参考にOpenGL ES 1を簡単に使うためのベースクラスを実装し、全体をC++化しました。
3. OpenFrameWorksを参考にしつつ、小規模化するためTextureを扱うクラスに矩形描画のメソッドを持たせました。
4. Textureのクラスの派生で画像を開いてTexture化するImageクラスを実装しました。
5. jpegとPNGに対応するため、libjpegとlibpngをapt-getし、サンプルコードを参考にして実装します。
6. キーボードの操作を受け付けるため、keyイベントを取得する方法を調べて実装します。

その他は、ざっくりとしてますが、とりあえず使いやすい形になりました。oF風でsetup(), update(), draw()などを書けば使えるというニュアンスのフレームにしました。
で、作ったのが動画のサンプルです。

うーん、こうして説明してみると結構面倒なことをやってます。

次にベースを直すときは、OpenGL ES2化をして、shaderを使いやすくするクラスとか実装します。
あとは、SDLを用いて初期のセットアップ等を行うようにし、画像のデータを開くところもSDLを使うように変更していきます。
そこら辺やったら、次は動画再生をするVideoTextureクラスとか実装ですかね。
整理できたら順次公開してみようかと思っていますが、オープンソースに不慣れなので、まずはライセンスの勉強から。。。