光源を利用する.
2つの処理が必要.
光源そのものに環境光,拡散光,鏡面光があって,それぞれ設定するというのは,何か違和感を感じるなぁ.
光源の設定
- 光源を有効にする: glEnable(GL_LIGHTING)をコールする.
その後,glEnable(GL_LIGHT$i$)として,i番目の光源の設定をする.
GL_LIGHT$i$ = GL_LIGHT0 + $i$. - 光源の設定: 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: 設定するパラメータの名前
GL_AMBIENT: 環境光
GL_DIFFUSE: 拡散光
GL_SPECULAR: 鏡面光
GL_POSITION: 照明の位置
GL_SPOT_DIRECTION: 照明方向
GL_SPOT_EXPONENT: 輝度分布
GL_SPOT_CUTOFF: 最大放射角度
GL_CONSTANT_ATTENUATION: 一定減衰率
GL_LINER_ATTENUATION: 線形減衰率
GL_QUADRATIC_ATTENUATION: 2次減衰率 - param(s): 設定値
法線ベクトルを設定しないと,描画するポリゴンが真っ黒になってしまうらしい.
glNormal関数を使い設定する.
また,glEnable(GL_NORMALIZE)とする事で,法線ベクトルの正規化をする必要が無くなる.
例)
glEnable(GL_NORMALIZE);
glBegin(GL_POLYGON);
glNormal3f(0,1,0);
glVertex3f(0, -1, 0);
glVertex3f(1, 0, 0);
glVertex3f(0, 1, 0);
glEnd();
glDisable(GL_NORMALIZE);
オブジェクトの材質の設定
"材質の設定=物体表面での光の反射の設定"を意味する.
glMaterial関数で設定する.
glMaterialf (GLenum face, GLenum pname, GLfloat param)
glMateriali (GLenum face, GLenum pname, GLint param)
glMaterialfv(GLenum face, GLenum pname, const GLfloat parame)
glMaterialiv(GLenum face, GLenum pname, const GLint params)
face: 設定する面の指定
pname: 材質するパラメータの名前
GL_AMBIENT: 環境光
GL_DIFFUSE: 拡散光
GL_SPECULAR: 鏡面光
GL_EMISSION: 放射輝度
GL_SHININESS: 鏡面光の指数
GL_AMBIENT_AND_DIFFUSE: 環境光と拡散光の同時設定
GL_COLOR_INDEXES: 環境光,拡散光,鏡面光の色
param(s): 設定値