フォンシェーディング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

フォンシェーディング: Phong shading)は、3次元コンピュータグラフィックスのある技法群を指す。フォンシェーディングには、物体表面での光の反射のモデルと、ラスタライズされたポリゴン群をまたいだ法線ベクトル補間によってピクセルの色を推測する技法が含まれる。

反射モデルをフォン反射モデルフォン照明モデルなどと呼ぶ。ピクセルシェーダなどでフォンシェーディングと言った場合、この照明の計算を指すことが多い。補間技法をフォン補間と呼ぶが、「ピクセル単位照明」と呼ばれることが多い。グーローシェーディングフラットシェーディングなどの他の補間技法との対比で、これを「フォンシェーディング」と呼ぶ。フォン反射モデルはそれら他の補間技法とも組み合わせて使うことがある。

これらの技法はユタ大学ブイ・ツォン・フォンが考案したもので、1973年の博士論文で発表した。

フォン反射モデル[編集]

フォン反射は局所的照明の経験的モデルである。粗い表面のランバート反射と滑らかな表面の鏡面反射を組み合わせて物体表面の反射を表している。これは、滑らかな表面では小さく強い鏡面ハイライトが見られ、鈍い表面ではハイライト部分が大きく徐々に弱まっていくという、フォン自身の定式化されていない観測に基づくものである。この反射モデルにはアンビエント項もあり、シーン全体の弱い散乱光を考慮している。

フォン方程式の視覚化。照明は白色光で、アンビエント色と拡散反射色は共に青、鏡面反射色は白である。表面に当たった光はほとんど反射されているが、ハイライト部分は非常に狭い。拡散成分の強さは表面の角度によって変化し、アンビエント成分は一様(角度とは独立)である。

シーンにおける光源ごとに、鏡面反射成分 i_s と拡散反射成分 i_d (通常、RGB値)を定義する。また、アンビエント照明の制御は i_a でなされ、全ての光源の影響の総和として計算されることもある。

シーン内の各種材質について、次を定義する。

k_s: 鏡面反射定数。入射した光の鏡面反射成分の反射率。
k_d: 拡散反射定数。入射した光の拡散反射成分の反射率(ランバート反射
k_a: アンビエント反射定数。シーン全体にあるアンビエント成分の反射率。
\alpha: その材質の輝度 (shininess) 定数。より滑らかな表面ほど大きい。また、この定数が大きければ鏡面ハイライトが小さく強くなる。

さらに全光源の集合\mathrm{lights} と定義し、表面上のある点から光源へ向かうベクトルを L、表面上の同じ点における法線ベクトルN、その点で光が完全反射したときの方向を R、仮想的なカメラまたは視点に向かうベクトルを V とする。

フォン反射モデルでの表面上の各点におけるシェーディング値 I_p を求める式は次のようになる。

I_p = k_a i_a + \sum_\mathrm{lights} (k_d (L \cdot N) i_d + k_s (R \cdot V)^{\alpha}i_s)

拡散反射成分は視点 (V) には影響されない。鏡面反射成分は視点方向 (V) が反射方向 R に近い時のみ大きくなる。その近さはそれらの間の角度のコサインの \alpha 乗で表される。法線ベクトル RV の間の角度のコサインは、それらのドット積に等しい。\alpha が大きければほとんど鏡面に近い反射となり、鏡面ハイライトは小さくなる。何故なら、視点の方向と反射の方向が合っていない場合、コサイン値は1より小さくなり、大きい値でべき乗するとほとんど0に近くなるからである。

色をRGB値で表現する場合、この式はR、G、Bのそれぞれについて別々に計算するのが一般的である。

フォン補間[編集]

フォンシェーディング補間の例

フォンシェーディングはグーローシェーディングより改良されており、滑らかな表面のシェーディングのよりよい近似を提供する。フォンシェーディングは法線ベクトルが連続的に変化すると見なす。フォン補間手法は、フォン反射モデルのように小さい鏡面ハイライトを持つ反射モデルに適用するとき、グーローシェーディングよりも良い結果をもたらす。

グーローシェーディングの大きな問題は鏡面ハイライトが大きなポリゴンの真ん中あたりにあるときに顕著となる。グーローシェーディングではポリゴンの頂点の色を計算し、頂点間を全て補間するため、そのようなハイライトは見えなくなる。フォンシェーディングではこの問題に対処できる。

グーローシェーディングとは異なり、フォンシェーディングではポリゴンの頂点の法線ベクトルからポリゴン内の表面の法線ベクトルを線形補間で求める。シーン上の各ピクセルについてそのようにして法線ベクトルを求め、それぞれにフォン反射モデルを適用してピクセルの色を求める。ピクセル毎に反射モデルの計算をするため、フォンシェーディングはグーローシェーディングよりも計算量が大きくなる。

最近のハードウェアには、ピクセルシェーダやフラグメントシェーダを使ってこのアルゴリズムの派生を実装しているものもある。これは、法線ベクトルを各ポリゴンの2次色として符号化し、ラスタライザにそれをグーローシェーディングで補間させ、ピクセルシェーダがそれを法線ベクトルとして解釈して各ピクセルの照明計算を行うという方法である。

関連項目[編集]