OpenGL de プログラミング - 準備編05
現在地 >> メニュー >> 準備編05
INDEX:準備編04 << 準備編05
関連:freeglut

freeglut


GLUT(The OpenGL Utility Toolkit)はバージョン3.7で更新が止まっている。
そのGLUTの互換ライブラリとして「freeglut」がある。

これは、glutの機能に加え、それを拡張しているライブラリである。
(※新たなコールバック関数の追加、プリミティブの追加などがされている)


【freeglut ホームページ】

インストール


以下はインストール例
  1. ここからダウンロードする。
  2. 「freeglut.dsp」を開き、[ビルド] → 全て選択を選んでから[バッチビルド]。
  3. 「freeglut_static.dsp」を開き、[ビルド] → 全て選択を選んでから[バッチビルド]。

すると「ReleaseStatic」「Release」「DebugStatic」「Debug」の4つのフォルダができ、
それぞれのなかに「デバッグバージョン」、「リリースバージョン」、「スタティックバージョン」
といったバージョン毎のファイルが作成される。

なお、visual studioのバージョンによってはこれではうまくいかない場合もある。
その場合、「VisualStudio2008フォルダ」があるのでその中のプロジェクトでビルドする。

※以下はリリースバージョンのインストールでの話です。

ヘッダファイル

ヘッダファイルは"freeglut.h", "freeglut_ext.h", "freeglut_std.h","glut.h"を
「C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\gl」にコピー
この時、「gl.h」「glu.h」「glaux.h」が同一ファイル内に存在している必要がある。

もし、従来のglut.hを残しておく場合は、新たにフォルダを作成しそこにコピーすればよい。

(例)「freegl」フォルダを作って、
「C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\freegl」にコピー


「libファイル」「dllファイル」

「ReleaseStatic」「Release」フォルダの"freeglut.lib" か "freeglut_static.lib" を
「C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib」
にコピー。("opengl32.lib", "glu32.lib","glaux.lib"と同一ファイル内におく)


「freeglut.dll」は「"C:\Windows\System32"」にコピーしておく。

使い方


glutと同じ。
※freeglutのglut.hをインクルードすればよい。

【例】:シェルピンスキー四面体を描画
#include <GL/freeglut.h>

//----------- プロトタイプ宣言 --------------//
void display();
void reshape(int w, int h);
void timer(int value);


//------------- OpenGLの初期設定 ------------------//
void GLUT_INIT()
{
	glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); //ダブルバッファ、Zバッファ
	glutInitWindowSize(640,480);
	glutCreateWindow("free glut Primitive");
}

void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutTimerFunc(0,timer,17);
}

void MY_INIT()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);

	glEnable(GL_DEPTH_TEST);//ZバッファON
}



//------------- メイン関数 ----------------//
int main(int argc, char **argv)
{
    glutInit(&argc,argv);

    GLUT_INIT();
    GLUT_CALL_FUNC();
    MY_INIT();

    glutMainLoop();

    return 0;
}

//------------ ここからコールバック関数 ------------------//
void display()
{
	static int r = 0;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


	glColor3f(0,0,1);
	glPushMatrix(); //行列退避
	glRotated(double(r), 0.0, 1.0, 0.0); //[2].回転
	static double data[]={0,0,0};
	glutWireSierpinskiSponge(2,data,1);//シェルピンスキーの四面体
	
	glPopMatrix(); //行列を戻す
	glColor3f(1,1,1);

	glutSwapBuffers();

	if(++r > 360){
		r= 0;
	}
}

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);

	glMatrixMode(GL_PROJECTION); //行列モード切替
	glLoadIdentity();  //行列初期化
	gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);

	glMatrixMode(GL_MODELVIEW); //行列モード切替
	glLoadIdentity();
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void timer(int t)
{
	glutPostRedisplay();
	glutTimerFunc(t,timer,17); //タイマー関数
}


【メモ】
freeglut内の「glut.h」はファイル内で「freeglut_std.h」をインクルードしているだけである。
従って、もし、glut ver.3.7から拡張された関数を使う場合は、「freeglut_ext.h」もインクルードする必要がある。

このプログラム例では、「freeglut.h」をインクルードすることで、
「freeglut_std.h」「freeglut_ext.h」の両方がインクルードされている。