/*THK Analytics用解析タグ*/

GLUTを使わないOpeGL超入門_02【立方体の表示】

2023年1月22日

前回はVisual StudioでOpenGLを使う環境を整えました。
今回は立方体を表示するサンプルを作成します。
もちろんGLUTは利用しませんがGLUT以外は下記の書籍を参考にしています。

OpenGLの座標系

基礎知識としてOpenGLの座標系をご説明します。
OpenGLでは水平方向横軸がx,縦軸がz、垂直方向がYとなります。
上から見下ろしたイメージではXとZで平面空間を表していますので注意が必要です。
一般的な数学ではXとYで平面空間を表すので間違えないようにして下さい。

座標系以外に必要な知識は、必要なタイミングで解説します。

OpenGL簡単なサンプル

立方体を描く簡単なサンプルです。
描画メッセージWM_PAINTに描画処理を記述します。
サンプルではopengl_view関数で処理を行っています
※Windowsに関する部分の説明は省略します。

OpenGLのコンテキストとデバイスコンテキストを結び付ける

openglで描画する為にはWindowsのデバイスコンテキストを結び付ける必要があります。
流れは以下のようになります。
1)ピクセルフォーマットの選択
2)デバイスコンテキストにテキストフォーマットを設定
3)OpenGLコンテキストを作成
4)作成したOpenGLコンテキストをデバイスコンテキストにする

これらの処理を自前の関数opengl_dcで行っています。
この処理は特に変更の必要は無いと思います。

ピクセルフォーマットの選択

ピクセルフォーマットは構造体PIXELFORMATDESCRIPTORにあらかじめ情報を設定しておきます。
サンプルでは変数名pfdです。
内容に関してはサンプルから特に変更する必要は無いでしょう。
ChoosePixelFormat関数でピクセルフォーマットの番号を取得できます。

デバイスコンテキストにテキストフォーマットを設定

SetPixelFormat関数でピクセルフォーマットとデバイスコンテキストを結び付けています。

OpenGLコンテキストを作成

OpenGL用のコンテキストHGLRCを作成します。
作成したHGRCはプログラム終了まで必要なのでグローバル変数に保存しています。

作成したOpenGLコンテキストをデバイスコンテキストにする

Windowsでは描画はデバイスコンテキストに行われます。
wglMakeCurrentを使ってOpenGL用のコンテキストとデバイスコンテキストを結び付けています。

OpenGLの描画

glClear

glClearAPIでバッファのクリアを行っています。

view_cube

自前の立方体描画関数です

GLdouble vertex[][3]=部分で立方体の頂点座標を登録しています。
OpenGLでは32bit浮動小数点であるGLfloatと64bit浮動小数点であるGLdouble が利用出来ます。
64bitOSを利用している筆者は基本的に64bit浮動小数点を利用しています。
次のint edge[][2]は直線を引く為のテーブル情報です。

glColor3d(1.0, 0.0, 0.0);で描画する線の色を指定しています。
引数はRGBの順で1が最大値になりますのでRを最大値にしていますから線は赤になります。
描画の単位はglBeginからglEndです。
glBeginで描画する種類を指定します。引数GL_LINESは直線描画を指定しています。
glVertex3dvは3D座標を設定する関数です。
例えば座標(0,0,0)から座標(1,1,1)に直線を引く為には以下のように記述します
glBegin(GL_LINES);
glVertex3dv(0,0,0);
glVertex3dv(1,1,1);
glEnd();

サンプルプログラムではこれを直線描画を12回繰り返して立方体の描画を行っています。

※view_cube関数は工学社GLUTによるOpenGL入門を参考にしています。

glFlush

バッファへの描画指示です。
view_cuve関数で行ったような描画指示(glBegin~glEnd)の内容を実際に描画バッファへ書き込みます。
glFlushを行わないと描画されません。

SwapBuffers

ダブルバッファの処理です。
PIXELFORMATDESCRIPTORを設定した際にダブルバッファを有効にしておく必要があります。
本サンプルでも有効になっています。

解放

以下の関数を呼び出して、利用したコンテキストを解放します。
wglMakeCurrent
wglDeleteContext

 

 

実行結果

このような画面が生成されれば成功です。
立方体を描いたのに長方形が表示されていますよね。
これは真横から立方体を眺めているからです。
次回は動かして立方体であることを確認します

 

OpenGL関連記事一覧

GLUTを使わないOpeGL超入門_01【Visual Studio設定】
GLUTを使わないOpeGL超入門_02【立方体の表示】
GLUTを使わないOpeGL超入門_03【立方体の塗りつぶし】
GLUTを使わないOpeGL超入門_04【ビューポート】
GLUTを使わないOpeGL超入門_05【移動・回転】
GLUTを使わないOpeGL超入門_06【視点移動(球面上をなぞる)】

 

 Visual studio関連書籍