【OpenGL(注)】シリーズは、絵心が無く、CGに疎かった私が無謀にもOpenGLに挑戦し、
(1)C#用のOpenTKの導入を行って大苦戦し、学習の必要性を感じたことから、
(2)学習の必要性を感じたことから、C(++)言語用のGLUT(OpenGLユーティリティツール)をウィンドウ環境で試し、
(3)次にお作法にのっとった正しい使い方で基本学習を行い、
(4)「初級」の卒業試験としてBCCSkeltonを使ってデモソフト、Glut_BCCを開発した
所まで来ました。
注:SGI(シリコングラフィックス)の開発した「まかない」ソフトであった2D、3Dのグラフィックライブラリー(API)が1992年にオープンで公開され、以降各種言語やプラットフォーム上で使用されている。
そしてこれからは前回予告したように、導入したままお蔵入りしていたOpenTKを使ってみようということで「OpenTK、再び」というシリーズを開始します。
とはいっても、
まだ具体的なネタが煮詰まっていないので、現在までの私の使った印象を(シリーズを先取りして)書いてみようかと思います。
1.GLUTでOpenGLをウィンドウベースのプログラムで使うのはやや難がある
これはすでに書きましたが、Win32SDKベースでGLUT(実際にはfreeglutですが...)を使うと、GLUTの美点の一つである18の基本プリミティブの描画で落ちてしまいます。私には原因は分かりませんでしたが、この組み込み関数は、GLUTのglutCreateWindow関数で作成するウィンドウとそれが使うコールバック関数を予定しているので、ユーザーの作成したウィンドウでは正しく動作しないと思われます。
従ってウィンドウベースでGLUTを使うには、
(1)(実際にGlut_BCCでやったように)描画出力をGLUTウィンドウにして、制御系をユーザーウィンドウで行うか、
(2)GLUTウィンドウを作成したのち、そのハンドルを取得し、Win32APIのSetWindowLong関数を使ってGLUTウィンドウをコントロール化する
ことが必要になってきます。(注)
注:Glut_BCCで、CGLUTクラスのウィンドウ作成関数、"int CGLUT::Create(char* name = NULL)"で、
//GLのデバイスコンテキストハンドル取得
HDC glDc = wglGetCurrentDC();
//ウィンドウハンドル取得
m_hWnd = WindowFromDC(glDc);
のようにウィンドウハンドルを取得しています。従って、いつでも「コントロール化は可能」と言えます。
2.GLUTはオールドファッションな「C言語による手続き型プログラミング」の趣が強い
「【OpenGL】3DグラフィックとGLUT」シリーズの「お作法にのっとった正しい使い方」を見ていただくと分かりますが、最終版のリリースが1998年であるGLUTなので、エントリーポイントは「main関数」ですし、C++の特徴であるクラス等は全く使われず、関数を呼び出すだけの使い方となっています。(とはいえ、そういうプログラミングスタイルと割り切ると、逆に結構使い勝手が良いとも言えますが。)
3.GLUTの最大の美点である基本18図形のビルトイン
そのような難点を補って余りあるのがGLUTにビルトインされた18の基本図形関数です。特にSolidとWireのTeapotは、その為にGlut_BCCを開発したいと思ったほどの優れものです。(Glut_BCCで、こいつをクルクル回しているだけで幸せになれるようです。俺って、変態?)
一方、OpenTKについては、
1.絶対的に不足するリファレンス
(これもすでに書きましたし、その為に学習にはGLUTを使ったのですが)GLUTに関しては、大学の先生等が色々と書いておられるのでweb上に豊富な情報資料があり、学習するのが楽でしたが、OpenTKの場合、ご本体以外に統一的な情報サイトが乏しく、ご本体もプログラミングの為の簡単な参照サイトがAPIだけなので、はっきり言って情報量が少ないです。メソッドやプロパティについてwebで検索するとMicrosoft LearnがOpenTKについても書いてくれていますが、これも引数や戻り値、オブジェクトの型等細かいことは書かれていません。従って私の場合、GLUTの知識経験から『GLUTのこれは、OpenTKではどう書くのかな?』的な発想で、アタリを立ててググっていました。
2.GLUTをやってきた人間にはやや取っ付きにくい型やメソッド
GLUTの難点はOpenTKで結構克服されており、オブジェクト指向のライブラリーになっているのですが、逆にGLUTで「変数と関数」だったものが、OpenTKでは「クラスオブジェクト、プロパティとメソッド(それも多くはStatic)」になっており、
似て非なる
プログラミングスタイルとコードに慣れる必要がありますが、如何せん、上記1(↑)がそれ阻むので、結構苦労しました。
3.OpenTKの二つのウィンドウスタイル(GLControlとGameWindow)
始めてC#で書かれたOpenTKのコードを見た時に「あれ?あれれっ?」と思ったのは、ウィンドウの初期化で全く異なるコードが書かれていることでした。そして色々と調べているうちに、OpenTKをコントロールとして使用するGLControlとOpenTKをビルトインしたウィンドウであるGameWindowからユーザーウィンドウを派生させる二つの使い方があることが判りました。
しかし、
これら二つの違い、メリデメについて書かれているものは見当たらず、とうとうChatGPT様にお伺いを立てたことも既に書きました。
4.GLUTにあった18の基本図形は自分で書かなければならない
これが結構重いのですが(今も苦闘しています)、GLUTにあった
"ワイアーティーポット", "ソリッドティーポット",
"ワイアー直方体", "ソリッド直方体",
"ワイアー球体", "ソリッド球体",
"ワイアー円錐", "ソリッド円錐",
"ワイアー円環", "ソリッド円環",
"ワイアー四面体", "ソリッド四面体",
"ワイアー八面体", "ソリッド八面体",
"ワイアー十二面体", "ソリッド十二面体",
"ワイアー二十面体", "ソリッド二十面体"
が全くビルトインされておらず、「自分でバンバン(注)」しなければならない、ということです。
注:エースコックの石立鉄男と嵐山光三郎 によるカップ焼きそばのテレビCMで「自分でバンバンしなさい」というコピーが昔はやりました。
従って、
「しなければならない」ことは「しましょう」ということで、これを次のネタにしましょうか?