[トップページ] [星雲紀行] [MLXS] [WPGen] [自作音楽] [モデル] [vi/vim] [tips] [自己紹介]

OpenGL

目次

  1. はじめに
  2. エクステンション
  3. OpenGL cygwin コンパイル方法
  4. tips
  5. Game Programming Gems2 読書メモ
  6. 参考文献・参考ウェブページ
  7. 履歴

はじめに

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
[content]

OpenGL cygwin コンパイル方法

Cygwin でOpenGL プログラムをコンパイルするためには
まず、GLUT のライブラリをダウンロードする。

  1. nate robins
    GLUT バイナリ。

    dll、lib は
    c:/windows/system
    glut.h は
    c:/windows/system32/GL
    に入れておくとよい。
  2. 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
[content]

tips

  • 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"

[content]

ラジアン、デグリー変換

#define DEG2RAD(deg) ((deg)*M_PI/180.0)
#define RAD2DEG(rad) ((rad)*180.0/M_PI)
[目次]

Game Programming Gems2 読書メモ

  1. Gems2 オススメWebpage
    gamasutra.com, flipcode.com, gamedev.net
  2. C++
    STL のset への挿入はO(log n) で行える。しかしコンテナのメモリ使用に関しては 何の保障もない。代わりにコレクションの末尾への挿入が償却済みの定数時間に なることが保障されているvector にするべき。
    set からの削除はO(log n) だがvector からの削除はO(n) の時間。
    しかし、vector の要素がポインタの場合にはコピーはmemcpy() 一度ですむ。
  3. マクロとinline 関数
    inline 関数を多用するとメモリを食いすぎ、ページフォールト・キャッシュミス を引き起こす元となるため、小さな関数のみに使用すること。
    さもなくば、結果として実行速度が犠牲になる。
  4. Skybox
    利点
    低コストで場の感覚(sence of scene) を作る。
    遠方の景観をレンダリングするための経済的かつ効果的な方法。
    使用法
    はじめにレンダリングする。
    理想的なスカイボックスの解像度はscreenRes/(tan(FOV/2.0))
    90 度の視野角・640x480 なら640 テクセルが理想的解像度。
    ?ここでの理想的解像度、とはトレードオフが成立する値?

参考文献・参考ウェブページ

参考文献

参考ウェブページ

[目次]

履歴

  • 2006/03/15 法線生成追加
  • 2006/03/11 修正
  • 2004/00/00 初版作成
[目次]
ご意見、ご感想、誤字、間違い等、お気づきの点がありましたら KGussan@Gmail.com まで連絡ください。
このウェブページの注意・免責事項 Copyright (C) 2004-2012 KGussan. [トップページ]
[PR:元国税局勤務の起業家向け、遺産相続の相談なら植村洋税理士事務所:一時間無料税理士相談。お気軽に。]