1

freeglut for OpenGL (GLSL) + Visual Studio 2010 on 64bit

freeglutを使ってVisual Studio 2010でのOpenGL(GLSL)環境のセットアップを試みる.同じ内容で書いたことがあるけど,freeglutが2.6.0から2.8.0にバージョンアップされてセットアップが容易になっていたのでメモ.

以下で{VC Root}は
32bit C:\Program Files\Microsoft Visual Studio 10\VC
64bit C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A
を表すものとする.

1. freeglutのインストール
1.1. freeglutのコンパイル
オフィシャルサイトから,ソースやら何やらをdownload(freeglut-2.8.0.tar.gz)

基本的には,README.win32に書いてある通りに行えば問題ない.2.6.0からの変更点として,VS2010用のslnファイルがデフォルトで用意されているため,VS2008用のslnファイルを変換する必要がなくなった点が挙げられる.
READMEに書いてあるように”,バッチビルドすれば終わり”.

1.1.1. コンパイル
以下のディレクトリにあるfreeglut.slnを開きビルドする.
Build->;Batch Buildを選ぶと簡単かもしれない.
/VisualStudio/2010/freeglut.sln
ビルドが終わると各libファイルが生成される.

1.1.2. hファイルのコピー
/include/GL/ディレクトリにある”freeglut.h”, “freeglut_ext.h”, “freeglut_std.h”, “glut.h”を以下のディレクトリにコピー.
{VC Root}/include/GL/
※ 同じディレクトリに”gl.h”, “glu.h”があるはず.

1.1.3. libファイルのコピー
/lib/x64/ディレクトリにできた“freeglut.lib”か”freeglut_static.lib”を以下のディレクトリにコピー.
{VC Root}/lib/
※ 同じディレクトリに”opengl32.lib”, “glu32.lib”, and “glaux.lib”があるはず.

1.1.4. dllファイルのコピー
DLLを使用する場合は,/lib/x64/ディレクトリにできた”freeglut.dll”をコピーする.
32bit: C:/Windows/System32
64bit: C:/Windows/SysWOW64
※ 同じディレクトリに”opengl32.dll” と “glu32.dll”も保存されているはず.

2. glext.hのインストール
以下からglext.hをダウンロード.

http://www.opengl.org/registry/api/glext.h

他のヘッダファイルと同様,以下のディレクトリに保存.
{VC Root}/Include/GL

1

OpenGL (GLSL) + Visual Studio 2010 on 64bit

Visual Studio 2010 + OpenGL(GLSL)のセットアップ.

以下で{VC Root}は
32bit C:\Program Files\Microsoft Visual Studio 10\VC
64bit C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A
を表すものとする.

1. GLUTのインストール
GLUT(OpenGL Utility Toolkit)はOpenGLでプログラムを書くためのツールキット.
オリジナルのglutの開発は2001年ぐらいから進んでいなさそうなので,代わりにfreeglutをインストールする.
1.1. freeglutのコンパイル
以下のサイトから,ソースやら何やらをdownload(freeglut-2.6.0.tar.gz)
http://freeglut.sourceforge.net/

基本的には,README.win32に書いてある通りに行えば問題ないはず.
ワークスペースfreeglut.dswには二つのプロジェクトfreeglut.dspとfreeglut_static.dspが含まれている(それぞれDLLとstatic libraryを作るためのプロジェクトファイル).
“READMEにはバッチビルドすれば終わり”みたいに書いてあるが,VS2010だと両プロジェクトの変換に失敗するので,以下のディレクトリ内にあるslnファイルを使ってビルドする.
※ ディレクトリ名が示すように,VS2008用のslnファイルっぽいので,2010用にコンバートする必要がある(VS2010でslnファイルをオープンすれば勝手にコンバートしてくれるはず).
/VisualStudio2008/
/VisualStudio2008Static/

