OpenGLの設定メモ その2

OpenGLの基礎その2

前回の話の続き

光源

後半の材質とあわせて下記のサイトを参考にしてます。
http://wisdom.sakura.ne.jp/system/opengl/gl16.html
あと、次の本も
谷尻豊寿著「ARToolkitプログラミングテクニック

前書いたプログラムでは次の部分が光源の設定。

    // setup light
    static GLfloat position[] = {-10.0f, 10.0f, 10.0f, 1.0f};
    static GLfloat ambient [] = { 0.0f, 0.0f, 0.0f, 1.0f};
    static GLfloat diffuse [] = { 1.0f, 1.0f, 1.0f, 1.0f};
    static GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
    glLightfv(GL_LIGHT0, GL_POSITION, position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

4つ設定してるけどpositionは高原の位置を表す。ここではとりあえず斜め45度上方に設置。

他の3つは光の特性を決めるもので、OpenGLでは大きく分けて次の3種類の光がある。

  1. 環境光 (ambient)
  2. 拡散光 (diffuse)
  3. 鏡面光 (specular)

環境光は方向を特定できないような光で、オブジェクトを色々な方向から照らす。方向がないので影はできない。
拡散光は方向と位置がはっきりしている光で、オブジェクトの面に当たる角度とかで明るさが変わる。
鏡面光は反射する光で、光沢感をだすときに使う。

うーん、何を設定すればいいのやらという感じ。
調べてたら下記のサイトが各パラメタの動作を視覚的に表示しててすごくわかりやすかったのでメモメモ。
http://www.natural-science.or.jp/article/20101113171100.php

デフォルト値は
ambient = (0.0, 0.0, 0.0, 1.0)
diffuse = (1.0, 1.0, 1.0, 1.0)
specular = (1.0, 1.0, 1.0, 1.0)
めんどかったらこのままでもいいかも。

という訳で、デフォルトパラメタで動作させてみる。

驚きの白さに。こうなったのは描画している球体の材質の設定に問題があるため。

材質

前のプログラムでは次の部分が材質の設定。

    // setup material
    GLfloat ambient  [] = { 0.1f, 0.1f, 0.1f, 1.0f};
    GLfloat diffuse  [] = { 1.0f, 0.0f, 0.0f, 1.0f};
    GLfloat specular [] = { 1.0f, 1.0f, 1.0f, 1.0f};
    GLfloat shininess[] = { 0.0f};
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, shininess);

ここでは4つのパラメタが出てきてるけど、それぞれの意味は次の通り。

  1. ambient : 環境光に対する反射設定
  2. diffuse : 拡散光に対する反射設定
  3. specular : 鏡面光に対する反射設定
  4. shininess : 鏡面係数、きらめき具合?

今回の例だと、specularがRGBすべてをmaxで反射する設定になっていたので、反射が強すぎて白く見えていたということ。
specularを(0.1f, 0.1, 0.1f, 1.0f)とかにすれば次のように赤い球がまた現れる。

鏡面光が入った分、前回よりも地味に綺麗になったように見えなくもない。


光源とか材質は手調整しながら決めるしかないのかなぁ。各パラメタの意味をもっとしっかり理解すると多少は目処が立つのかもね。
次は物体の移動とか変換行列周りについて調べる。