OpenGLメモ
投影座標変換
遠近感を出す処理。
透視投影(遠近投影法)の行列を用いる準備。
glMatrixMode(GL_PROJECTION); glLoadIdentity();
モデルビュー座標変換
視点にたいしてモデル位置づけ。
モデルビュー行列を用いる準備。
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
平行移動
glTranslate( 0.0f, 5.0f, 0.0f ); // y方向に5.0平行移動
拡大縮小
glScalf( 2.0f, 2.0f, 2.0f ); // 2倍に拡大
回転
glRotatef( 45.0f, 1.0f, 0.0f, 0.0f ); // x軸で45度回転
ポートビュー座標変換
glViewport(Left, Bottom, Width, Height);
- 透視変換
glViewport( 0, 0, w, height ); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( 30.0f, w/h, 1.0, 100.0 ); // 視野角, 視体積のアスペクト比, 近クリップ距離, 遠クリップ距離 glMatirxMode(GL_MODELVIEW);
光源の設定
- 環境光(ambient)
- 拡散光(diffuse)
- 鏡面光(specular)
- 放射光(emission)
設定例)
GLfloat light0_amb[] = {0.1f, 0.1f, 0.1f, 1.0f}; GLfloat light0_diff[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat light0_spec[] = {0.0f, 0.0f, 0.0f, 1.0f}; GLfloat light0_pos[] = {0.0f, 0.0f, 10.0f, 0.0f}; void setLight() { glLightfv( GL_LIGHT0, GL_AMBIENT, light0_amb ); glLightfv( GL_LIGHT0, GL_DIFFUSE, light0_diff ); glLightfv( GL_LIGHT0, GL_SPECULAR, light0_spec ); glLightfv( GL_LIGHT0, GL_POSITION, light0_pos ); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); }
マテリアルの設定
- 環境光(ambient)
- 拡散光(diffuse)
- 鏡面光(specular)
- 放射光(emission)
物体に光沢を付ける(第三パラメータを大きくするとつやっぽくなる)
glMaterialfv(GL_FRONT, GL_SHININESS, 100.0f);
法線の設定
ライト有効時(glEnable(GL_LIGHTING))、照明モデルがオブジェクトに正しく作用させるには、オブジェクトに法線ベクトルを指定する必要があります。
オブジェクトの各頂点設定と一緒に法線ベクトルを設定します。
オブジェクトの各頂点設定と一緒に法線ベクトルを設定します。
// 地面 void drawPrimPlane(float gsize) { glBegin( GL_TRIANGLE_STRIP ); glNormal3f( 0,0,1 ); // z方向に法線ベクトルを設定 glVertex3f(-gsize,-gsize,0.0f); glVertex3f( gsize,-gsize,0.0f); glVertex3f(-gsize, gsize,0.0f); glVertex3f( gsize, gsize,0.0f); glEnd(); }
シェーディング・モデル
- スムース・シェーディング
- フラット・シェーディング
glShadeModel(GL_SMOOTH); glShadeModel(GL_FLAT);
デプス・テスト
多角形に影を付ける。
デプステストは、多角形の前後関係を決める。
デプステストは、多角形の前後関係を決める。
glEnable(GL_DEPTH_TEST);
初期化時にしておけばOK。
デプステスト有効時は、バッファをクリアしてからレンダリングする。
glClaer( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
隠面消去処理
描画処理
フレーム・バッファ
行列スタック
ディスプレイ・リスト
#include <GL/gl.h>
GLuint theList;
void init()
{
theList = glGenLists(1);
glNewList(theList, GL_COMPILE);
{
draw();
}
glEndList();
}
void display()
{
glPushMatrix();
glCallList(theCapsule);
glPopMatrix();
}
テクスチャ・マッピング
混合処理
アンチエリアシング
スクリーン上の線のジャギー(ギザギザ)を滑らかに見せる処理。
glEnable(GL_LINE_SMOOTH);