光源の設定
いつもの参考URLhttp://seesaawiki.jp/w/mikk_ni3_92/d/%B8%F7%B8%BB%A4%CE%C0%DF%C4%EA
glLight関数を使用して光源を設定する。
・GL_POSITION
同次座標系で設定するらしい。
例) (x:45, y:30, z:90, w:3) => (45/3, 30/3, 90/3, 3/3) => (15, 10, 30, 1)と等しい。
もしw=0の場合無限遠方となる
・設定の順番
1. 位置などの数値データを用意
2. 光源との関連づけ
3. 有効化
サンプル
#include <GL/gl.h> #include <GL/glut.h> const GLfloat lightPos[] = { 3 , 0 , -2 , 0 }; const GLfloat lightCol[] = { 1 , 0 , 0 , 1 }; void disp( void ) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_POLYGON); glNormal3f(3 , 0 , -2); glVertex3f(0 , -0.9 , -2); glVertex3f(3 , -0.9 , -7); glVertex3f(0 , 0.9 , -2); glNormal3f(-3 , 0 , -2); glVertex3f(0 , -0.9 , -2); glVertex3f(-3 , -0.9 , -7); glVertex3f(0 , 0.9 , -2); glEnd(); glFlush(); } int main(int argc , char ** argv) { glutInit(&argc , argv); glutInitWindowPosition(100 , 50); glutInitWindowSize(400 , 300); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Kitty on your lap"); glutDisplayFunc(disp); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(1 , -1 , -1 , 1 , 2 , 10); glLightfv(GL_LIGHT0 , GL_POSITION , lightPos); glLightfv(GL_LIGHT0 , GL_DIFFUSE , lightCol); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; }
実行結果
OpenGL の照光モデルは、光を放射、環境、拡散、鏡面、に分解し
各要素を独立した計算によって処理し、最終的に統合するという方法を採用しています
具体的な内部実装は、この場で知る必要はないでしょう
独自の照光モデルを採用したい時などに、ソフトウェアで独自にこうした処理を行います
参考URL
http://wisdom.sakura.ne.jp/system/opengl/gl16.html
0 件のコメント:
コメントを投稿