メインメニューを開く

差分

ディフューズ・ライティング

397 バイト追加, 2023年6月22日 (木) 02:34
編集の要約なし
== 概要 ==
ある点([[頂点]]や[[ピクセル]])は「光源への方向(s)」と「[[法線]](n)」という2つの[[ベクトル]]を持つとする。この2つのベクトルはを持つとする。光源の方向は光源とモデルの位置から計算し、法線はあらかめ持つものとし、この2つのベクトルは[[ベクトルの正規化|正規化]]されたものとする。
このとき拡散反射する光の強さは「方向」と「法線」の角度の[[コサインfile: ディフューズ・ライティング.png|none]]に比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直(角度90度、真横から光が当たった)の場合はゼロになる。
角度のコサインは2つのベクトルのこのとき拡散反射する光の強さは「方向」と「法線」の角度の[[コサイン]]に比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直の場合はゼロになる。真上から当たれば強く、真横から当たれば弱いというのは小学生でも感覚的にわかるだろう。 角度のコサインは2つの[[ベクトル]]の[[内積]]に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずともプログラマブルシェーダーによくあるdot関数に2つのベクトルを突っ込んでやればよい。に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずとも[[プログラマブルシェーダー]]によくあるdot関数に2つのベクトルを突っ込んでやればよい。数値を0-1に丸め込む[[saturate関数]]を呼んでいるのはマイナス値(裏面)の場合はゼロとするためである。
<source lang="hlsl">
float3 intensity = maxsaturate( dot( s, n ), 0.0 );
</source>
== 関連項目 ==
* [[プログラマブルシェーダー]]
* [[ライティングフォン反射モデル]]
** [[ディフューズ・ライティング]]
** [[アンビエント・ライティング]]