現在地 >> メニュー >> 基本編05 >> 光源の設定

次 >> 法線ベクトルの設定

<光源の設定>


「光源の設定」には、「glLight()関数」を用いる。

この「関数」には、
  • glLightf(GLenum light, GLenum pname, GLfloat param)
  • glLighti(GLenum light, GLenum pname, GLint param)

あるいは、
  • glLightfv(GLenum light, GLenum pname, const GLfloat *params)
  • glLightiv(GLenum light, GLenum pname, const GLint *params)

がある。


― [引数について] ―

「light」:使用する「照明」を指定する。「GL_LIGHT0 〜 GL_MAX_LIGHTS−1」まで指定可能。

「pname」:「光源」の何を操作するか指定する。(後述)

「param」、「params」:具体的な「設定値」を指定する。


<pname:光源のパラメータ>



「光源のパラメータ」として次のものが指定できる。
パラメータ名内容初期値
GL_AMBIENT環境光(0,0,0,1)
GL_DIFFUSE拡散光GL_LIGHT0=(1,1,1,1)。他は(0,0,0,1)
GL_SPECULAR鏡面光GL_LIGHT0=(1,1,1,1)。他は(0,0,0,1)
GL_POSITION照明の位置(0,0,1,0)
GL_SPOT_DIRECTION照明方向(0,0,-1)
GL_SPOT_EXPONENT輝度の分布0 ※値は[0〜128]まで
GL_SPOT_CUTOFF最大放射角度180 ※値は[0〜90]と180をとれる
GL_CONSTANT_ATTENUATION一定減衰率1 ※負の値以外OK
GL_LINER_ATTENUATION線形減衰率0 ※負の値以外OK
GL_QUADRATIC_ATTENUATION2次減衰率0 ※負の値以外OK


GL_POSITIONについて



「GL_POSITION」は、「同次座標系」で記述する
つまり、4つの要素は
(x, y, z, w)
の順番になっている。


通常の座標を求めたい場合は、(x/w, y/w, z/w)で得られる。

[例]

(45,30,90,3) → (45/3, 30/3, 90/3) → (15, 10, 30)
※これは(15, 10, 30 ,1)と等しい。

もし、w=0の場合は
 原点(0,0,0)から、(x,y,z)に向かって直線を引いた無限遠方の点となっている。


つまり、
  • w = 0 → 「無限遠方」 → 「太陽のような光源(並行光源)」
  • それ以外 → 「位置が決まる」 → 「点光源」
となる。

<設定>


光源を設定するには、
  1. 位置などの数値データを用意
  2. 光源との関連付け
  3. 有効化
によって行われる

[ 例 ]

float position[] = {3, 0, -2, 0};  //数値データを用意
float diffuse[] = {1,0,0,1};

... ...

glLightfv(GL_LIGHT0, GL_POSITION, position);//「光源0」の「位置」
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); // 「光源0」の「拡散光」

... ...

glEnable(GL_LIGHTING);//「照明パラメータ」の有効化
glEnable(GL_LIGHT0);//「光源0」を「ON」にする。

メモ


光源の位置設定は、glVertexやglNormalのように使うと正しい結果となる。
もし、「init関数内」などのワールド座標系で位置を設定すると、そこから投影変換が発生し、正しい結果とならない。



次 >> 法線ベクトルの設定

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます