立方体の描画
ここでは、OpenGL1.xの固定機能シェーダを用いた立方体描画を行います。

はじめに
ここで触れる内容は、
- モデル・ビュー・マトリックス
- ライティング
についてです。
3つの関数に分けて説明します。
- initializeGL : 初期化処理、はじめの一度呼ばれ、その後は呼ばれません。
- resizeGL : リサイズ処理、ウィンドウのサイズ変更時に呼ばれます。
- paintGL : 描画処理、描画ごとに呼ばれます。
ソースコード
void initializeGL()
{
glClearColor(0.5, 0.5, 0.5, 1.0);
//光源有効
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
//光源の設定
GLfloat light_position[] = { -50.0, 50.0, 50.0, 1.0 };
GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, light_position );
glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient );
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse );
glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular );
glEnable(GL_DEPTH_TEST);
//カリング:表面のみ表示
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
}
void resizeGL( int w, int h )
{
glViewport(0, 0, w, h);
//プロジェクション・マトリックス設定
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//モデル・ビュー・マトリックス設定
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
//カメラ設定
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();
{ // 直方体の表示
float lx = 0.5f;
float ly = 0.5f;
float lz = 0.5f;
//材質設定
GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
// sides
glBegin (GL_TRIANGLE_STRIP);
glNormal3f (-1,0,0);
glVertex3f (-lx,-ly,-lz);
glVertex3f (-lx,-ly,lz);
glVertex3f (-lx,ly,-lz);
glVertex3f (-lx,ly,lz);
glNormal3f (0,1,0);
glVertex3f (lx,ly,-lz);
glVertex3f (lx,ly,lz);
glNormal3f (1,0,0);
glVertex3f (lx,-ly,-lz);
glVertex3f (lx,-ly,lz);
glNormal3f (0,-1,0);
glVertex3f (-lx,-ly,-lz);
glVertex3f (-lx,-ly,lz);
glEnd();
// top face
glBegin (GL_TRIANGLE_FAN);
glNormal3f (0,0,1);
glVertex3f (-lx,-ly,lz);
glVertex3f (lx,-ly,lz);
glVertex3f (lx,ly,lz);
glVertex3f (-lx,ly,lz);
glEnd();
// bottom face
glBegin (GL_TRIANGLE_FAN);
glNormal3f (0,0,-1);
glVertex3f (-lx,-ly,-lz);
glVertex3f (-lx,ly,-lz);
glVertex3f (lx,ly,-lz);
glVertex3f (lx,-ly,-lz);
glEnd();
}
glPopMatrix();
}
説明
initializeGL()関数では、光源の設定を行っています。
1つの光源を有効にするには、以下のように記述します。
1つの光源を有効にするには、以下のように記述します。
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
続けて光源の位置や色を設定します。
GLfloat light_position[] = { -50.0, 50.0, 50.0, 1.0 };
GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, light_position );
glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient );
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse );
glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular );
OpenGLでは次の4つのパラメータで光源の性質を設定します。
- 環境光(ambient)
- 拡散光(diffuse)
- 鏡面光(specular)
- 放射光(emission)
値を設定しない場合は、デフォルトの値が設定されます。
光源の設定は必ずしもinitializeGL()で行う必要はありません。
もし、光源を移動させたいならばpaintGL()にてGL_POSITIONを毎回設定すればよいです。
もし、光源を移動させたいならばpaintGL()にてGL_POSITIONを毎回設定すればよいです。
resizeGLでは、プロジェクション・マトリックスを設定しています。
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
glMatrixMode(GL_PROJECTION)の後に続くマトリックス演算がプロジェクション・マトリックスになりますので、glLoadIdentityとgluPerspectiveがそれにあたります。
固定機能シェーダであるため、マトリックスの変数が見えないのがわかりづらいところですが、実際にはハードウェア(ビデオチップ)上にマトリックスを格納するレジスタが存在しており、そのレジスタに対してコマンドを渡すことで制御します。
固定機能シェーダであるため、マトリックスの変数が見えないのがわかりづらいところですが、実際にはハードウェア(ビデオチップ)上にマトリックスを格納するレジスタが存在しており、そのレジスタに対してコマンドを渡すことで制御します。
paintGLでは、モデル・ビュー・マトリックスの設定をしています。
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
//カメラ設定
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
とすることで、モデル・ビュー・マトリックスを設定するモードになります。
ここでもマトリックスの変数が隠れてしまっていますが、実際にはハードウェア上にモデル・ビュー・マトリックス用のレジスタが用意されており、そのレジスタに対してコマンドを送り制御します。
カメラ(ビュー)のマトリックスは、gluLookAtで制御します。
ここでもマトリックスの変数が隠れてしまっていますが、実際にはハードウェア上にモデル・ビュー・マトリックス用のレジスタが用意されており、そのレジスタに対してコマンドを送り制御します。
カメラ(ビュー)のマトリックスは、gluLookAtで制御します。
頂点は、glVertex3fで設定します。
glPushMatrix();
{ // 直方体の表示
float lx = 0.5f;
float ly = 0.5f;
float lz = 0.5f;
//材質設定
GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
// sides
glBegin (GL_TRIANGLE_STRIP);
glNormal3f (-1,0,0);
glVertex3f (-lx,-ly,-lz);
glVertex3f (-lx,-ly,lz);
glVertex3f (-lx,ly,-lz);
glVertex3f (-lx,ly,lz);
glNormal3f (0,1,0);
glVertex3f (lx,ly,-lz);
glVertex3f (lx,ly,lz);
glNormal3f (1,0,0);
glVertex3f (lx,-ly,-lz);
glVertex3f (lx,-ly,lz);
glNormal3f (0,-1,0);
glVertex3f (-lx,-ly,-lz);
glVertex3f (-lx,-ly,lz);
glEnd();
// top face
glBegin (GL_TRIANGLE_FAN);
glNormal3f (0,0,1);
glVertex3f (-lx,-ly,lz);
glVertex3f (lx,-ly,lz);
glVertex3f (lx,ly,lz);
glVertex3f (-lx,ly,lz);
glEnd();
// bottom face
glBegin (GL_TRIANGLE_FAN);
glNormal3f (0,0,-1);
glVertex3f (-lx,-ly,-lz);
glVertex3f (-lx,ly,-lz);
glVertex3f (lx,ly,-lz);
glVertex3f (lx,-ly,-lz);
glEnd();
}
glPopMatrix();
glPushMatrixを使うとハードウェア上でモデル・ビュー・マトリックスが退避されます。
この作業により、ローカル座標にて頂点を設定してモデル作成を行うことができます。
この作業により、ローカル座標にて頂点を設定してモデル作成を行うことができます。
添付ファイル