問1
まず入射レイdを水平成分dhと垂直成分dpに分解してみよう。
dpdh=−(d⋅n)n=d−dp=d+(d⋅n)n
この水平成分と垂直成分の長さに注目すると∥d∥=1より
∥dp∥=cosθi∥dh∥=sinθi
という関係がある。
同様に屈折レイも水平成分rhと垂直成分rpに分解する。
スネルの法則より
sinθt=n2n1sinθi
であるから、
∥rh∥=n2n1∥dh∥
が成り立つ。水平成分の方向は変化しないから
rh=n2n1dh=n2n1(d+(d⋅n)n)
となる。
∥r∥=1より
∥rp∥=1−∥rh∥2
となり、垂直成分の方向は−nであるから
rp=−1−∥rh∥2n
である。
よって
r=rh+rp=n2n1(d+(d⋅n)n)−1−∥rh∥2n
となる。
問2
まず球のy軸方向で[−1,1]から一様サンプリングする。サンプリングした結果をuとすると、y=uのところで球をスライスする。あとはスライスされた円の縁上で点を一様にサンプリングすれば良い。
y=uでスライスされた円の半径は1−u2である。したがって、あとは円での角度θを[0,2π]から一様にサンプリングすれば
yxz=u=1−u2cosθ=1−u2sinθ
で球上の点を一様にサンプリングすることができる。これをそのまま方向ベクトルとして使えば良い。