OCamlのOpenGLラッパー「glMLite」
現在の会社を退職することになりました。予定では3年で退職する予定が4年半になり
ましたので、ここら辺が一つの区切りかな、と。
まぁそんな近況はどうでもよくて、最近とみにゲームの類を作りたいと思うようになっ
てきました。
昨今のゲームは2Dも含めてほとんど3Dで作られています(ですよね?)。2Dは3Dに含
まれるので、3Dを使えば当然ながら2Dもできる、ということですね。
私は専門学校時代はDirectXを使ってゲームを作っていましたが、私の環境であるLin
uxでは(wine使えばいけないこともないですが)DirectXは使えません。であればど
うするかというと、結構前から興味だけはあった「OpenGL」に手を出してみることに
します。
さて、そんなOpenGLですが、何か調べると色々厄介そうでした。特にOpenGL3.X系列
とそれ以前とで大きく違うらしく、それまで利用していた機能の多くが非推奨+将来
削除が確定しているらしいです。そしてこれからは3.X以前のバージョンを利用する
ものがどんどん少なくなるでしょうから、当然3.X以降に対応しないとなりません。
私は最近OCamlを勉強しているので、ぜひとも関数型言語であるOCamlで作ってみたい
ところです。ということで、OCamlで利用できるOpenGLバインディングが無いか調べ
てみました。とりあえず利用できるのは以下のものらしいです。他にもあるかもしれ
ませんが。
これを見ると、3.X系列まで対応していると明記しているのはglMLiteのみのようです。
そして、このglMLiteは日本語記事が見当たらないという・・・。GLCamlはあったん
ですが。
このチュートリアル、OpenGLの使い方のみではなく、3Dでの開発に必要な数学的知識
も少しですが細かく記述されています。投影行列とか。さすがにカメラ座標系の話は
ありませんでしたが、どういう風にOpenGLを利用していくのかが分かる記事だと思い
ます。
glMLiteは、OpenGLの3.Xにおける前方互換性も含めたかなり詳細なチュートリアルもあります。当然英語ですが、私程度の英語力でも、単語を調べながらなら結構わかります。
使ってみた感じもわかりやすい(OpenGLのAPIそのままなので、OCamlの他のモジュー
ルと比較すると関数名に違和感がありますが)ですし、ライセンスとしてもGPL→LGP
L→MITと変遷し、ライセンス的にも組み込みやすいものになっているようです。結構
いいんではないかと思ったので、役不足ではありますが紹介してみたいと思います。
glMLiteのインストールとサンプルのビルド
まずはglMLiteをインストールします。環境はLinuxのみということで・・・。Window
sでも動くかどうかは未確認ですが、環境さえ整えれば、.exeというファイルが出来
ていることもありますので動くんではないかと思います。
http://www.linux-nantes.org/~fmonnier/ocaml/GL/から、glMLiteをダウンロードします。
適当な場所に展開します
# cd ~/work # tar xf glMLite-0.03.51.tgz # cd glMLite-0.03.51
makeコマンドでビルドします。このUSE_GL3_CORE_PROFILE=OKを忘れると古いバージョ
ンに対応したものになるようです。
# make all USE_GL3_CORE_PROFILE=OK # sudo make install
うまくいけばライブラリがインストールされます。また、glMLiteはGLUTライブラリ
も含んでいますので、他にライブラリを入れる必要は(とりあえず)ありません。
後はチュートリアルをコピペしてocamlcでビルドすれば、動作するものが作れます。
チュートリアルを保存したものをsample.mlとすると、以下のようにしてビルドでき
ます。
ocamlopt -c -I glMLiteをインストールしたパス GL.cmxa vertArray.cmxa VBO.cmxa sample.ml
OpenGL3.X系統でのプログラミング
私はDirectXの9.0系列までしか知りませんが、記憶を呼び起こすと、DirectXでは
「頂点バッファを作る」→「変換行列を作る」→「頂点バッファに変換行列、ワール
ド行列、投影行列、カメラ変換行列をかけてレンダリングする」
という感じだったと思います(間にテクスチャやらボーンの移動やらなんやら挟みま
すが)。
一昔前のOpenGLでは、こういう部分にそれぞれヘルパ関数的なものがあったようです
が、OpenGL3.X以降ではVBO(Vertex Buffer Object)とShader(GLSL)でほとんどを行う
ように方向転換されたようです。プリミティブについても、色々あったのが、基本的
にTriangleだけしか使わないようにされているようです。
どれくらいまでShaderでやるのかというと、サンプルのShaderにもありますが、投影
行列の適用とかまで全部Shaderでやるみたいです。DirectXでは行列演算は基本的にD
irectXのライブラリだけで出来ていて、そのあたりではShaderはあまり使わなかった
と記憶しています。
Shaderも二種類あって、Vertex ShaderとFragment Shaderとに分かれています。何が
どう違うのかというと
- Vertex Shader
- "頂点毎"に適用される
- Fragment Shader
- "ピクセル毎"に適用される
ということのようです。DirectXで使ったことがあるShaderも確かこんな感じだった
ような気がします(このあたりの記憶に自信はありません)。
つまり、より基本的な要素に機能を絞る代わりに、Shaderとかの性能をより高め、よ
りプログラマブルにする、というのが主な目的なようです。ShaderはGLSLという言語
でやられるようですが、私が5年ほど前に見たことがあるShaderよりも分かりやすく
なっているように見えました。
glMLiteではOpenGL3.X系列のインターフェースを使うことができますので、このあた
りの要素も全て含まれているようです。ただ、基本では行列演算とかベクトル演算に
ついては全て自前で用意する必要がありますので、そのあたりは私のような初心者に
はなかなかつらいものがあります。ベクトルの内積・外積すら覚えてなかったですか
ら・・・。
超駆け足でしたが、glMLiteについて紹介してみまし・・た・・・?あれ、あまり紹
介になってないぞ・・・。それでもほとんどなかったglMLiteについて記事を書いた
のでよいとします。これが使いづらいという場合は、自分でOpenGLのバインディング
とかを書いてみるのもいいんではないでしょうか。私も寄り道とはわかっていますが、
あとで書いてみることにします。