はじめに

Last update: <2012/05/18 15:44:16 +0900>

OpenGLとは

"OpenGL is a software interface to graphics hardware."

これはOpenGLについて解説している「赤本」[1]の冒頭に記されている説明書きです.非常に簡潔ですがOpenGLを一言で説明するとこうなります.

OpenGLは,2Dまたは3Dのグラフィクスを生成するためのプログラムライブラリです.アプリケーションの開発者はOpenGLが提供する関数を組み合わせて,より複雑なモデルやシーンを実現することができます.このため,OpenGLは様々な目的,CADやシミュレーション解析,バーチャルリアリティのシーン作成など,非常に広い分野で用いられています.

計算機でグラフィクスを作成するには,大きな労力を必要とすることは想像に難くないでしょう.例えばモデルの幾何学計算や照光計算を1からやろうとすると,プログラムの作成に莫大な時間を費やさなければなりません.また計算処理やハードウエア周りで最適化されたコードを使わない限り,計算機のポテンシャルを有効に利用できません.特に映像のリアルタイム性が問われる場合には深刻な問題となります*1.こうした背景から,汎用性をもたせて再利用,高速化を図ったライブラリが作成され,活用されるようになってきました.


OpenGLの歴史

OpenGLの前身は,SiliconGraphics社(以下SGI)の開発したGL(IRIS-GL)です. SGIはグラフィクス機能に特化したワークステーション(GWS: Graphics Work Station)を開発している会社で,そのグラフィクス機能を利用するためのライブラリとしてIRIS-GLを提供していました.

SGIのワークステーションは,行列計算などを専用ハードウエア(グラフィクスエンジン)で実行できる,描画処理に秀でたマシンですが,価格が非常に高く*2,特殊な用途にしか用いられませんでした.SGIや他社の開発者は,IRIS-GLを他機種に移植しようと試みましたが,IRIS-GLがハードウエアに大きく依存していたため,実現することができませんでした.その代わりに,ハードウエア環境に依存しないライブラリとしてOpenGLが開発されることになりました.

SGIはOpenGLの開発に力を注ぐと共に,自社のグラフィクスワークステーションにおいてもOpenGLが利用できるようにしました.また他の会社でも,SGIとライセンス契約することによって,OpenGLが利用できる環境を開発,販売できるようになりました*3


OpenGLとその補助ライブラリ

OpenGLにはプログラミング作業を効率化したり,ハードやOSに依存した部分を記述するための補助ライブラリが用意されています.

OpenGL自体はハードウエアに依らないグラフィクス記述ライブラリで,最も基本となる約120個の強力なコマンドからなっています. 各コマンドには他のライブラリのコマンドと区別するために,接頭詞がつきます.例えば,OpenGLのコマンドには接頭詞"gl"がつきます.

OpenGLの基本的なコマンドとは別に,座標変換や特殊な曲面を記述するためのユーティリティライブラリ(GLU)があります.このコマンドの接頭詞にはそれぞれ"glu"がつきます.

一方,X-Window用のOpenGL拡張コマンドも存在します.X-Windowのプログラムの拡張としてOpenGLを利用するときに使います.接頭詞は"glX"です.

描画そのものやマウスやキーボードの入力はハードウエアが管理しています.OpenGLではハードに特化している部分でもソースレベルでは統一されています.例えばマウスの入力に関する部分をOpenGLで記述する場合には,auxMouseFuncという関数を用います.計算機ごとにauxMouseFuncの処理内容は異なりますが,OpenGLでは関数名を統一しておくことで,互換性を保っています. このように入出力などハードウエアに関わる部分は,補助ライブラリとしてコンピュータの機種ごとに用意されています.コマンドの接頭詞は"aux"*4です.

さらにauxの機能を拡張したものとして,GLユーティリティキット(GLUT)があります.マウスにメニュー機能を付加したり,文字を表示したりといったことも可能になっています.接頭詞は"glut"です.本資料ではGLUTを利用することを想定して記述しています.


プログラムの構造

行列計算やコマンドの細かな説明をはじめる前に,OpenGLプログラムの構造を簡単に説明しておきます.関数の詳細については後ほど説明しますので,とりあえず次のプログラムに目を通してください.

#include <GL/glut.h> #include <stdlib.h> void display(void) /*画面描画時に呼ばれる*/ { static GLfloat spin = 0.0; spin = spin + 1.0; /*spinを増加*/ if (spin > 360.0) spin = spin - 360.0; glClear(GL_COLOR_BUFFER_BIT); /*バッファのクリア*/ glPushMatrix(); /*行列をプッシュ*/ glRotatef(spin, 0.0, 0.0, 1.0); /*spin[度]回転*/ glColor3f(1.0, 1.0, 1.0); /*白色に設定*/ glRectf(-25.0, -25.0, 25.0, 25.0); /*正方形を描画*/ glPopMatrix(); /*行列をポップ*/ glFlush(); /*描画*/ glutSwapBuffers(); /*バッファを交換*/ } void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); /*黒で画面クリア*/ glShadeModel (GL_FLAT); /*フラットシェーディング*/ } void reshape(int w, int h) /*画面サイズ変更時に呼ばれる*/ { glViewport(0, 0, (GLsizei) w, (GLsizei) h); /*画面の出る範囲*/ glMatrixMode(GL_PROJECTION); /*視界変換宣言*/ glLoadIdentity(); /*単位行列代入*/ glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);/*視体積の設定*/ glMatrixMode(GL_MODELVIEW); /*モデル変換宣言*/ glLoadIdentity(); /*単位行列代入*/ } int main(int argc, char** argv) { glutInit(&argc, argv); /*GLUT初期化*/ glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);/*表示モード設定*/ glutInitWindowSize (250, 250); /*画面の大きさ設定*/ glutInitWindowPosition (100, 100); /*画面の位置設定*/ glutCreateWindow (argv[0]); /*引数の名前のウインドウ作成*/ init (); glutIdleFunc(display); /*アイドル時に呼ぶ関数*/ glutDisplayFunc(display); /*表示時に呼ぶ関数*/ glutReshapeFunc(reshape); /*画面サイズ変更時に呼ぶ関数*/ glutMainLoop(); /*描画開始*/ return 0; } これまでC言語を勉強してきた人にとっては,プログラムの構造が見えてこないかも知れません.Cプログラムの主関数であるmain()中では各種設定のほか関数名を宣言しているだけで,どのように処理が移るのかわかりにくくなっています.

コメントにありますが,システムアイドル時と表示時に呼ばれる関数としてdisplay(),画面サイズ変更時に呼ばれる関数としてreshape()となっています.

これらの関数は,描画ループに入ってから適宜呼ばれます.例えば描画ループを処理中に画面サイズが変更された場合,直ちにreshape()という関数が呼ばれます.このような関数をコールバック関数(callback function)といいます. キーボードやマウスの入力があったときに処理をしたい場合も,同様にコールバック関数を使うことになります.Windowsの世界では,イベントドリブン(event driven)とも呼ばれているようです.

プログラムの詳しい内容については後ほど触れます.


演習


自習問題

  1. グラフィクスに関するライブラリについて,OpenGL,IRIS-GLの以外のものを各自で調べ,概要をまとめてください.
  2. OpenGLのソースコンパイルの方法を何度も繰り返して慣れて下さい.

戻る