最終更新:
mikk_ni3_92 2009年08月06日(木) 18:29:15履歴
現在地 >> メニュー >> 基本編05 >> 光源の設定
次 >> 法線ベクトルの設定
「光源の設定」には、「glLight()関数」を用いる。
この「関数」には、
あるいは、
がある。
― [引数について] ―
「light」:使用する「照明」を指定する。「GL_LIGHT0 〜 GL_MAX_LIGHTS−1」まで指定可能。
「pname」:「光源」の何を操作するか指定する。(後述)
「param」、「params」:具体的な「設定値」を指定する。
「光源のパラメータ」として次のものが指定できる。
「GL_POSITION」は、「同次座標系」で記述する
つまり、4つの要素は
通常の座標を求めたい場合は、(x/w, y/w, z/w)で得られる。
[例]
もし、w=0の場合は
原点(0,0,0)から、(x,y,z)に向かって直線を引いた無限遠方の点となっている。
つまり、
光源を設定するには、
[ 例 ]
光源の位置設定は、glVertexやglNormalのように使うと正しい結果となる。
もし、「init関数内」などのワールド座標系で位置を設定すると、そこから投影変換が発生し、正しい結果とならない。
次 >> 法線ベクトルの設定
次 >> 法線ベクトルの設定
「光源の設定」には、「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」:具体的な「設定値」を指定する。
「光源のパラメータ」として次のものが指定できる。
パラメータ名 | 内容 | 初期値 |
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_ATTENUATION | 2次減衰率 | 0 ※負の値以外OK |
「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 → 「無限遠方」 → 「太陽のような光源(並行光源)」
- それ以外 → 「位置が決まる」 → 「点光源」
光源を設定するには、
- 位置などの数値データを用意
- 光源との関連付け
- 有効化
[ 例 ]
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関数内」などのワールド座標系で位置を設定すると、そこから投影変換が発生し、正しい結果とならない。
次 >> 法線ベクトルの設定