「スペキュラー・ライティング」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator |
Administrator (トーク | 投稿記録) (→概要) |
||
5行目: | 5行目: | ||
; 反射光ベクトル | ; 反射光ベクトル | ||
− | * n = | + | * n = [[法線ベクトル]] |
* s = 光源に対する方向(-sで入射光ベクトル) | * s = 光源に対する方向(-sで入射光ベクトル) | ||
* r = 反射光ベクトル | * r = 反射光ベクトル | ||
14行目: | 14行目: | ||
r = -s + 2 ( s ・ n) n | r = -s + 2 ( s ・ n) n | ||
− | ちなみに[[HLSL]]にも[[GLSL]] | + | ちなみに[[HLSL]]にも[[GLSL]]にも反射光ベクトルを求めるreflect関数があるので難しいことを考えずに入射光ベクトルと法線ベクトルをブチ込んでやれば一発で計算してくれる。 |
[[HLSL]] | [[HLSL]] |
2020年4月28日 (火) 03:54時点における最新版
スペキュラー・ライティング(英語: specular lighting)とは、3DCGにおいてモデルの表面の輝きを計算するアルゴリズムである。
概要[編集 | ソースを編集]
サーフェイスに光沢があるとき、その光はサーフェイスで鏡のように反射される。
- 反射光ベクトル
- 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);