Opengl
OpenGLを使い始めるには、OpenGLが仕様であると言うことから始める必要があります。 つまり OpenGLは、必要な機能のセットのみを定義します。 実装は特定のプラットフォームに依存します。
OpenGLは、グラフィックスを操作するためのプログラミング言語APIに依存しないクロスプラットフォームです。 OpenGLは低レベルAPIであるため、それを使用するには、グラフ全体をある程度理解し、線形代数の基本を知っていると便利です。
命名
OpenGLでの関数の命名についていくつかの言葉を言ってみましょう。 まず、OpenGLによって直接提供されるすべての関数の名前は、接頭辞glで始まります。 第二に、一連の数字(たとえば、座標や色)で特徴付けられる特定のパラメーターを定義する関数には、[パラメーターの数+パラメーターの種類+パラメーターの表現]という形式のサフィックスが付いています。
- パラメーターの数-受信したパラメーターの数を示します。 次の値を取ります: 1、2、3、4
- パラメーターのタイプ-受信したパラメーターのタイプを示します。 次の値が可能です: b 、 s 、 i 、 f 、 d 、 ub 、 us 、 ui 。 つまり バイト(Cの文字、8ビット整数)、short(16ビット整数)、int(32ビット整数)、float(浮動小数点)、double(倍精度浮動小数点)、符号なしbyte、unsigned short、unsigned int(最後の3つは符号なし整数です)
- パラメーターの表示-パラメーターがどの形式で送信されるかを示します。各数値が別々の場合は何も書き込まれず、パラメーターが配列として転送される場合は、文字vが関数の名前に追加されます
例: glVertex3ivは、配列へのポインターとして渡される3つの整数で構成される頂点座標を設定します。
グラフィックス
OpenGLのすべてのグラフィカルオブジェクトは、ポイント、ライン、およびポリゴンのコレクションです。 すべてのオブジェクトが構築される10の異なるプリミティブがあります。 二次元と三次元の両方。 すべてのプリミティブは、ポイント-頂点によって定義されます。
- GL_POINTS-各頂点は点を定義します
- GL_LINES-頂点の個々のペアは線を定義します
- GL_LINE_STRIP-頂点の各ペアは行を定義します(つまり、前の行の終わりは次の行の始まりです)
- GL_LINE_LOOP-前の頂点に似ていますが、最後の頂点が最初の頂点に接続され、閉じた図形が取得される点が異なります
- GL_TRIANGLES-頂点の個々のトリプルは三角形を定義します
- GL_TRIANGLE_STRIP-次の各頂点は、前の2つの頂点とともに三角形を定義します(三角形のリボンが取得されます)
- GL_TRIANGLE_FAN-各三角形は最初の頂点と後続のペアによって定義されます(つまり、三角形は最初の頂点の周りに構築され、横隔膜に似たものを形成します)
- GL_QUADS -4つの頂点ごとに四角形を形成します
- GL_QUAD_STRIP-頂点の次の各ペアは、前のペアとともに四角形を形成します
- GL_POLYGON-指定された頂点の数に等しい角度の数で多角形を設定します
glBegin(primitive_type)... glEnd()コンストラクトは、プリミティブを設定するために使用されます。 頂点はglVertex *で指定されます 。 頂点は反時計回りに設定されます。 座標は、ウィンドウの左上隅から設定されます。 頂点の色はglColor *によって設定されます 。 色は、RGBまたはRGBAとして指定されます。 glColor *コマンドは、別のglColor *コマンドが満たされるまで、または他のglColor *コマンドがない場合はすべての頂点に作用します。
以下は、多色の頂点を持つ正方形を描くコードです。
- glBegin ( GL_QUADS ) ;
- glColor3f ( 1.0、1.0、1.0 ) ;
- glVertex2i ( 250、450 ) ;
- glColor3f ( 0.0、0.0、1.0 ) ;
- glVertex2i ( 250、150 ) ;
- glColor3f ( 0.0、1.0、0.0 ) ;
- glVertex2i ( 550、150 ) ;
- glColor3f ( 1.0、0.0、0.0 ) ;
- glVertex2i ( 550、450 ) ;
- glEnd ( ) ;
OpenGLプログラムの基本
Windowsでのプラットフォームに依存しない操作の場合、 GLUTライブラリを使用できます。 GLUTを使用すると、OpenGLを簡単に操作できます。
プログラムの開始時にGLUTを初期化するには、 glutInit(&argc、argv)を呼び出します。 表示モードを設定するには、 glutInitDisplayMode(モード)が呼び出されます。モードは次の値を取ることができます。
- GLUT_RGBA -4成分の色を含む(デフォルトで使用)
- GLUT_RGB - GLUT_RGBAと同じ
- GLUT_INDEX-インデックス付きカラーを有効にします
- GLUT_DOUBLE-ダブルスクリーンバッファを有効にします
- GLUT_SINGLE-単一の画面バッファを有効にします(デフォルト)
- GLUT_DEPTH -Zバッファーを有効にする(深さバッファー)
- GLUT_STENCIL-スクリーンバッファを有効にします
- GLUT_ACCUM-蓄積バッファーを有効にする
- GLUT_ALPHA-アルファブレンディングを有効にします(透明度)
- GLUT_MULTISAMPLE-マルチサンプリング(スムージング)を有効にします
- GLUT_STEREO-ステレオ画像を有効にします
複数のモードを同時に選択するには、ビット単位のOR「|」を使用します。 たとえば、glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)には、ダブルバッファリング、Zバッファ、および4コンポーネントカラーが含まれます。 ウィンドウのサイズはglutInitWindowSize(width、height)によって設定されます。 その位置はglutInitWindowPosition(x、y)です。 ウィンドウはglutCreateWindow関数(window_head)で作成されます。
GLUTはイベント駆動型のメカニズムを実装しています。 つまり 初期化後に開始されるメインループがあり、宣言されたすべてのイベントは既にその中で処理されています。 たとえば、キーボードのキーを押す、マウスカーソルを移動するなど。 イベントハンドラー関数は、次のコマンドを使用して登録できます。
- void glutDisplayFunc(void(* func)(void)) -画像描画機能を設定します
- void glutReshapeFunc(void(* func)(int width、int height)) -ウィンドウのサイズ変更処理関数を設定します
- void glutVisibilityFunc(void(* func)(int state)) -ウィンドウの可視性状態を変更する処理関数を設定します
- void glutKeyboardFunc(void(* func)(unsigned char key、int x、int y)) -キーボードのキーストロークを処理する機能を設定します(ASCII文字を生成するもののみ)
- void glutSpecialFunc(void(* func)(int key、int x、int y)) -キーボードのキーストローク(ASCII文字を生成しないもの)を処理する機能を定義します
- void glutIdleFunc(void(* func)(void)) -他のイベントがない場合に呼び出される関数を設定します
- void glutMouseFunc(void(* func)(int button、int state、int x、int y)) -マウスコマンドを処理する関数を定義します
- void glutMotionFunc(void(* func)(int x、int y)) -マウスボタンが押されたときにマウスカーソルの動きを処理する関数を定義します
- void glutPassiveMotionFunc(void(* func)(int x、int y)) -マウスボタンが押されていないときにマウスカーソルの動きを処理する関数を定義します
- void glutEntryFunc(void(* func)(int state)) -ウィンドウ外へのカーソルの移動とその戻りを処理する関数を定義します
- void glutTimerFunc(unsigned int msecs、void(* func)(int value)、value) -タイマーによって呼び出される関数を設定します
その後、メインglutMainLoop()ループを実行できます。
最初のプログラム
これで、OpenGLの操作の基本がわかりました。 知識を統合するための簡単なプログラムを作成できます。
まず、GLUTヘッダーファイルを含める必要があります。
- #if defined(linux)|| 定義済み(_WIN32)
- #include <GL / glut.h> / * LinuxおよびWindowsの場合* /
- #else
- #include <GLUT / GLUT.h> / * Mac OSの場合* /
- #endif
これで、mainに何を書くかをすでに知っています。 2つのハンドラーを登録します:ウィンドウのコンテンツの描画とサイズ変更の処理。 これらの2つのハンドラーは、基本的にOpenGLとGLUTを使用するプログラムで使用されます。
- int main ( int argc 、 char * argv [ ] )
- {
- glutInit ( & argc 、 argv ) ;
- glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGBA ) ; / *ダブルバッファリングと4成分カラーをオンにします* /
- glutInitWindowSize ( 800、600 ) ;
- glutCreateWindow ( "OpenGLレッスン1" ) ;
- glutReshapeFunc (形状変更) ;
- glutDisplayFunc (表示) ;
- glutMainLoop ( ) ;
- 0を 返し ます 。
- }
次に、ウィンドウのサイズを変更するためのハンドラー関数を作成する必要があります。 glViewportコマンド(x、y、幅、高さ)を使用して、画像の出力領域をウィンドウ全体のサイズに設定します。 次に、射影行列glMatrixMode(GL_PROJECTION)を読み込み、それを単位glLoadIdentity()に置き換えて、正射影を設定します。 最後に、モデルビューマトリックスglMatrixMode(GL_MODELVIEW)をロードし、単一のマトリックスに置き換えます。
その結果、以下が得られます。
- void reshape ( int w 、 int h )
- {
- glViewport ( 0、0 、 w 、 h ) ;
- glMatrixMode ( GL_PROJECTION ) ;
- glLoadIdentity ( ) ;
- gluOrtho2D ( 0 、 w 、 0 、 h ) ;
- glMatrixMode ( GL_MODELVIEW ) ;
- glLoadIdentity ( ) ;
- }
ウィンドウの内容を描画する関数を記述するだけです。 例として上で引用した正方形を描画します。 かなりのコードを追加する必要があります。 まず、描画する前に、 glClear(モード)を使用してさまざまなバッファーをクリアする必要があります 。 glutInitDisplayModeと同様に使用されます。 可能な値:
- GL_COLOR_BUFFER_BIT-カラーバッファをクリアする
- GL_DEPTH_BUFFER_BIT-深度バッファをクリアする
- GL_ACCUM_BUFFER_BIT-蓄積バッファーをクリアする
- GL_STENCIL_BUFFER_BIT-画面バッファーをクリアする
この場合、カラーバッファのみをクリアする必要があります。なぜなら、 他のものは使用しません。 第二に、描画後、ダブルバッファリングが有効になっているため、 glutSwapBuffers()を使用してスクリーンバッファを変更するようにOpenGLに依頼する必要があります。 すべてはユーザーから隠されたバッファーに描画され、その後バッファーが変更されます。 これは、滑らかなアニメーションを取得し、画面のちらつきの影響を避けるために行われます。
取得するもの:
- 無効表示( )
- {
- glClear ( GL_COLOR_BUFFER_BIT ) ;
- glBegin ( GL_QUADS ) ;
- glColor3f ( 1.0、1.0、1.0 ) ;
- glVertex2i ( 250、450 ) ;
- glColor3f ( 0.0、0.0、1.0 ) ;
- glVertex2i ( 250、150 ) ;
- glColor3f ( 0.0、1.0、0.0 ) ;
- glVertex2i ( 550、150 ) ;
- glColor3f ( 1.0、0.0、0.0 ) ;
- glVertex2i ( 550、450 ) ;
- glEnd ( ) ;
- glutSwapBuffers ( ) ;
- }
まとめ
それだけです! コンパイルできます。 次のようなものが得られるはずです。
コード全体 (記事をマスターしていない人向け)。
原則として、少なくともこれまでにグラフィックに遭遇したことがある場合は、これで複雑なことは何もありません。
OpenGLは、グラフィックを使用してクロスプラットフォームアプリケーションを作成するための便利なツールです。 OpenGLは、最適なプログラミング言語で簡単に使用できます。 C、C ++、C#、Java、Python、Perl、VBなど、多くの一般的な言語のOpenGLへのバインディングがあります。 OpenGLの公式Webサイトでそれらに関する情報を表示できます。