ページ

2014年8月17日日曜日

Cent OSでOpenGL 8 - 光源 -

光源の設定

いつもの参考URL
http://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 件のコメント:

コメントを投稿