拡散反射光

拡散反射光とは光源の直接光あるいは間接光が物体表面で乱反射しその一部が目に届くことで物体の色を認識するものである。しかし、すべての間接光に対して光の追跡を行うのは不可能なので、拡散反射光の一定の割合を環境光として無条件に光を加算することとする。直接光に対しては全ての光源に対して、その強度や減衰率、光の色を考慮してその色を決定する。このとき、物体上の点から光源方向ベクトルと、物体の法線ベクトルが成す角を$\theta$とする。なお、光源との間に物体がある場合はそれを無視すれば影になる。

影

鏡面反射光

鏡面反射はレイの反射方向に新たにレイを飛ばしその色を決定する。レイの反射方向ベクトル$\vec{r}$は入射レイの方向ベクトルを$\vec{d}$、物体の法線ベクトルを$\vec{n}$とすれば、
$$
\vec{r} = (-2 \vec{n}\cdot \vec{d})\vec{n} + \vec{d}
$$
である。反射レイの開始点は物体と入射レイの交差点であるが、その値をそのまま使うと、反射レイがその物体自身と交点を持つと判定されてしまう恐れがあるので、交差点から反射ベクトル方向に微小量だけ移動させる。開始点$\vec{s}$は次の式で表される。$\vec{o}$を入射レイと物体との交点とする。
$$
\vec{s} = \vec{o} + \frac{1}{10^3} \vec{r}
$$
また、RGBそれぞれの拡散反射率を$k_d^r,k_d^g,k_d^b$とする。

鏡面反射
鏡面反射

ラフネス

上記の方法で鏡面反射光をトレースした場合、映る像はくっきりとしていて鏡のようになる。物体の表面がザラザラとしている場合にはそれは不自然であるので、ラフネスというパラメータを導入する。反射ベクトルと、このラフネスにより決定されたある微小角未満の角をなすベクトルの方向にレイを飛ばせば、光の不規則な反射を再現できる。ただ、この方法をとった場合、ジャギーやノイズが発生するので、複数回ランダムな方向にサンプリングすることでアンチエイリアスすることができる。

微小角回転させた方向ベクトルは次のようにして求められる。ただし$R$は回転行列である。
$$
\vec{d’} = normarize(R , \vec{d})
$$

ラフネスの違い、左から50,5,0
ラフネスの違い、左から50,5,0

金属度

金属度は物体表面の拡散反射光と鏡面反射光の割合を決めるパラメータの一つである。金属度が高いほど鏡面反射光の割合が大きくなる。また、物体の法線ベクトルと入射レイが成す角によっても拡散反射光と鏡面反射光の割合は変化する。そこで、金属度と角度によって鏡面反射率を決定する関数を適当に定める。成す角が$90^{\circ}$に近い場合には非金属であっても鏡面反射率が高くなり、$0^{\circ}$に近いほど拡散反射率が高くなる。そして角度が小さい場合には鏡面反射率はあまり変化しない。ここではこのような関数として次の式を用いる。ただし、$M$は金属度である。

$$
f(\theta,M) = \frac{\exp(\frac{\theta}{\pi/2} \times 20 - 15)}{\exp(5)}
\times (1-M) + M
$$

これをグラフにプロットすると、次のようになる。

金属度と角度を引数に取り、鏡面反射率を返す関数
金属度と角度を引数に取り、鏡面反射率を返す関数

また、RGBそれぞれの鏡面反射率を$k_s^r,k_s^g,k_s^b$とする。

入射レイと法線ベクトルの角度が0度のとき
入射レイと法線ベクトルの角度が0度のとき
入射レイと法線ベクトルの角度が45度のとき
入射レイと法線ベクトルの角度が45度のとき
入射レイと法線ベクトルの角度が70度のとき
入射レイと法線ベクトルの角度が70度のとき
金属度の違い、左から0.9,0.5,0.1
金属度の違い、左から0.9,0.5,0.1

透明度

透明度が非零の場合には物体の裏側へレイを飛ばす。透過レイの方向ベクトルは入射ベクトルの方向と同じで、開始点は鏡面反射光のときと同様に交差点から透過ベクトル方向に微小量だけ移動させる。
$$
\vec{s} = \vec{o} + \frac{1}{10^3} \vec{d}
$$

透明なオブジェクト
透明なオブジェクト

レイの色

物体の透明度$k_t$は透過レイの色$C_t$の入射レイの色に対する割合とする。また、環境光の割合を$k_e$とすると、視線と物体の法線ベクトルの成す角が$\theta$、物体の金属度が$M$のとき、

$$
k_s^i = (1 - k_e) (1 - k_t) f(\theta, M^i), (i = R,G,B)
$$
$$
k_d^i = (1 - k_e) (1 - k_t) (1- f(\theta, M^i)), (i = R,G,B)
$$

物体色を$C_m$、その物体が光源である場合の光の色を$C_l$、光源の強さを$I_l$、物体と光源の距離を$D$、環境光の色を$C_e$、環境光強度を$I_e$、鏡面反射で飛ばしたレイの色を$C_s$、鏡面反射光のサンプル数を$N_s$とする。

以上より、レイを飛ばしたときに得られる色は以下の式で表される。
$$
C^i = (k_e I_e C_m^i C_e^i / 255) +
\left(\sum_{j \in lights}
\frac{ k_d^i \cos\theta I_{l,j} C_m^i C_{l,j}^i /255}{D^2}
\right) +
\left(\frac{1}{N_s}\sum_{j \in samples}^{N_s} k_s^i C_{s,j}^i \right) +
(k_t C_t^i)
$$
$$ (i = R,G,B) $$

光源

様々な光源色
様々な光源色