【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で「自分でバンバンしなさい」というコピーが昔はやりました。

 

従って、

 

「しなければならない」ことは「しましょう」ということで、これを次のネタにしましょうか?