OpenGL メモ Color, Materials, and Lighting

  • glColor*(...)で指定した色を、プリミティブの材質の色とするには、以下のようにします。
glEnable(GL_COLOR_MATERIAL);
//glColorで指定した色が、材質の Ambient, Biffuse の色となる
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
...

glColor3f(0.75f, 0.75f, 0.75f);
glBegin(GL_TRIANGLES);
  //ポリゴンの描写
glEnd();
  • 法線を自動で生成するには glEnable(GL_AUTO_NORMAL) を使いますが、遅くなります。なるべくプログラム内で計算し与えましょう。
  • モデルビュー・マトリックスを glScale* で変更した際、法線も影響を受け単位ベクトルでなくなってしまい、その結果、ライティングの結果がおかしくなってしまいます。それを防ぐため、 glEnable(GL_RESCALE_NORMALS) を使います。
  • 描写する線や点をスムーズ(Smoothing)にするには、以下のように行いますが、たいていは Multisampling を使えばうまくいきます。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
  • Multisampling は以下のように行います。なお、Multisampling と Smoothing は同時に使えません。
//初期に
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);

//描写の際に
glEnable(GL_MULTISAMPLE);
  • フォグで使用する距離は以下のようにして与えます。
glFori(GL_FOG_COORD_SRC, GL_FOR_COORD);//fogCoordで指定
glBegin(GL_TRIANGLES);
  glFogCoordf(10.0f);
  //ポリゴンを描写
glEnd();
//Or
glFogi(GL_FOG_COORD_SRC, GL_FRAGMENT_DEPTH);//fragmentのデプス値を使用
glBegin(GL_TRIANGLES);
  //ポリゴンを描写
glEnd();