OpenGL関係(VB2005)


0.準備

OpenGLとはSilicon Graphics社(シリコングラフィックス社、SGI)が開発した
グラフィック機能を提供するライブラリ(のプログラムインターフェース)です。
同様のものとしてはDirectX(Direct3D/DirectGraphics)がありますが、
私の中での両者の違いは下記のように感じています。(あくまでも個人的感想)

 DirectX
 ・最高のパフォーマンスが出せる。(HW機能を目一杯使える)
 ・最新カードの機能に素早く対応する。
 ・バージョンアップが多く、かつ、旧仕様を簡単に捨てる
  (新しい機能を使おうとすると、全体を作り直しするはめになったりする
 ・出来る事が多いが、しなければならない事も多い。(面倒)
 ・マニュアルはしっかりとある。
 ・ゲーム用。かつ、Windows専用(最近はXBOXも含むか)。

 OpenGL
 ・そこそこのパフォーマンスが得られる。(用途によもるが大抵の場合OpenGLで事足りる)
 ・出来ることが少ない。(複雑な事をしようとするとかなり面倒なことをしないといけない)
 ・単純な描画なら非常に簡単にできる。
 ・バージョンアップがほとんどなく、かつ、ソースレベルでの互換性に優れている。
 ・VBでの情報が少ない。(VB用以外なら実は多い)
 ・CADやモデリングツールなどのアプリ用。
 ・WindowsでもLinuxでも同一ソースで実行できるものが作れる。


OpenGLのDLLはWindows(NT3.5/95以降)に含まれているので特に準備することなく使用できます。
ただしOpenGLは色々な環境で動作できるよう「Windowsのウィンドウ」とか「画面モード」とか
そういうプラットフォームに依存する部分に関する機能は提供しません。
要するにOpenGL本体だけでは画面にグラフィックを表示することができないんです。

多くの場合「OpenGL」という大分類で括られてしまうのですが、実はOpenGLはいくつかのライブラリから構成されています。

ライブラリ名

概要

GL OpenGL本体。狭義のOpenGL。
GLU OpenGL Utility Library。GLの機能を補助する便利な(数学)関数などがある。
AUX 入出力に関する補助(拡張)を行う拡張ライブラリ。
GLUT OpenGL Utility Toolkit。AUX同様の拡張ライブラリ。(AUXの拡張版みたいなもの)
WGL Windows用の拡張ライブラリ。
GLX X Window System用の拡張ライブラリ。
AGL Apple Mac用の拡張ライブラリ。

GL/GLUは環境に依存しない純粋なグラフィックライブラリと言えます。
三角形を描くとか行列計算をするといった機能は提供しますが、
どのウィンドウに表示するとか、画面モードはどうするといった機能はないんです。。
そういった物理的というか環境によって異なる部分を提供するのがAUX/GLUT/WGL/GLX/AGLになります。
またAUX/GLUTはWindowsでもUnixで同じやり方で出来るようにしようというもので、
WGL/GLX/AGLはそれぞれのプラットフォーム専用のライブラリになります。

Windows上でOpenGLを使って画面にグラフィックを表示するには、
 (1) GL(+GLU)+GLUT
 (2) GL(+GLU)+AUX
 (3) GL(+GLU)+WGL
のいずれか(或いは複数の組み合わせも可)で使うことになるのですが、
AUXは古くて機能が足りない(そもそも学習用で実践むきではない)、
WGLはWindowsだけしかダメ、といった理由から(1)のやり方がよく使われます。
(GLUTはキーやマウスなどの入力機能なども提供してくれます。
 通常unixとWindowsではそういう部分が異なりますが、GLUTを使うことで同じやり方=同じソースでunix用とWindows用を書ける訳です。)

注意して欲しいのは、上記のライブラリの内GL/GLU/AUX/WGLはWindowsに入ってますが
GLUTは含まれていないということです。別途インストールする必要があります。
下記あたりで入手できます。
  http://www.xmission.com/~nate/glut.html
glut-3.7.6-bin.zipをダウンロードし、パスの通った箇所に展開しましょう。
(SYSTEM32フォルダあたりに突っ込むのが一番楽かも。実行ファイルと同じフォルダに入れても大丈夫かもしれません)

もちろんGLUTを使用しないならば、インストールする必要はありません。
確かにGLUTは移植性に優れてますが、VB2005で作ったものをWindows以外の環境で実行させたり
多言語に移植しようとするなら拡張ライブラリは見直すべきでしょう。(^^;

っていうか一応GLUTもこのページで扱ってますが、私自身はVB2005から使おうと思いません
プログラム構造に関する考え方がWindowsアプリとは合わないように感じます(^^;;;

http://www.geocities.co.jp/SiliconValley/7406/tips/opengl/opengl_0.html


「コメント」

 ぼくも、基本的にこの考え方が賛成、勿論、C言語で作るが。そうすればポーランドのフリーソフトのC言語でOPENGLが出来ると考えている。もともとAUXはOPENGLのマンマシンインターフェース関係の言語であって、

OPENGLの補助的な役割、そして、APIとの繋がりが出来るので、この方向性、イベント駆動のWINDOWSに合うと思うが。そしてWGLを使うのも良いと思うが。GLUTの場合は、明らかに手続き言語としてのつながりを考え、

イベント駆動(コールバック関数の多用)のWINDOWSには似合わない思います。イベント駆動というのは、マイコンで考えるならば、メイン関数で手続きを多用するのではなく、割り込み処理で全てを解決するとの考えに似ていると思う。割り込みそのものがハード的なイベントと考えれば、イベント駆動とどういう内容かとわかると思うが。

 それがWINDOWSのメッセージとしてでているのである。


AUX 関数と GLUT 関数の対応(一覧表)

AUX 関数を対応する GLUT 関数に書き換えます。
AUX 関数は aux で始まります。 GLUT では同様に関数は glut で始まります。多くの関数は、aux を glut に書き換えることで GLUT の関数に変更することができます。ただし、一部の関数は関数名が異なるもの、インターフェイスの仕様変更のため変更されたもの、廃止されたものもあります。

AUX 関数 GLUT 関数
auxCloseWindow -> glutDestroyWindow
auxCreateFont -> 該当する機能はありません
auxDIBImageLoad -> 該当する機能はありません
auxDrawStr -> glutBitmapCharacter で代用
auxExposeFunc -> 該当する機能はありません
auxGetContext -> 該当する機能はありません
auxGetColorMapSize -> glutGet(GLUT_WINDOW_COLORMAP_SIZE)
auxGetDisplayMode -> glutGet(GLUT_INIT_DISPLAY_MODE)
auxGetDisplayModeID -> 該当する機能はありません
auxGetDisplayModePolicy -> 該当する機能はありません
auxGetHDC -> 該当する機能はありません
auxGetHGLRC -> 該当する機能はありません
auxGetHWND -> 該当する機能はありません
auxGetMouseLoc -> 該当する機能はありません
auxIdleFunc -> glutIdleFunc
auxInitDisplayMode -> glutInitDisplayMode
auxInitDisplayModeID -> 該当する機能はありません
auxInitDisplayModePolicy -> 該当する機能はありません
auxInitPosition -> glutInitWindowPosition, glutInitWindowSize
auxInitWindow -> glutCreateWindow
auxKeyFunc -> glutKeyboardFunc
auxMainLoop -> glutDisplayFunc, glutMainLoop
auxMouseFunc -> glutMouseFunc
auxQuit -> 該当する機能はありません
auxRGBImageLoad -> 該当する機能はありません
auxSetFogRamp -> 該当する機能はありません
auxSetGreyRamp -> 該当する機能はありません
auxSetOneColor -> glutSetColor
auxSetRGBMap -> 該当する機能はありません
auxSolidBox -> 該当する機能はありません
auxSolidCone -> glutSolidCone
auxSolidCube -> glutSolidCube
auxSolidCylinder -> 該当する機能はありません
auxSolidDodecahedron -> glutSolidDodecahedron
auxSolidIcosahedron -> glutSolidIcosahedron
auxSolidOctahedron -> glutSolidOctahedron
auxSolidSphere -> glutSolidSphere
auxSolidTeapot -> glutSolidTeapot
auxSolidTetrahedron -> glutSolidTetrahedron
auxSolidTorus -> glutSolidTorus
auxSwapBuffers -> glutSwapBuffers
auxWireBox -> 該当する機能はありません
auxWireCone -> glutWireCone
auxWireCube -> glutWireCube
auxWireCylinder -> 該当する機能はありません
auxWireDodecahedron -> glutWireDodecahedron
auxWireIcosahedron -> glutIcosahedron
auxWireOctahedron -> glutWireOctahedron
auxWireSphere -> glutWireSphere
auxWireTeapot -> glutWireTeapot
auxWireTetrahedron -> glutWireTetrahedron
auxWireTorus -> glutWireTorus
auxXDisplay -> 該当する機能はありません
auxXScreen -> 該当する機能はありません
auxXWindow -> 該当する機能はありません

この上を紹介した人は、GLUTを強く推薦していますが、上を見れば分かるがかなり機能を縮小している事が分かるが。何故、GLUTを強く紹介するのか理由が分からない。


AUX2GLUT

http://www.asahi-net.or.jp/~yw3t-trns/opengl/glaux/aux2glut.htm