鏡面ハイライト

鏡面ハイライト（きょうめんハイライト）は、光源からの光が光沢のある表面に反射して見える、光源の鏡像である。表面ハイライト (surface highlight)、曲面ハイライト、（球面の場合は）球面ハイライト、（眼球の場合は）眼球ハイライト、または単にハイライトともいう。 光源が点光源で、球面など単純な表面の場合は、ハイライトは、周囲がなだらかにぼやけた楕円形の斑点として現れる。ただし、表面が複雑だったり、室内や人工的な撮影環境で光源が複雑な場合は、さまざまなハイライトが現れる。 ハイライトの再現は3次元コンピュータグラフィックスにおいて重要である。この効果は、あるシーンにおける光源に関して、物体の形状やその場所に対する非常に強い視覚的役割を果たしている。 ハイライトはしばしば反射した物体の色ではなく光源の色を反映する。この現象が起こるのは、多くの材質は着色された表面上に薄い透明な材質の層を持っているためである。例えば、プラスチックは透明なポリマーの中に薄色付きビーズを入れて作られているし、人間の皮膚は色の付いた細胞の上に油脂や汗の薄い層を伴っていることが多い。このような材質では、等しく反射したすべてのカラースペクトルを持つハイライトが現れる。金のような金属質な材質上では、ハイライトの色は材質の色を反映する。 眼球のハイライト（眼球ハイライト）は、人物画や人物写真の印象に大きな影響を与える。そのため人物の撮影では、光源は照明以外にハイライトの要因としても重要である。光源の位置や強さには照明としての条件が優先されるが、光源の形は照明としては重要でないため、どのような眼球ハイライトを生じさせたいかを考えて選ぶことがある。 また、ハイライトは1枚の写真の中ではほぼ同じである為、これを利用して、複数の人物写真から作った合成写真を見抜くことができる。 鏡面反射という言葉は、光が光源から観察者に対して鏡のように、完全に反射することを意味する。鏡面反射は、光の入射方向と観察者の方向とのちょうど間に表面法線がある場合のみ見ることができる。光の入射方向と観察者の方向との角度は２等分されるため、このときの法線の向きは半角方向と呼ばれる。つまり、光源の像が完全にくっきりと反射するので、鏡面反射する表面にはハイライトが現れることを示している。しかしながら、完全な鏡面以外のつやあり物体に現れるのは、ぼやけたハイライトである。 この現象は微小面の存在を仮定することで説明可能である。ここで、物体の表面が、完全になめらかではなく、多くの非常に小さな面から成っていて、それぞれが完全鏡面反射していると仮定する。微小面の法線となめらかな表面の法線との違いの度合いは、表面のなめらかさによって変わる。 ハイライトがぼやける理由はこれではっきりする。表面法線が入射方向と観察者方向のほぼ真ん中を向いているなめらかな物体上の点では、微小面上の点の法線の多くが半角方向にあるので、ハイライトの光は明るく見える。ここで、ハイライトの中心を動かすと、表面法線の向きと半角方向とがずれてしまう。つまり、多くの微小面における法線が半角方向ではなくなってしまう。それでハイライトの輝度は０に落ち込んでしまう。 微小面の分布予測には異なるモデルが何種類かある。たいていは微小面の法線は表面の法線の周りに一様に分布すると仮定している。このモデルを等方性と呼ぶ。もし、微小面が、ある方向に沿ってある選択の元で分布しているならば、その分布モデルは異方性と呼ぶ。 Phongの反射モデルでは、ハイライトの輝度は、 k s p e c = cos n ⁡ ( R , V ) {\displaystyle k_{spec}=\cos ^{n}(R,V)\,} として計算できる。ここで、Rは表面での光の鏡面反射ベクトルであり、Vは視点ベクトルである。定数nはPhong指数で、表面の見かけの滑らかさを制御する、ユーザが選択できる値である。 Blinn-Phongの陰影モデルでは、ハイライトの輝度は k s p e c = cos n ⁡ ( N , H ) {\displaystyle k_{spec}=\cos ^{n}(N,H)\,} として計算できる。Nは滑らかな表面での法線で、Hは半角(光線ベクトルLと視点ベクトルVとのちょうど真ん中)である。 これらの方程式は、微小面法線の分布は、角度に関連しておおよそガウス分布ないしピアソン２型分布に従うことを暗に示している。　一方、このことは役に立つことは分かるし、信用できる結果を提示してはいるが、物理学を基礎としたモデルではない。 ガウス分布を使うことで、もう少しいい微小面分布のモデルを作ることができる。ハイライトの輝度は以下の関数を使うことで計算できる。 k s p e c = e − ( ∠ ( N , H ) m ) 2 {\displaystyle k_{spec}=e^{-\left({\frac {\angle (N,H)}{m}}\right)^{2}}} ここで、mは０から１の間の定数で、表面の外見的ななめらかさを表す。 物理学に基づく微小面モデルはベックマン分布である。この関数は非常に正確な結果を返すが、計算コストもそれなりに高価である。 k s p e c = 1 4 m 2 cos 4 ⁡ ( N , H ) e − ( tan ⁡ ( N , H ) m ) 2 {\displaystyle k_{spec}={\frac {1}{4m^{2}\cos ^{4}(N,H)}}e^{-\left({\frac {\tan(N,H)}{m}}\right)^{2}}} ここでmは、表面の微小面の平均的な傾きである。 Heidrich-Seidel分布は単純な異方性分布であり、Phongモデルをベースとしている。これは、小さく平行な溝や糸、たとえばこすれた金属や繻子、髪の毛のようなものを持つ表面のモデルに使われる。この分布を用いたハイライト輝度は、 k s p e c = [ sin ⁡ ( L , T ) sin ⁡ ( V , T ) − cos ⁡ ( L , T ) cos ⁡ ( V , T ) ] n {\displaystyle k_{spec}=\left[\sin(L,T)\sin(V,T)-\cos(L,T)\cos(V,T)\right]^{n}} である。ここでnはPhong指数である。Vは視点方向である。Lは光線方向、Tは表面上の点における平行な溝ないし糸の方向である。 Wardの異方性分布は、異方性制御用としてαxとαyというユーザが制御可能な２つのパラメータを使う。もしこの２つのパラメータが同じであればこれは等方性ハイライトとなる。この分布における鏡面反射式は、 k s p e c = 1 ( N ⋅ L ) ( N ⋅ V ) N ⋅ L 4 α x α y exp ⁡ [ − 2 ( H ⋅ X α x ) 2 + ( H ⋅ Y α y ) 2 1 + ( H ⋅ N ) ] {\displaystyle k_{spec}={\frac {1}{\sqrt {(N\cdot L)(N\cdot V)}}}{\frac {N\cdot L}{4\alpha _{x}\alpha _{y}}}\exp \left[-2{\frac {\left({\frac {H\cdot X}{\alpha _{x}}}\right)^{2}+\left({\frac {H\cdot Y}{\alpha _{y}}}\right)^{2}}{1+(H\cdot N)}}\right]} もしN-L<0かN-E<0であれば、鏡面反射項は０になる。すべてのベクトルは単位ベクトルになる。ベクトルVは表面上の点から視点へのベクトルである。Lは表面上の点から光源への方向、Hは半角方向である。Nは表面の法線であり、XとYは異方性方向を示す法線面上の２つの直行ベクトルである。 Cook-Torranceモデルは D F G E ⋅ N {\displaystyle {\frac {DFG}{E\cdot N}}} の形の鏡面反射項を使う。 ここでDはベックマン分布項 D = e − ( tan ⁡ α m ) 2 4 m 2 cos 4 ⁡ α {\displaystyle D={\frac {e^{-\left({\frac {\tan \alpha }{m}}\right)^{2}}}{4m^{2}\cos ^{4}\alpha }}} であり、Fはフレネル項 F = ( 1.0 + E . N ) λ {\displaystyle F=(1.0+E.N)^{\lambda }\,} である。Gは幾何減衰項であり、微小面による自己陰影を記述する。これは以下の式、 G = min ( 1 , 2 ( H ⋅ N ) ( E ⋅ N ) E ⋅ H , 2 ( H ⋅ N ) ( L ⋅ N ) E ⋅ H ) {\displaystyle G=\min \left(1,{\frac {2(H\cdot N)(E\cdot N)}{E\cdot H}},{\frac {2(H\cdot N)(L\cdot N)}{E\cdot H}}\right)} で表される。これらの公式では、Eはカメラないし視点へのベクトルであり、Hは半角ベクトル、Lは光源へのベクトル、Nは法線ベクトル、αはHとNとの角度である。 もし望むのであれば、異なる分布(普通は同じ分布関数で異なる値mとnを使うことが多い)の加重平均を計算することができる。例えば全体的にざらざらであるよりも、ちょっとだけ滑らかでざらざらな箇所をもつ表面をモデリングするのには役に立つ。