Phongの反射モデル(フォンのはんしゃモデル; 英: Phong reflection model)とは、3次元コンピュータグラフィックスにおいて、モデリングされた面上の点に影をつけるための照明と陰影(シェーディング)モデルである。Phong照明、Phongライティングとも。
Phongの反射モデルは環境光反射・拡散反射・鏡面反射の和として定義される(⇒ #定義)。環境光反射は入射光の重み付けで、拡散反射成分はランバート反射で、鏡面反射は経験的な式でモデル化されている(⇒ #解説)。このモデルはユタ大学の理学博士である、ブイ・トゥオン・フォンによって開発され、1973年に"Illumination for Computer Generated Pictures"の題で学位論文として発表された。
上記論文ではポリゴンメッシュモデルのシェーディングにおける法線ベクトル補完手法も提案されている。これはPhongシェーディングとして知られる。
光源・反射面(点)・撮像面(点)が配置された3次元空間について考える。
以下のように光源を定義する:
以下のように反射面(点)を定義する:
以下のように撮像面(点)と出力を定義する:
これらに基づき、Phongの反射モデルは以下の式で定義される:
複数光源を扱う場合、光源の種類に応じた成分[注 1]を単に加算する。
Phongの反射モデルでは、一般的なレンダリング方程式をより単純化して扱うことができる。このモデルでは、面上の点における陰影を決定する際に、次のような単純化ができる利点がある。
この方程式をグラフィカルに表現すると以下のようになる。
Phongの反射モデルにおける鏡面反射成分(スペキュラ、specular)は鏡面反射に類する成分である。
鏡面反射成分は鏡面反射の数学的モデルではない。これは鏡面ハイライトの経験的モデルであり[1]、Phong の「光沢の強い表面はハイライト中心から輝度が急激に落ち、面積が小さい」「光沢の鈍い表面はハイライト中心から輝度がゆるやかに落ち、面積が大きい」という観察を上手く再現するように設計されている。
この成分の挙動は光沢度 で強く制御される。 を取る反射ベクトル と視点ベクトル の内積が のべき乗で減衰することで、鏡面反射が見える角度()に近い条件でのみ に応じた急激さでハイライトが発生する。なお、光沢度 と素材の物理的特性の対応は考慮せずモデル化されており、値は都度経験的に設定される[2]。
Phongの反射モデルにおける拡散反射成分(ディフューズ、diffuse)は拡散反射を表現する成分である。
拡散反射成分はランバート反射でモデル化されている。ゆえに入射角にのみ依存し、視点の方向 には影響を受けない。
Phongの反射モデルにおける環境反射成分(アンビエント、ambient)は環境光の反射を表現する成分である。
環境反射成分はランバート反射でモデル化されている。ただし環境光は全方向にあたる、すなわち常に反射面へ垂直に入射する。このため環境光の方向ベクトル で表現すると が常に成立し、環境反射成分は環境光の単なる重み付けになる。
環境反射光と拡散反射光の色は同じである。環境反射の項は均一であるのに対し、拡散反射の項の輝度は表面の方向によって値が変わることに注意すること。鏡面反射光の色は入射光の色と同一である。
色をRGB値で表現する場合、この式はR、G、B成分のそれぞれについて別々に計算するのが一般的である[独自研究?]。
OpenGLおよびDirect3DといったグラフィックスAPIを用いたリアルタイムレンダリングでは、描画速度などの制約から局所照明 (local illumination) モデルを採用することが多いが、Phong反射モデルはその単純さから計算量もリソース消費量も少なくて済むため、ソフトウェア (CPU) もしくはハードウェア (GPU) による固定機能シェーダーとして標準実装されていた(OpenGL 2.1およびDirect3D 9まで)。ハードウェア性能が向上し、プログラマブルシェーダーが一般化してからも、軽量さからPhong反射モデルが採用されることもある。なお固定機能の廃止されたOpenGL 3.1およびDirect3D 10以降では、Phong反射モデルの実現にはプログラマブルシェーダーが使用される。
一方で、極めて単純化されたおおざっぱな近似モデルであることから、表面下散乱や環境遮蔽といった複雑な拡散反射光や環境光による大域照明 (global illumination) 現象を記述することはできない。
面上の点で色を計算する反射モデルに加えて、Phongはまた、曲面のパッチを表現するラスタライズされた三角形において、ピクセルごとの色を計算するための補間方法も開発した。これらの反射モデルと補間法のトピックは時々「Phongシェーディング」という用語として一緒に扱われる。しかし「Phongシェーディング」という用語は、あくまで補間のための方法にのみ使われるものである。