I am Charmie

メモとログ

OpenGL: 光源の設定

光源を利用する.
2つの処理が必要.
光源そのものに環境光,拡散光,鏡面光があって,それぞれ設定するというのは,何か違和感を感じるなぁ.

光源の設定

  1. 光源を有効にする: glEnable(GL_LIGHTING)をコールする.
    その後,glEnable(GL_LIGHT$i$)として,i番目の光源の設定をする.
    GL_LIGHT$i$ = GL_LIGHT0 + $i$.
  2. 光源の設定: 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)
    1. light: 使用する光源のインデックス(GL_LIGHT0 GL_MAX_LIGHTS-1まで指定可能)
    2. 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次減衰率
    3. 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): 設定値