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バインディングが無いか調べ
てみました。とりあえず利用できるのは以下のものらしいです。他にもあるかもしれ
ませんが。

  • LablGLURL
    • 利用できるAPIバージョンがよくわかりませんでした・・・
  • GLCamlURL
    • 1.Xから2.1までだそうです
  • glMLiteURL
    • 3.Xまで対応しています

これを見ると、3.X系列まで対応していると明記しているのはglMLiteのみのようです。
そして、このglMLiteは日本語記事が見当たらないという・・・。GLCamlはあったん
ですが。

このチュートリアルOpenGLの使い方のみではなく、3Dでの開発に必要な数学的知識
も少しですが細かく記述されています。投影行列とか。さすがにカメラ座標系の話は
ありませんでしたが、どういう風にOpenGLを利用していくのかが分かる記事だと思い
ます。

glMLiteは、OpenGLの3.Xにおける前方互換性も含めたかなり詳細なチュートリアルもあります。当然英語ですが、私程度の英語力でも、単語を調べながらなら結構わかります。

使ってみた感じもわかりやすい(OpenGLAPIそのままなので、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バインディング
とかを書いてみるのもいいんではないでしょうか。私も寄り道とはわかっていますが、
あとで書いてみることにします。