スペキュラー・ライティング

提供: MonoBook
2020年4月28日 (火) 03:54時点におけるAdministrator (トーク | 投稿記録)による版 (→‎概要)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

スペキュラー・ライティング英語: specular lighting)とは、3DCGにおいてモデルの表面の輝きを計算するアルゴリズムである。

概要[編集 | ソースを編集]

サーフェイスに光沢があるとき、その光はサーフェイスで鏡のように反射される。

反射光ベクトル
  • n = 法線ベクトル
  • s = 光源に対する方向(-sで入射光ベクトル)
  • r = 反射光ベクトル
  • v = 視線ベクトル
  • shininess = 光沢(=減衰率)

とすると反射光ベクトル(r)は以下の式で計算できる。

r = -s + 2 ( s ・ n) n

ちなみにHLSLにもGLSLにも反射光ベクトルを求めるreflect関数があるので難しいことを考えずに入射光ベクトルと法線ベクトルをブチ込んでやれば一発で計算してくれる。

HLSL

float3 r = reflect(-s, n);

GLSL

vec3 r = reflect(-s, n);
減衰

反射は視線ベクトルvと反射ベクトルrが一致するときに最大になり、反射ベクトルから離れるにつれ急激に減衰する。 これは視線ベクトルvと反射ベクトルrの内積を求め、さらに光沢shininessの冪乗を求めればそれらしくなる。乗数(光沢shininess)が大きいほど角度に応じて急速にゼロに近づき、より輝いて見える。

float3 intensity =  pow( saturate( dot( v, r ) ), shininess);

関連項目[編集 | ソースを編集]