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サイトでそれらに関する情報を表示できます。

Source: https://habr.com/ru/post/J111175/


All Articles