OpenGLを知ろう

Opengl



OpenGLを使い始めるには、OpenGLが仕様であると言うことから始める必要があります。 つまり OpenGLは、必要な機能のセットのみを定義します。 実装は特定のプラットフォームに依存します。

OpenGLは、グラフィックスを操作するためのプログラミング言語APIに依存しないクロスプラットフォームです。 OpenGLは低レベルAPIであるため、それを使用するには、グラフ全体をある程度理解し、線形代数の基本を知っていると便利です。



命名



OpenGLでの関数の命名についていくつかの言葉を言ってみましょう。 まず、OpenGLによって直接提供されるすべての関数の名前は、接頭辞glで始まります。 第二に、一連の数字(たとえば、座標や色)で特徴付けられる特定のパラメーターを定義する関数には、[パラメーターの数+パラメーターの種類+パラメーターの表現]という形式のサフィックスが付いています。



例: glVertex3ivは、配列へのポインターとして渡される3つの整数で構成される頂点座標を設定します。



グラフィックス



OpenGLのすべてのグラフィカルオブジェクトは、ポイント、ライン、およびポリゴンのコレクションです。 すべてのオブジェクトが構築される10の異なるプリミティブがあります。 二次元と三次元の両方。 すべてのプリミティブは、ポイント-頂点によって定義されます。



glBegin(primitive_type)... glEnd()コンストラクトは、プリミティブを設定するために使用されます。 頂点はglVertex *で指定されます 。 頂点は反時計回りに設定されます。 座標は、ウィンドウの左上隅から設定されます。 頂点の色はglColor *によって設定されます 。 色は、RGBまたはRGBAとして指定されます。 glColor *コマンドは、別のglColor *コマンドが満たされるまで、または他のglColor *コマンドがない場合はすべての頂点に作用します。

以下は、多色の頂点を持つ正方形を描くコードです。

  1. glBegin GL_QUADS ;
  2. glColor3f 1.0、1.0、1.0 ;
  3. glVertex2i 250、450 ;
  4. glColor3f 0.0、0.0、1.0 ;
  5. glVertex2i 250、150 ;
  6. glColor3f 0.0、1.0、0.0 ;
  7. glVertex2i 550、150 ;
  8. glColor3f 1.0、0.0、0.0 ;
  9. glVertex2i 550、450 ;
  10. glEnd ;




OpenGLプログラムの基本



Windowsでのプラットフォームに依存しない操作の場合、 GLUTライブラリを使用できます。 GLUTを使用すると、OpenGLを簡単に操作できます。

プログラムの開始時にGLUTを初期化するには、 glutInit(&argc、argv)を呼び出します。 表示モードを設定するには、 glutInitDisplayMode(モード)が呼び出されます。モードは次の値を取ることができます。



複数のモードを同時に選択するには、ビット単位のOR「|」を使用します。 たとえば、glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)には、ダブルバッファリング、Zバッファ、および4コンポーネントカラーが含まれます。 ウィンドウのサイズはglutInitWindowSize(width、height)によって設定されます。 その位置はglutInitWindowPosition(x、y)です。 ウィンドウはglutCreateWindow関数(window_head)で作成されます。

GLUTはイベント駆動型のメカニズムを実装しています。 つまり 初期化後に開始されるメインループがあり、宣言されたすべてのイベントは既にその中で処理されています。 たとえば、キーボードのキーを押す、マウスカーソルを移動するなど。 イベントハンドラー関数は、次のコマンドを使用して登録できます。



その後、メインglutMainLoop()ループを実行できます。



最初のプログラム



これで、OpenGLの操作の基本がわかりました。 知識を統合するための簡単なプログラムを作成できます。

まず、GLUTヘッダーファイルを含める必要があります。

  1. #if defined(linux)|| 定義済み(_WIN32)
  2. #include <GL / glut.h> / * LinuxおよびWindowsの場合* /
  3. #else
  4. #include <GLUT / GLUT.h> / * Mac OSの場合* /
  5. #endif


これで、mainに何を書くかをすでに知っています。 2つのハンドラーを登録します:ウィンドウのコンテンツの描画とサイズ変更の処理。 これらの2つのハンドラーは、基本的にOpenGLとGLUTを使用するプログラムで使用されます。

  1. int main int argc char * argv [ ]
  2. {
  3. glutInit argc argv ;
  4. glutInitDisplayMode GLUT_DOUBLE | GLUT_RGBA ; / *ダブルバッファリングと4成分カラーをオンにします* /
  5. glutInitWindowSize 800、600 ;
  6. glutCreateWindow "OpenGLレッスン1" ;
  7. glutReshapeFunc 形状変更 ;
  8. glutDisplayFunc 表示 ;
  9. glutMainLoop ;
  10. 0を 返し ます
  11. }


次に、ウィンドウのサイズを変更するためのハンドラー関数を作成する必要があります。 glViewportコマンド(x、y、幅、高さ)を使用して、画像の出力領域をウィンドウ全体のサイズに設定します。 次に、射影行列glMatrixMode(GL_PROJECTION)を読み込み、それを単位glLoadIdentity()に置き換えて、正射影を設定します。 最後に、モデルビューマトリックスglMatrixMode(GL_MODELVIEW)をロードし、単一のマトリックスに置き換えます。

その結果、以下が得られます。

  1. void reshape int w int h
  2. {
  3. glViewport 0、0 w h ;
  4. glMatrixMode GL_PROJECTION ;
  5. glLoadIdentity ;
  6. gluOrtho2D 0 w 0 h ;
  7. glMatrixMode GL_MODELVIEW ;
  8. glLoadIdentity ;
  9. }


ウィンドウの内容を描画する関数を記述するだけです。 例として上で引用した正方形を描画します。 かなりのコードを追加する必要があります。 まず、描画する前に、 glClear(モード)を使用してさまざまなバッファーをクリアする必要があります 。 glutInitDisplayModeと同様に使用されます。 可能な値:



この場合、カラーバッファのみをクリアする必要があります。なぜなら、 他のものは使用しません。 第二に、描画後、ダブルバッファリングが有効になっているため、 glutSwapBuffers()を使用してスクリーンバッファを変更するようにOpenGLに依頼する必要があります。 すべてはユーザーから隠されたバッファーに描画され、その後バッファーが変更されます。 これは、滑らかなアニメーションを取得し、画面のちらつきの影響を避けるために行われます。

取得するもの:

  1. 無効表示
  2. {
  3. glClear GL_COLOR_BUFFER_BIT ;
  4. glBegin GL_QUADS ;
  5. glColor3f 1.0、1.0、1.0 ;
  6. glVertex2i 250、450 ;
  7. glColor3f 0.0、0.0、1.0 ;
  8. glVertex2i 250、150 ;
  9. glColor3f 0.0、1.0、0.0 ;
  10. glVertex2i 550、150 ;
  11. glColor3f 1.0、0.0、0.0 ;
  12. glVertex2i 550、450 ;
  13. glEnd ;
  14. glutSwapBuffers ;
  15. }




まとめ



それだけです! コンパイルできます。 次のようなものが得られるはずです。

スクリーン

コード全体 (記事をマスターしていない人向け)。

原則として、少なくともこれまでにグラフィックに遭遇したことがある場合は、これで複雑なことは何もありません。



OpenGLは、グラフィックを使用してクロスプラットフォームアプリケーションを作成するための便利なツールです。 OpenGLは、最適なプログラミング言語で簡単に使用できます。 C、C ++、C#、Java、Python、Perl、VBなど、多くの一般的な言語のOpenGLへのバインディングがあります。 OpenGL公式Webサイトでそれらに関する情報を表示できます。



All Articles