床井研究室

シス工猫その後

2年前くらいから大学のキャンパスのシステム工学部付近に住み着いているシス工猫ですが、今もなんとか生き延びているようです。ただ、この盆休みに食べ物にありつけなかったのか、とても飢えているようです。コロコロとした体格の猫なんですが、お腹の辺りがへこんでいました。よく見ると、後ろ足の付け根あたりに2センチくらいの怪我もしています。ちょっとかわいそうに思えたので、こっそりおやつをあげました。

シス工猫

書き忘れ

テクスチャマッピング入門を後から読んでみて、書き忘れたことがいくつもあるなぁと思ったので、思いついたことを書きとめておこうと思います。今回は GL_SEPARATE_SPECULAR_COLOR について書きます。この機能はスフィアマッピングで Phong シェーディングで使っているのですが、本来の使い道はテクスチャマッピングの時にハイライトをきれいに出すことにあります。

GL_MODULATE とテクスチャマッピング

OpenGL の陰影付けは、頂点における陰影を計算した後、その線形補間によりポリゴン内の画素の陰影を求めます(グーローのスムーズシェーディング)。通常、頂点における陰影は、拡散反射光成分(および環境光成分と自己発光成分)と鏡面反射光成分を合計して求めます。したがって、ポリゴン内の陰影値はこの合計値を線形補間して求めることになります。 テクスチャをマッピングした物体に陰影を付ける場合、求めたポリゴンの陰影によってテクスチャの明度を GL_MODULATE により変調します。しかし、こうすると元々のポリゴンの陰影に含まれるハイライト(鏡面反射光成分)もテクスチャの変調に使われてしまい、ハイライトにもテクスチャがマッピングされてしまいます。ハイライトは光源の映り込みであり、光源の光が物体内部に侵入せずに物体表面で正反射したものととらえられますから、ハイライトにはテクスチャ等で与えられた物体の表面の色を反映させたくない場合もあります。

GL_SEPARATE_SPECULAR_COLOR

glLightModeli() を使って GL_LIGHT_MODEL_COLOR_CONTROLGL_SEPARATE_SPECULAR_COLOR を設定する(デフォルト値は GL_SINGLE_COLOR)と、頂点の陰影の拡散反射光成分(および環境光成分と自己発光成分)と鏡面反射光成分を別々に補間するようになります。そして、テクスチャをマッピングしたときには、拡散反射光成分(および環境光成分と自己発光成分)によりテクスチャの明度を変調し、鏡面反射光成分はそれに加算されるようになります。これによりハイライトがテクスチャの影響を受けなくなります。

試してみる

まず、球にハイライトを付けてレンダリングしてみます。この球には後でテクスチャをマッピングしますが、glutSolidSphere() ではテクスチャ座標が生成されないため、ここではテクスチャ座標を生成できる gluSphere() を使用します。

球に鏡面反射光をつけて陰影付け

これに次のようなテクスチャを GL_MODULATE によりマッピングします。

球にマッピングするテクスチャ

すると、次のような陰影が得られます。

球にテクスチャをマッピングして陰影付け

この状態では下地の色(ポリゴンの陰影)そのものでテクスチャの明度が変調されており、ハイライト部分もそのままテクスチャの明度の変調に使われています。そこで、光源の設定の段階で glLightModeli() を使って GL_LIGHT_MODEL_COLOR_CONTROLGL_SEPARATE_SPECULAR_COLOR を設定します。

/* 拡散反射光と鏡面反射光を別々に補間する */
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);

こうすると、拡散反射光成分(および環境光成分と自己発光成分)と鏡面反射光成分が別々に補間され、陰影の拡散反射光成分(および環境光成分と自己発光成分)により変調されたテクスチャの色に、鏡面反射光成分が加算されるようになります。

GL_SEPARATE_SPECULAR_COLOR を使った場合