2009年11月4日水曜日

OpenGLの光源について


OpenGL - Sample7 からスクラップ:
光源について
今度は、光源についてです。OpenGLで使える光源には、環境光、点光源(拡散光を出す)、平行光、スポットライトがありますが、平行光は点光源と同じような扱いになっています。ここでは環境光、点光源、平行光の使い方についてのみ解説します。
光源を方法としては、光源の設定を、glLightfv()で行い、glEnable()で光源を使用するようにする。

glEnable(GL_LIGHTING)

ライティングを有効にする。ポリゴンの向きや光源からの距離に応じてポリゴンの明るさを計算するようになる。これをやらないと、光源や質感の設定をやっても全く反映されない。

glEnable(GL_LIGHT0)

0番の光源を使うようにする。OpenGLでは、GL_LIGHT0~GL_LIGHT7の8つの光源は最低使え、環境によってはそれ以上の数の光源を使うこともできる。でも普通は多くても2~3個しか使わないと思うけど。

void glLightfv(GLenum light, GLenum pname, const GLfloat *params )

光源の設定をする。glMaterialfv()と同じような感じで設定する。
lightには、GL_LIGHT0など、どの光源を設定するかを指定する。
pnameには、どのパラメタを設定するかを指定する。GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR、GL_POSITIONなど。
paramsには、設定する値の入った配列を渡す。pnameがGL_AMBIENTの時は、環境光の強さを、GL_DIFFUSEの時は、拡散光もしくは平行光の強さを、GL_SPECULARの時は、テカテカの強さを、それぞれRGBA形式で─1から1の範囲で設定する。
GL_POSITIONの時は、光源の位置をXYZW形式で指定する。W(サンプルプログラムでは、lit_pos[3])が0の場合は、光源は拡散光ではなく平行光となり、光源がXYZ方向の無限遠にあることになる。Wが0以外の場合、点光源が、XYZの位置にあることになる。このGL_POSITIONの設定も、glTranslatef()やglRotatef()の影響を受ける。




0 件のコメント:

コメントを投稿