プログラミング初心者向け!MinGW と freeglut による 3DCG の学習用 OpenGL 環境を構築する

Windows に MinGW の C/C++ 環境と、freeglut による OpenGL 環境を導入し、3DCG の学習用環境を構築します。

一般的に、本格的な GUI を備えたソフトウェアの開発には、Unity や Unreal Engine などのゲームエンジンを用います。

しかし、研究等で実験的なプログラムをサクッと用意する場合など、シンプルな OpenGL 環境が便利なこともあります。

また、3DCG の基礎となるプリミティブやシェーディング、座標変換などのゲームエンジンの構成要素をローレベルなコードを用いて深く学ぶことができます。

さらに、C/C++ の習得にも繋がるため、一石二鳥の学習環境となります。

OpenGL と freeglut

OpenGL(Open Graphics Library)は、Silicon Graphics 社(SIG)がリリースした OS に依存しない 3DCG のライブラリであり、様々なシーンで利用されています。

基本的に C/C++ を用いて利用します。

また、OpenGL をベースに、さらなる汎用化と機能拡充を図ったツールが GLUT(The OpenGL Utilitiy Toolkit)です。

元 SGI で、現在 NVIDIA(投稿時点)に所属する Mark Kilgard 氏が開発し、同じく NVIDIA(投稿時点)の Nate Robins 氏が Windows に移植しました。

さらに、GLUT をベースに改良されたツールが freeglut(The Free OpenGL Utility Toolkit)です。

Pawel W. Olszta 氏を筆頭とする複数のメンバにより開発され、メンテナンスが行われています。

1998 年以降のサポートが終了したと思われるオリジナルの GLUT に代わり、現在では freeglut が主に用いられています。

MinGW のセットアップ

MinGW(Minimalist GNU for Windows)という Windows 向けの GNU ツールを利用し、C/C++ の実行環境を構築します。

厳密には、MinGW からフォークされた MinGW-w64 を用います。

MinGW-w64 の詳細とインストール方法は、下記を参照ください。

当環境における MinGW-w64 のインストール先は、C:\Program Files\mingw-w64です。

また、インストールの際に指定するパラメータは下記の通りです。

当環境における MinGW-w64 のパラメータ

freeglut のセットアップ

MinGW 用にコンパイルされたパッケージを利用します。

投稿時点のバージョンは、3.0.0 です。

パッケージのダウンロード
  1. 「公式サイト」へアクセス
  2. Martin Payne’s Windows binaries (MSVC and MinGW)をクリック
  3. Download freeglut 3.0.0 for MinGWをクリック(自動ダウンロード開始)
「Martin Payne’s Windows binaries (MSVC and MinGW)」をクリック
「Download freeglut 3.0.0 for MinGW」をクリック(自動ダウンロード開始)
ファイルのコピー

ダウンロードした「freeglut-MinGW-3.0.0-1.mp.zip」を解凍すると、下表のように「freeglut」ディレクトリ下へ各種ファイルが格納されています。

ディレクトリ ファイル 概要
include/GL ・freeglut.h
・freeglut_ext.h
・freeglut_std.h
・glut.h
プログラムでインクルードするヘッダファイル
lib/x64 ・libfreeglut.a
・libfreeglut_static.a
コンパイル時、実行可能ファイルに連結される静的ライブラリ
bin/x64 ・freeglut.dll 実行可能ファイルの起動時に連結される動的リンクライブラリ

上記ファイルを MinGW-w64 の適当なディレクトリに移動させ、コンパイラが freeglut の各種ファイルを参照できるようにします。

当環境においては、下表のディレクトリへ各種ファイルを配置させます。

ファイル 移動先
・freeglut.h
・freeglut_ext.h
・freeglut_std.h
・glut.h
C:\Program Files\mingw-w64\mingw64\x86_64-w64-mingw32\include
・libfreeglut.a
・libfreeglut_static.a
C:\Program Files\mingw-w64\mingw64\x86_64-w64-mingw32\lib
・freeglut.dll C:\Program Files\mingw-w64\mingw64\bin

ヘッダファイルについては、「GL」ディレクトリごと移動させても構いません。

移動先には既に同名のディレクトリが存在しますが、過不足なく結合されます。

動的リンクライブラリについては、ファイル自体が不要な場合もありますが、念のため移動させます。

freeglut のセットアップは以上です。

実行方法

簡単な 3DCG プログラムを作成し、コンパイルして実行します。

事前準備

コーディングに便利なエディタを用意します。

高機能なプラグインが豊富に用意されており、カスタマイズ性が高く、使い勝手が良い有名なテキストエディタを 3 つ挙げます。

テキストエディタ 提供元
Visual Studio Code Microsoft
Atom GitHub
Brackets Adobe

基本的に無料で、インストールしたら直ぐに利用可能です。

Windows の「メモ帳」でもプログラムの記述は可能ですが、自動補完やハイライト表示、キーバインドなど、開発スピードを向上させる各種機能を持つテキストエディタは必須アイテムです。

プログラムの作成

金色に輝くティーポッドを描画し、マウスを動かすことで回転させることができるプログラムを作成します。

仕様概要は下表の通りです。

操作 動作
左クリック + マウス操作 x 軸および y 軸まわりにオブジェクトが回転
「Ctrl」 + 左クリック + マウス操作 x 軸および z 軸まわりにオブジェクトが回転
「R」または「r」の押下 オブジェクトを初期回転位置にリセット
「Esc」または「R」または「q」 の押下 プログラムの終了

ファイルの拡張子は*.cppです。

下記プログラムをテキストエディタ等で記述し、teapot.cpp として任意のディレクトリに保存します。

/* glut のインクルード */
#include <GL/glut.h>

/* 数学関数のインクルード */
#include <cmath>

/* ウィンドウサイズ */
GLint width = 800;
GLint height = 600;

/* 透視投影の設定 */
float myFovy = 60.0, myNear = 1.0, myFar = 40.0;

/* マウスポインタのクリックと座標 */
int mButton, mX = 0, mY = 0;

/* オブジェクトの回転角度 */
float rotateX, rotateY, rotateZ;

/* ESC キーの割り当て */
#define ESC_KEY 27

/* Gold Teapot の描画関数 */
void drawTeapot( void ) {

    GLfloat ambient[] = { 0.25, 0.20, 0.07, 1.0 };
    GLfloat diffuse[] = { 0.75, 0.61, 0.23, 1.0 };
    GLfloat specular[] = { 0.63, 0.56, 0.37, 1.0 };

    glMaterialfv( GL_FRONT, GL_AMBIENT, ambient );
    glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse );
    glMaterialfv( GL_FRONT, GL_SPECULAR, specular );
    glMaterialf( GL_FRONT, GL_SHININESS, 50 );

    glutSolidTeapot( 1.0 );
}

/* ウィンドウへの描画 */
void myDisplay( void ) {
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();
    glTranslatef( 0.0, 0.0, -3.5 );
    glRotatef( rotateX, 1.0, 0.0, 0.0 );
    glRotatef( -rotateY, 0.0, 1.0, 0.0 );
    glRotatef( -rotateZ, 0.0, 0.0, 1.0 );
    drawTeapot();
    glPopMatrix();
    glutSwapBuffers( );
}

/* ウィンドウの設定 */
void myReshape( int width, int height ) {
    float aspect = (float)width / (float)height;
    glViewport( 0.0, 0.0, width, height );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( myFovy, aspect, myNear, myFar );
    glMatrixMode( GL_MODELVIEW );
}

/* マウスおよびキーボードの状態取得 */
void myMouse( int button, int state, int x, int y ) {
    if( state == GLUT_DOWN ) {
        mButton = button;
        mX = x;
        mY = y;
    }
}

/* マウスの変化量およびキーボードの状態に応じたオブジェクトの回転角の算出  */
void myMotion( int x, int y ) {

    int dx = x - mX;
    int dy = y - mY;

    switch( mButton ) {
        case GLUT_LEFT_BUTTON:
            rotateX = fmod( rotateX + (float)dy, 360.0f );
            if( glutGetModifiers() == GLUT_ACTIVE_CTRL ) {
                rotateZ = fmod ( rotateZ + (float)dx, 360.0f );
            } else {
                rotateY = fmod ( rotateY + (float)dx, 360.0f );
            }
            break;
    }
    mX = x;
    mY = y;
    glutPostRedisplay();
}

/* オブジェクトの回転位置のリセット */
void resetview( void ) {
    rotateX = rotateY = rotateZ = 0.0;
}

/* 押下されたキーに応じた処理 */
void myKeyboard ( unsigned char key, int x, int y ) {
    if( key == ESC_KEY || key == 'q' || key == 'Q' ) {
        exit ( 0 );
    } else if( key == 'r' || key == 'R' ) {
        resetview();
    }
    glutPostRedisplay();
}

/* メイン関数で呼び出す初期化関数 */
void myInit( void ) {
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );
    glutInitWindowPosition( 0.0, 0.0 );
    glutInitWindowSize( width, height );
    glutCreateWindow( "TEAPOT" );
    glutDisplayFunc( myDisplay );
    glutReshapeFunc( myReshape );
    glutKeyboardFunc( myKeyboard );
    glutMouseFunc( myMouse );
    glutMotionFunc( myMotion );
    glEnable( GL_DEPTH_TEST );
    glEnable( GL_LIGHT0 );
    glEnable( GL_LIGHTING );
}

/* メイン関数 */
int main( int argc, char **argv ) {
    glutInit( &argc, argv );
    myInit();
    glutMainLoop();
    return 0;
}

ここでは、C:\Users\CHAM\Documents\demo に保存します。

プログラムの保存先に移動

コマンドプロンプトを起動して、teapot.cpp が存在するディレクトリに移動します。

teapot.cpp のディレクトリへ移動
コンパイル

下記は g++ を用いた場合の基本形式です。

g++ <sourcefile> -o <output> -lfreeglut -lopengl32 -lglu32

-oオプションで、コンパイルにより出力される実行可能ファイル名を指定します。

また、オプションにて、参照するライブラリを指定する必要があります。

freeglut を用いたプログラムをコンパイルする場合、-lfreeglut-lopengl32-lglu32の 3 つを指定すれば十分です。

teapot.cpp のコンパイル

コンパイルが完了すると、同じディレクトリに teapot.exe という実行可能ファイルが生成されます。

実行

実行可能ファイル名をコマンドとして入力することで実行できます。

<output>
teapot.exe の実行

もしくは、ディレクトリにあるteapot.exeを直接ダブルクリックすることでも実行可能です。

下記は実行したプログラムをマウスで操作する様子です。

ウィンドウに描画された teapot を操作

以上が実行フローになります。

おすすめの技術書

OpenGL 等のライブラリを用いたスクラッチ開発は、今でこそニッチな領域となりましたが、大学でのチーム開発や研究で扱うシーンもあるかと思います。

その際に役立つ技術書を 3 冊挙げます。

いずれも、学生時代における OpenGL と C/C++ を用いたゲーム開発にて重宝した書籍です。

チュートリアル形式で始める OpenGL

著者 : 西山信行

GPU 並列図形処理入門

著者 : 乾 正知 / 出版社 : 技術評論社

ゲーム制作者になるための 3D グラフィックス技術

著者 : 出井 秀行 / 出版社 : 技術評論社