言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

OpenGL のなぞ

OpenGL というのは最近僕が良く使っているライブラリの名前で、三次元グラフィックをプログラムするのに使う。世の中には色んなライブラリがあるが、その中でもかなり分かりやすくて好きだ。そんな OpenGL にも僕なりのなぞがあって、今日ひょんな事で解決した。

  • OpenGL 自体はかなり抽象的な事しか定義されていなくて、実際に画面のどの面に表示するかとか言ったプラットフォーム依存の事は隠蔽されている。そういうのは GLUT というライブラリで書くのだが、例えば Croquet は GLUT を使っていないし、そもそも Windows には GLUT は付属していない。GLUT の無い環境やプラットフォーム依存の事を書きたくなったらどうすればいいんだろうか?
  • OpenGL の特徴は状態とスタックがあるという事。関数の一つ一つは必要最低限の引数しか与えられていなくて、現在と状態と与えた引数の組み合わせで OpenGL 自体の状態が変化する。状態が多いというのはあまり嬉しく無い事だが、三次元画像と言う物はたいてツリー状のデータ構造なので、スタックと組み合わせれば特に不便ではない。さて、こういう場合、二つの三次元画像を別々の窓で、しかもマルチスレッドで表示したい場合、つまり、ツリー構造が平行して二つあるような場合はどうしたら良いのだろう。

一つ目の問題は、wgl なんとかという関数を使う事だった(windows の場合)。しかもこれは gl.h では無く wingdi.h に書いてあった。(これが msdn に書いてある事を発見するのに随分無駄な時間を使った。何故ググれないのだ)。OpenGL を使う時、暗黙のうちに wgl なり agl (mac) なりと行ったプラットフォーム依存の関数を使っている。これは、例えば ODE のような数値演算だけして画面の表示を全く行わないライブラリとは違う。

二番めの問題も、wglMakeCurrent というプラットフォーム依存の関数があった、Croquet の場合は b3dxSetBufferRect の中でいつの間にやらこれを呼び出しているので、複数画面を出しても二つの窓が混ざる事は OpenGL のレベルでは無い。これを知らなくて、OpenGL の関数は何故表示したい窓を知る事が出来たのだと悩んでいた。

こういう事が分かっても仕事が進むわけではないが、胸のもやもやが晴れた。