Friday, October 30, 2009

openGLの光源の位置設定でありがちなミス

openGLでの光源の位置は,4つの要素配列を使って設定するべし.

void glLightfv(GLenum light, Glenum pname, const GLfloat *params)
この関数を使って光源を設定する.
lightにはGL_LIGHT0からGL_LIGHT7までの8個のライトの名前を入れる.
pnameにはGL_POSITION,GL_SPOT_DIRECTION,GL_AMBIENT,GL_DIFFUSE,GL_SPECULARなどから設定したいパラメータの名前を入れる.
paramsには設定するパラメータを入れる.

この設定でGL_POSITIONは4要素の配列で設定しないと思いもしないレンダリング結果が出てくることが多い.
3要素のx,y,zだけを設定した気になっていると,4要素目が0と見なされて,平行光源の光源の方向設定していることになる.
スポットライトを設定しているはずなのに,平行光となり,予想していた絵と全然違うということになる.
回避するためには,4要素[x,y,z,w]の配列を用意して,wは0以外の値(私は1を入れている)を入れてglLightfvを呼んでやる.

覚えている間は,ミスることはないけど,たまにしかライティングのコードを書かない私のような間抜けは,同じミスを繰り返す.
ちなみに私は,こんな設定の話をすっかり忘れて1日くらいはまったことがある.昨日くらいの話だけど.

No comments: