OpenGL プログラミング解説

OpenGLを使用したプログラミングについて解説します。

導入

OpenGLのバージョン

OpenGL

関数

glBegin、glEnd

プリミティブの頂点を設定するときの、開始と終了を宣言します。

void glBegin( GLenum mode );
glBegin function (Windows) | MSDN
void glEnd( void );

glOrtho

The glOrtho function multiplies the current matrix by an orthographic matrix.

void glOrtho(
    GLdouble left,
    GLdouble right,
    GLdouble bottom,
    GLdouble top,
    GLdouble near,
    GLdouble far
    );

GLU (OpenGL Utility Library)

関数

gluCylinder

void gluCylinder(
    GLUquadricObj *qobj,
    GLdouble baseRadius,
    GLdouble topRadius,
    GLdouble height,
    GLint slices,
    GLint stacks
    );
gluCylinder function (Windows) | MSDN

gluPerspective

変換行列に透視変換の行列を乗じます。

void gluPerspective(
    GLdouble fovy,   // カメラの画角
    GLdouble aspect, // 画面のアスペクト比
    GLdouble zNear,  // 奥行き方向の範囲
    GLdouble zFar    //
    );

gluLookAt

void gluLookAt(
    GLdouble eyex,    // 視点の位置
    GLdouble eyey,
    GLdouble eyez,
    GLdouble centerx, // 目標の位置
    GLdouble centery,
    GLdouble centerz,
    GLdouble upx,     // ウィンドウに表示される画像の「上」の方向
    GLdouble upy,
    GLdouble upz
    );

gluErrorString

gluErrorString function (Windows) | MSDN

デバッグ時だけエラーが出力されるようにするには、次のようなマクロを用意すると便利です。

#ifdef _DEBUG
    #define CHECK_OPENGL_ERROR(cmd)\
        cmd;\
        {\
            GLenum error;\
            if((error = glGetError()) != GL_NO_ERROR)\
            {\
                TRACE("%s:%d[%s] OpenGL Error. %s\n",\
                 __FILE__, __LINE__, #cmd, gluErrorString(error));\
            }\
        }
#else
    #define CHECK_OPENGL_ERROR(cmd) cmd;
#endif
Performance OpenGL: Platform Independent Techniques
Example 1 macro for checking an OpenGL call for an error

AUX

関数 説明
auxWireSphere 球の描画 (ワイヤー)
auxSolidSphere
auxWireCube 立方体
auxSolidCube  

GLUT (OpenGL Utility Toolkit)

ダウンロード

Nate Robins - OpenGL - GLUT for Win32

関数

glutSolidCube

ソリッド キューブを描画します。

void glutSolidCube(GLdouble size);

glutWireCube

ワイヤーフレーム キューブを描画します。

void glutWireCube(GLdouble size);

参考

WGL

関数

SetPixelFormat

OpenGLのピクセル フォーマットを設定します。

BOOL WINAPI SetPixelFormat(
    HDC hdc,
    int iPixelFormat,
    const PIXELFORMATDESCRIPTOR *ppfd
    );
SetPixelFormat function (Windows) | MSDN

3Dモデルの読み込み

OpenGLでは3Dモデルを定義する標準的なフォーマットが定義されていないため、他で定義されているフォーマットを流用することになります。

DXFフォーマット

DXFとは、CADで使用される標準的なファイル形式です。

Xファイル

Xファイルとは、DirectXでサポートされるファイル形式です。

ライブラリ

OpenTK

OpenGLを、C#などの.NET言語から呼び出せるようにするラッパーです。

GLSharp

メタセコイアのオブジェクトを読み込めます。

サンプルコード

初期化

HGLRC m_hRC; //

void Init( const HDC &hDC ) throw(const DWORD)
{
    // ピクセル フォーマットを初期化する
    InitPixelFormat( hDC );

    // カラーパレットを設定する
    CreateRGBPalette( hDC );

    // レンダリングコンテキストを生成する
    if( ( m_hRC = ::wglCreateContext( hDC ) ) == NULL ) throw GetLastError();

    // レンダリングコンテキストをカレントにする
    if( !::wglMakeCurrent( hDC, m_hRC ) ) throw GetLastError();

    ::glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); // 画面をクリアする色の設定
    ::glClearDepth( 1.0f );                   // Depthバッファの指定

    ::glEnable( GL_DEPTH_TEST );              // デプステストを有効

//  ::glEnable( GL_CULL_FACE );               // 片面表示を有効
    ::glCullFace( GL_BACK );                  // 裏面を非表示

      ::glEnable( GL_LIGHTING );              // 陰影付けを有効
    ::glEnable( GL_LIGHT0 );                  // 光源を有効

    ::glShadeModel( GL_SMOOTH );                     // スムーズシェーディングモデル
//  ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); // ワイヤーフレームモデル

    // レンダリングコンテキストを解放する
    if( !::wglMakeCurrent( hDC, NULL ) ) throw GetLastError();
}

// ピクセルフォーマットの初期化
void InitPixelFormat( const HDC &hDC ) throw(const DWORD)
{
    // ウィンドウのピクセルフォーマットの設定
    PIXELFORMATDESCRIPTOR pfd = {
        sizeof( PIXELFORMATDESCRIPTOR ), // 構造体のサイズ
        1,                               // 構造体のバージョン番号
          PFD_DRAW_TO_WINDOW             // 特性フラグ(アプリケーションがメモリDCのビットマップに描画可能)
        | PFD_SUPPORT_OPENGL             //             (バッファがOpenGLをサポートする)
        | PFD_DOUBLEBUFFER,              //             (ダブルバッファを使う)
        PFD_TYPE_RGBA,                   // ピクセルのカラーデータ (RGBAモード)
        24,                              // カラービット数
        0, 0, 0, 0, 0, 0,
        0,
        0,
        0,
        0,  0, 0, 0,
        32,                              // デプスバッファのピクセル当りのビット数
        0,
        0,
        PFD_MAIN_PLANE,                  // レイヤタイプ (Win32ではPFD_MAIN_PLANE)
        0,
        0, 0, 0
        };

    // デバイス コンテキストに最も適合するピクセルフォーマットの選択
    int pixelFormat = ::ChoosePixelFormat( hDC, &pfd );
    if( !pixelFormat) throw GetLastError();

    // これをデバイスコンテキストのピクセルフォーマットとする
    if( !::SetPixelFormat( hDC, pixelFormat, &pfd ) ) throw GetLastError();
}

// カラーパレットの設定
void CreateRGBPalette( const HDC &hDC ) throw(const DWORD, OpenGLError)
{
    // ピクセルフォーマットのインデックスの取得
    int n = ::GetPixelFormat( hDC );
    if(!n) throw GetLastError();

    // ピクセルファーマットのリストの取得
    PIXELFORMATDESCRIPTOR pfd;
    if( !::DescribePixelFormat( hDC, n, sizeof( PIXELFORMATDESCRIPTOR ), &pfd ) ) throw GetLastError();
    if( pfd.dwFlags & PFD_NEED_PALETTE) throw InvalidDisplayMode;
}
複数の技術系サイトから、まとめて検索