1.1.1. コンパイル
以下のディレクトリにあるfreeglut.slnを開き,freeglutをビルドする.
Build->Batch Buildを選ぶと簡単かもしれない.
/VisualStudio2008/
/VisualStudio2008Static/
ビルドが終わると各libファイルが生成される.
dllファイル
/VisualStudio2008/Debug/freeglut.dll
/VisualStudio2008/Release/freeglut.dll
libファイル
/VisualStudio2008/Debug/freeglut.lib
/VisualStudio2008/Release/freeglut.lib
/VisualStudio2008Static/Debug/freeglut_static.lib
/VisualStudio2008Static/Release/freeglut_static.lib
※ DebugモードとReleaseモードで作成されるlibファイルの名前が同じだけど,freeglut自体をデバッグする事はなさそうなので,Releaseモードで作成したlibファイルのみを使用すれば問題なさそう.

1.1.2. hファイルのコピー
/include/GL/ディレクトリにある”freeglut.h”, “freeglut_ext.h”, “freeglut_std.h”, “glut.h”を以下のディレクトリにコピー.
{VC Root}/include/GL/
※ 同じディレクトリに”gl.h”, “glu.h”があるはず.

1.1.3. libファイルのコピー
“freeglut.lib”か”freeglut_static.lib”を以下のディレクトリにコピー.
{VC Root}/lib/GL/
※ 同じディレクトリに”opengl32.lib”, “glu32.lib”, and “glaux.lib”があるはず.

1.1.4. dllファイルのコピー
DLLを使用する場合は,”freeglut.dll”をDLLが保存されているディレクトリにコピーする.
32bit: C:/Windows/System32
64bit: C:/Windows/SysWOW64
※ 同じディレクトリに”opengl32.dll” と “glu32.dll”も保存されているはず.

1.2. とある人がコンパイルしていたファイルを使う
OSが32bitなら,以下のサイトからファイルをdownloadすればおしまいっぽい.
http://www.transmissionzero.co.uk/software/freeglut-devel/

2. glext.hのインストール
以下からglext.hをダウンロード.
http://www.opengl.org/registry/api/glext.h
他のヘッダファイルと同様,以下のディレクトリに保存.
{VC Root}/Include/GL

0

OpenGL: 光源の設定

光源を利用する.
2つの処理が必要.
光源そのものに環境光,拡散光,鏡面光があって,それぞれ設定するというのは,何か違和感を感じるなぁ.

光源の設定

  1. 光源を有効にする: glEnable(GL_LIGHTING)をコールする.
    その後,glEnable(GL_LIGHT$i$)として,i番目の光源の設定をする.
    GL_LIGHT$i$ = GL_LIGHT0 + $i$.
  2. 光源の設定: glLight()関数を使う(以下のどれか).
    glLightf (GLenum light, GLenum pname, GLfloat param)
    glLighti (GLenum light, GLenum pname, GLint param)
    glLightfv(GLenum light, GLenum pname, const GLfloat *params)
    glLightiv(GLenum light, GLenum pname, const GLint *params)
    1. light: 使用する光源のインデックス(GL_LIGHT0 GL_MAX_LIGHTS-1まで指定可能)
    2. pname: 設定するパラメータの名前
      GL_AMBIENT: 環境光
      GL_DIFFUSE: 拡散光
      GL_SPECULAR: 鏡面光
      GL_POSITION: 照明の位置
      GL_SPOT_DIRECTION: 照明方向
      GL_SPOT_EXPONENT: 輝度分布
      GL_SPOT_CUTOFF: 最大放射角度
      GL_CONSTANT_ATTENUATION: 一定減衰率
      GL_LINER_ATTENUATION: 線形減衰率
      GL_QUADRATIC_ATTENUATION: 2次減衰率
    3. param(s): 設定値

オブジェクトの法線ベクトル
法線ベクトルを設定しないと,描画するポリゴンが真っ黒になってしまうらしい.
glNormal関数を使い設定する.
また,glEnable(GL_NORMALIZE)とする事で,法線ベクトルの正規化をする必要が無くなる.
例)
glEnable(GL_NORMALIZE);
glBegin(GL_POLYGON);
glNormal3f(0,1,0);
glVertex3f(0, -1, 0);
glVertex3f(1, 0, 0);
glVertex3f(0, 1, 0);
glEnd();
glDisable(GL_NORMALIZE);

オブジェクトの材質の設定
“材質の設定=物体表面での光の反射の設定”を意味する.
glMaterial関数で設定する.
glMaterialf (GLenum face, GLenum pname, GLfloat param)
glMateriali (GLenum face, GLenum pname, GLint param)
glMaterialfv(GLenum face, GLenum pname, const GLfloat *parame)
glMaterialiv(GLenum face, GLenum pname, const GLint *params)
face: 設定する面の指定
pname: 材質するパラメータの名前
GL_AMBIENT: 環境光
GL_DIFFUSE: 拡散光
GL_SPECULAR: 鏡面光
GL_EMISSION: 放射輝度
GL_SHININESS: 鏡面光の指数
GL_AMBIENT_AND_DIFFUSE: 環境光と拡散光の同時設定
GL_COLOR_INDEXES: 環境光,拡散光,鏡面光の色
param(s): 設定値

0

OpenGL: ダブルバッファリング

画面全体を一度に描画すると,表示がちらつく事があるらしい(レンダリングの速度が追いつかないから?).
ダブル・バッファリングによって画面を2つにわけて,片方を表示している間にもう片方を描画して入れ換える・・・という作業を続けると,ちらつきがなくなるそう.
glutInitDisplayModeでGLUT_DOUBLEを指定し,図形の描画後に行っているglFlush関数をglutSwapBuffers関数に置き換える.

0

OpenGL: アニメーション

“GLでアニメーションをさせる=display関数を複数回呼ぶ”という事らしい.
glutMainLoop関数は無限ループだけど,glutDisplayFunc関数はウィンドウを再描画するイベントが発生した時しかコールされないそうだ.
そこで,アニメーションのようにdisplay関数を連続的にコールしたい時はウィンドウの再描画を実行する関数glutPostRedisplay関数を呼ぶ必要があるそうだ.
このglutPostRedisplay関数を,CPUが暇な時に実行するようにglutIdleFunc関数で設定すればいい.

コードは以下のようになる.
void idle(){
glutPostRedisplay();
}

main(…){

glutIdleFunc(idle);

}

0

OpenGL: Z buffer

複数の物体を描画する時,(カメラから見た時の)物体の前後関係を考慮する必要がある.

  1. 初期化
    glutInitDisplayMode()にGLUT_DEPTHを追加する
  2. 描画時
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_DEPTH_TEST);
0

OpenGL: 立体の描画

2つの処理に分かれている.

  1. オブジェクトの設定
    3次元空間内での位置や,オブジェクトの挙動(色,光の反射,etc.)などを設定する.
  2. 視点の設定
    3次元空間を2次元の画像としてレンダリングするために,カメラに関する設定をする.
    • ビューポート: window内で画像を描画する領域を設定
      glViewport(0, 0, w, h); // window全体に描画する
      glViewport(0, 0, w/2, h/2); // windowの左下1/4だけに描画する
    • 投影変換行列: 3次元空間の視野に入れる範囲を設定
      gluPerspective(); // 透視投影
      glOrtho(); // 正射影
    • 視点位置: カメラのパラメータを設定する.
      gluLookAt(e,c,u);
      e = (GLdouble ex, GLdouble ey, GLdouble ez): 視点の位置
      c = (GLdouble cx, GLdouble cy, GLdouble cz): 視線方向の位置
      u = (GLdouble ux, GLdouble uy, GLdouble uz): 画像のどの方向が上かを指定
      がある.

    この処理はウィンドウサイズが変更される度に実行される.