ハーフベクトル

最終更新日23 May 2017 05:32

理科の授業を思い出してほしい。
入射角と、反射角は同じだったよね?
だから、正反射方向ベクトルを求めるには

  • 光源と頂点を結ぶベクトル
  • 視線と頂点を結ぶベクトル

を足し算すればいい。

この、vertexとlightとeyeとreflectionを結ぶと、平行四辺形になりますね。
ここれいう頂点は、反射する点てこと。
正反射方向ベクトルを仮にsとする

(1)
\begin{align} s=\vec{L}+ \vec{V} \end{align}

そして、長さは特に意味をなさないので、正規化するのが普通。
GLSLのコードで書くとこうなる

vec3 reflection = normalize(lightpos+viewvec);//正反射方向ベクトル

この方向はハイライトの方向に使える。
この特殊な正反射方向ベクトルはHalfway Vectorと呼ばれている。
光源と観測者の中間方向だからである。(2)
\begin{align} max\{ \vec{r} \cdot \vec{n} ,0\}^{shininess}*specular_{light}*specular_{material} \end{align}

shininessとは鏡面反射指数である。

(3)
\begin{align} \vec{h}=\frac{\vec{l}+\vec{v}}{\|\vec{l}+\vec{v}\|} \end{align}
vec3 haldvector = normalize(_lightpos+_viewvec);//ハーフベクトル

球だと正反射ベクトル使用のものと見た目の違いはわからないが、
平面にシェーディングを施すと違いがはっきりする。

正反射方向ベクトルよりも求めるのが簡単。
shader half_vector(
    vector view = vector(0.0,1.0,0.0),
    output vector half_vector = vector(0,0,0))
{
    half_vector = normalize(I+view);
}

regular-reflection


ファイル

サポートサイト Wikidot.com regular-reflection