Document

7-
7.
光源の設定
7.1.1. 光源の種類:平行光源,点光源,スポット光源,環境光
(1) 平行光源:太陽光のように無限遠と見なせる位置に光源がある場合,
光は平行に到達する.
→強度と方向は場所によらず一定
OpenGLでは光源の方向ベクトルとRGBAの各強度で指定
1
7-
(2) 点光源:方向性を持たない比較的小さな光源が局所的に空間を照らす
(裸電球等)
→光源からの距離rが離れると光強度が低下する.
OpenGLでは光源の位置とRGBAの各強度を指定すると光量が計算される
Iin
r
r
Iin(r)
2
7-
(3) スポット光源:方向性を持った点光源.
→光源に加えて光軸の方向と広がり角度(cutoff)及び光軸から半径方向の光量
分布を指定する.
cutoff
(4) 環境光:空気による散乱や周囲の物体との相互反射によって生じる間接
光源.
→OpenGLではRGB強度で指定する
3
7-
7.1.2. 光源の設定方法
glLight*(光源の番号,設定項目,設定値);
*=f,i,fv,iv:データの形式
光源の番号:同時に8つまで可能.GL_LIGHT0~GL_LIGHT7
設定項目:GL_POSITION:光源の種類と位置
GL_DIFFUSE,GL_SPECULAR,GL_AMBIENT:
光源の属性
設定値:light[4]
設定項目でGL_POSITIONを設定した場合とGL_DIFFUSE等を
設定した場合で意味が異なる
前回のglMaterialfと混同しないこと.glMaterialfは物体の表面属性設定,
glLightは光源の属性設定
4
7-
光源の種類と位置の設定:GL_POSITION
float light[ ] = {1.0,1.0,1.0,0.0}
glLightfv(GL_LIGHT0,GL_POSITION,light)
(1)平行光源の設定方法
light[ ]の第4要素を0.0とする.
第1要素から第3要素は光源位置のx,y,z成分.
(2)点光源の設定方法
light[ ]の第4要素を1.0とする.
第1要素から第3要素は光源の空間位置のx,y,z座標.
r
(3)スポットライトの設定方法:点光源の特殊な場合.後述
glLightfv(GL_LIGHT1,GL_SPOT_CUTOFF ,15.0):広がり15度
光源自体はレンダリングされないため,光源を可視化する場合は
光源の位置に物体をおいてglMaterialf関数のGL_EMISSIONを設定する.
5
7-
光源属性の設定:
光源属性は幾何変換の影響を受けないのでどの位置で指定して
もよい(光源種類を指定した後にする)
float diffusedata[ ] ={0.0,0.0,1.0,1.0}; //r,g,b,α
float speculardata[ ] ={0.5,0.5,1.0,1.0}; //r,g,b,α
float ambientdata[ ] ={0.5,0.5,1.0,1.0}; //r,g,b,α
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffusedata)
glLightfv(GL_LIGHT0,GL_SPECULAR,speculardata)
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientdata)
注意:教科書では物体属性のdiffuseなどと光源のdiffuseなどに同じ
配列名が使われているが混同しないこと
6
7-
7.1.3 斜め上から光をあてた球
実行!
c7-1.cをコピーして実行する.
7
7-
練習問題7-1:
1)p102の練習問題-1:(1), (2)
8
7-
7.2 移動する光源の設定
光源は通常の物体と同様幾何変換による移動が可能.
実行!
c7-2.cをコピーして実行する.
(平行光源と点光源の2つの光源を設定し,点光源を球の
赤道上で動かしている
9
7- 10
練習問題7-2:
1)p102の練習問題-2:
(1)光源の位置に立方体プリミティブを追加して光源を可視化する.
a)光源位置へ移動
b)glutSolidCube(0.1)によりプリミティブを描画p7-2-1.c
(2)光源が光っているように上の立方体プリミティブに放射光の属性を設定.
p7-2-2.c
float blueEmission[ ]={0.3,0.3,1.0};
glTranslatef(-3.0,0.0,0.0);
glPushAttrib(GL_LIGHTING_BIT);
glMaterialfv(GL_FRONT,GL_EMISSION,blueEmission);
glutSolidCube(0.1);
glPopAttrib( );
光源が光っているように見えても,そこから実際に光が出るわけ
ではないので,光源設定は別途必要
7- 11
7.3 スポット光源
7.3.1. 設定方法
スポット光源は点光源の特別な場合.
glLightfv(GL_LIGHT1,GL_POSITION ,light); //light[3]=1.0を事前設定
glLightfv(GL_LIGHT1,GL_SPOT_CUTOFF ,15.0);
GL_SPOT_CUTOFF:遮断角度(ライトの広がり角度)
GL_SPOT_EXPONENT:ライトの中心から外側に向かう明
るさの減衰率
GL_SPOT_DIRECTION:スポットライトを当てる方向(x,y,z)
Cutoff角度
7- 12
7.3.2 スポット光源の例
実行!
c7-3.cをコピーして実行する.
7- 13
練習問題7-3:
1)p104の練習問題:(1), (2)