|
OpenGL
- はじめに
- エクステンション
- OpenGL cygwin コンパイル方法
- tips
- Game Programming Gems2 読書メモ
- 参考文献・参考ウェブページ
- 履歴
OpenGL に関してのメモです。
過不足のご指摘大歓迎です。
マルチプラットフォームで使用できるGraphics ライブラリ。
利点として、
低レベルなAPI ゆえに広い範囲で使える。
また、行列計算を扱う関数も充実している。
欠点としては、
DirectX に比べてRenderToTexture やモデルデータの扱いが不便。
自前でライブラリ・関数を用意する必要があるため。
最近はnVIDIA ATI のCg,HLSL,RenderMonkey?に対抗して
GLSL がリリースされた。
GLSL について、ユーザは少なくとも国内はかなり少数。
OpenGL Extension を使用するためには
ライブラリが必要。
GLEW(The OpenGL Extension Wrangler Library)
を導入すると、OpenGL Extension を簡単に利用することができる。
Windows にて動作確認。
インストール - Windows の場合
1. glew-1.3.3-win32.zip を展開。
2. include 以下を C:Program FilesMicrosoft Visual Studio .NET 2003Vc7PlatformSDKInclude にコピー。
3. lib 以下を C:Program FilesMicrosoft Visual Studio .NET 2003Vc7PlatformSDKLib にコピー。
4. bin/glew32.dll を C:WindowsSystem32 にコピー。
5. その他のファイル(bin, doc 以下)は適当なディレクトリに保存。
インストール - Linux の場合
1. $ tar zxvf glew-1.3.3-src.tgz
2. $ cd glew
3. $ make
4. include 以下を /usr/include にコピー。
5. lib 以下を /usr/lib にコピー。
6. その他のファイル(bin, doc 以下)は適当なディレクトリに保存。
参考ウェブページ
http://chihara.naist.jp/people/STAFF/imura/computer/OpenGL/glew/disp_content
Cygwin でOpenGL プログラムをコンパイルするためには
まず、GLUT のライブラリをダウンロードする。
-
nate robins
GLUT バイナリ。
dll、lib は
c:/windows/system
glut.h は
c:/windows/system32/GL
に入れておくとよい。
-
OpenGL SDK
OpenGL Extention
c:/windows/system32/GL
などに入れておくこと。
もちろんコンパイル時にはインクルードパスに上記を含めること。
以下のヘッダファイルあり。
- # glext.h (GL extensions)
- # glxext.h (GLX extensions)
- # wglext.h (WGL extensions)
通常、OpenGL のMakefile 中にLinux のためには以下のようなライブラリの
指定を行う。
LDFLAGS = -lglut -lGLU -lGL -lXmu -lXt -lXext -lX11 -lXi
ここでcygwin のためのプログラムを動作させるためには以下の
用にコンパイル時に指定するライブラリの指定を変更する。
LDFLAGS = -lglut32 -lglu32 -lopengl32
また、-DWIN32 も指定するとよいようだ。(未確認)
これでcygwin でコンパイル可能になる。
簡単なMakefile 例はこちら
1 CC = gcc
2 # cygwin
3 LOADLIBES = -lglut32 -lglu32 -lopengl32
4 # unix
5 #LOADLIBES = -lGL -lglut -lGLU -L/usr/X11R6/lib -lX11 -lXi -lXmu
6 shadows: main.c
7 gcc main.c -o shadows $(LOADLIBES)
参考ウェブページ
http://lilac.s5.xrea.com/cygwin/cygwin.html
- GLUT でカーソルキーやファンクションキー入力を取る。
glutSpecialFunc()
- 初期化背景色の設定
glClearColor(red, green, blue, alpha);
- 立体視
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE | GLUT_STEREO );
HW が対応している必要がある。
駄目なときはコンパイルが通っても実行不可。
ダブルバッファが左右の目の分必要。
解像度x色深度x4枚のフレームバッファになり、
クアッドバッファと呼ばれる。
- Cubemap
まずは
OpenGL SDK
からヘッダファイルを持ってきて
#include "glext.h"
してから
// #### CUT ####
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
// #### CUT ####
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_CUBE_MAP);
glutSolidTeapot(1.0);
glDisable(GL_TEXTURE_CUBE_MAP);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
// #### CUT ####
とする。
参考
- 現在の透視変換行列とモデルビュー変換行列を得る
GLdouble model[16], proj[16];
glGetDoublev(GL_MODELVIEW_MATRIX, model);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
参考
- 日本語表示
FTGL 2.0.8
DEMOをうまくコンパイルできず。
yuno-world (ビットマップフォント描画方法)
- バンプマッピング
yuno-world
- コールバック関数のパターン化
mouse(), keyboard(), motion() コールバック関数に
クラスのメンバ関数を渡そうとしたが失敗。
使いまわせる関数群がOpenGL はたくさんあるが、
うまいパターン化方法はないものか。
とりあえず、ヘッダを分けたが、きれいではない。
#define CHECK_OPENGL_ERROR( cmd ) \
cmd; \
{ GLenum error; \
while ( (error = glGetError()) != GL_NO_ERROR) \
{ \
printf( "[%s:%d] \'%s\' failed with error %s?n",\
__FILE__, __LINE__, #cmd, gluErrorString(error) ); \
}
SIGGRAPH 2001 Course 03 "Performance OpenGL: Platform Independent Techniques"
#define DEG2RAD(deg) ((deg)*M_PI/180.0)
#define RAD2DEG(rad) ((rad)*180.0/M_PI)
- Gems2 オススメWebpage
gamasutra.com, flipcode.com, gamedev.net
- C++
STL のset への挿入はO(log n) で行える。しかしコンテナのメモリ使用に関しては
何の保障もない。代わりにコレクションの末尾への挿入が償却済みの定数時間に
なることが保障されているvector にするべき。
set からの削除はO(log n) だがvector からの削除はO(n) の時間。
しかし、vector の要素がポインタの場合にはコピーはmemcpy() 一度ですむ。
- マクロとinline 関数
inline 関数を多用するとメモリを食いすぎ、ページフォールト・キャッシュミス
を引き起こす元となるため、小さな関数のみに使用すること。
さもなくば、結果として実行速度が犠牲になる。
- Skybox
利点
低コストで場の感覚(sence of scene) を作る。
遠方の景観をレンダリングするための経済的かつ効果的な方法。
使用法
はじめにレンダリングする。
理想的なスカイボックスの解像度はscreenRes/(tan(FOV/2.0))
90 度の視野角・640x480 なら640 テクセルが理想的解像度。
?ここでの理想的解像度、とはトレードオフが成立する値?
参考文献
参考ウェブページ
- 2006/03/15 法線生成追加
- 2006/03/11 修正
- 2004/00/00 初版作成
|
|