ホームに戻る
光源
図01_00:物体の手前 -1.0 に点光源 減衰率 I=1/(1+0.5*d)
ソースコード:glut01_light.c
解説
光源
光源はモデルビュー空間の座標上に存在します。
光源は通常8個まで同時に使用でき、
利用する際にはライティングを有効にし、
各ライトについても有効にする必要があります。
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
光源には点光源と平行光源があります。
これは GL_POSITION の第4引数で設定します。
第4引数が 0 のとき平行光源となり、それ以外は点光源です。
平行光源の時は第1〜3引数は向きのみの情報ですが、
点光源の場合はモデルビュー空間上の直接の座標となります。
点光源の場合はスポットライトのような表現も可能。
パラメータは以下、
GL_SPOT_DIRECTION:向き
GL_SPOT_EXPONENT:中心からの減衰率
GL_SPOT_CUTOFF:ライトの広がり(0.0-180.0)
点光源の距離 d に対する減衰率 I は次のようにも設定できる。
I = 1 / (constant + linear * d + quadratic * d^2)
パラメータは以下、
GL_CONSTANT_ATTENUATION:式中のconstant
GL_LINEAR_ATTENUATION:式中のlinear
GL_QUADRATIC_ATTENUATION:式中のquadratic
その他のパラメータ、
要素は RGBW であり最終的には R/W、G/W、B/W が適応される。
GL_AMBIENT:光が当たっていない部分の明るさ
GL_DIFFUSE:ライト自体の光の明るさ
GL_SPECULAR:光が当たっている部分の明るさ
その他の設定、
GL_LIGHT_MODEL_AMBIENT:ライトが無い状態での明るさ
GL_LIGHT_MODEL_LOCAL_VIEWER:視点を考慮した鏡面反射
GL_LIGHT_MODEL_TWO_SIDE:面の裏も照らす
初期値のリスト、
glLightfv or glLightf
GL_AMBIENT:(0, 0, 0, 1)
GL_DIFFUSE:GL_LIGHT0=(1, 1, 1, 1)、GL_LIGHT1-7=(0, 0, 0, 0)
GL_SPECULAR:GL_LIGHT0=(1, 1, 1, 1)、GL_LIGHT1-7=(0, 0, 0, 0)
GL_POSITION:(0, 0, 1, 0)
GL_SPOT_DIRECTION:(0, 0, -1)
GL_SPOT_EXPONENT:0
GL_SPOT_CUTOFF:180
GL_CONSTANT_ATTENUATION:1
GL_LINEAR_ATTENUATION:0
GL_QUADRATIC_ATTENUATION:0
glLightModelfv or glLightModelf
GL_LIGHT_MODEL_AMBIENT:(0.2,0.2,0.2,1.0)
GL_LIGHT_MODEL_LOCAL_VIEWER:GL_FALSE
GL_LIGHT_MODEL_TWO_SIDE:GL_FALSE
物体の設定
光源のベクトルと物体の法線のベクトルが逆向きであれば、
物体の面は最も明るい。
逆に光源のベクトルと物体の法線のベクトルが垂直であれば、
平行光源の場合に物体の面には光が当たらない。
この計算をするために、
物体の頂点を指定するごとに法線も指定する必要がある。
このときの glNormal は向きだけの情報で良い。
物体のパラメータ、
GL_AMBIENT:光の当たっていない部分の反射
GL_DIFFUSE:ライトの光にたいする反射
GL_SPECULAR:光が当たっている部分の反射(初期値は0)
GL_SHININESS:GL_SPECULARの強さ(0.0-128.0)
発光する物体
GL_EMISSION を用いて発光する物体を作成できるが、
光源にはなり得ないので物体と同じ位置に光源を置く、
などの工夫が必要になる。
初期値のリスト、
glMaterialf or glMaterialfv
GL_AMBIENT:(0.2, 0.2, 0.2, 1)
GL_DIFFUSE:(0.8, 0.8, 0.8, 1)
GL_SPECULAR:(0, 0, 0, 1)
GL_EMISSION:(0, 0, 0, 1)
GL_SHININESS:0