スペキュラー・ライティング
概要
サーフェイスに光沢があるとき、その光はサーフェイスで鏡のように反射される。
- 反射光ベクトル
- n = 法線ベクトル
- s = 光源に対する方向(-sで入射光ベクトル)
- r = 反射光ベクトル
- v = 視線ベクトル
- shininess = 光沢(=減衰率)
とすると反射光ベクトル(r)は以下の式で計算できる。
r = -s + 2 ( s ・ n) n
ちなみにHLSLにもGLSLにも反射光ベクトルを求めるreflect関数があるので難しいことを考えずに入射光ベクトルと法線ベクトルをブチ込んでやれば一発で計算してくれる。
float3 r = reflect(-s, n);
vec3 r = reflect(-s, n);
- 減衰
反射は視線ベクトルvと反射ベクトルrが一致するときに最大になり、反射ベクトルから離れるにつれ急激に減衰する。 これは視線ベクトルvと反射ベクトルrの内積を求め、さらに光沢shininessの冪乗を求めればそれらしくなる。乗数(光沢shininess)が大きいほど角度に応じて急速にゼロに近づき、より輝いて見える。
float3 intensity = pow( saturate( dot( v, r ) ), shininess);