「ディフューズ・ライティング」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator (ページの作成:「'''ディフューズ・ライティング'''(英語:diffuse light、拡散光)とは、3DCGにおいてモデルの表面に当たった光が均一に反射...」) |
Administrator (トーク | 投稿記録) |
||
(他の1人の利用者による、間の6版が非表示) | |||
4行目: | 4行目: | ||
== 概要 == | == 概要 == | ||
− | ある点([[頂点]]や[[ピクセル]])は「光源への方向(s)」と「[[法線]](n)」という2つの[[ベクトル]] | + | ある点([[頂点]]や[[ピクセル]])は「光源への方向(s)」と「[[法線]](n)」という2つの[[ベクトル]]を持つとする。 |
+ | 光源の方向は光源とモデルの位置から計算し、法線はあらかめ持つものとし、この2つのベクトルは[[ベクトルの正規化|正規化]]されたものとする。 | ||
− | + | [[file: ディフューズ・ライティング.png|none]] | |
− | + | このとき拡散反射する光の強さは「方向」と「法線」の角度の[[コサイン]]に比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直の場合はゼロになる。真上から当たれば強く、真横から当たれば弱いというのは小学生でも感覚的にわかるだろう。 | |
+ | |||
+ | 角度のコサインは2つの[[ベクトル]]の[[内積]]に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずとも[[プログラマブルシェーダー]]によくあるdot関数に2つのベクトルを突っ込んでやればよい。数値を0-1に丸め込む[[saturate関数]]を呼んでいるのはマイナス値(裏面)の場合はゼロとするためである。 | ||
<source lang="hlsl"> | <source lang="hlsl"> | ||
− | float3 intensity = | + | float3 intensity = saturate( dot( s, n ) ); |
</source> | </source> | ||
18行目: | 21行目: | ||
== 関連項目 == | == 関連項目 == | ||
* [[プログラマブルシェーダー]] | * [[プログラマブルシェーダー]] | ||
− | * [[ | + | * [[フォン反射モデル]] |
** [[ディフューズ・ライティング]] | ** [[ディフューズ・ライティング]] | ||
** [[アンビエント・ライティング]] | ** [[アンビエント・ライティング]] |
2023年6月22日 (木) 02:34時点における最新版
ディフューズ・ライティング(英語:diffuse light、拡散光)とは、3DCGにおいてモデルの表面に当たった光が均一に反射拡散するものとして計算するアルゴリズムである。
いわゆる「ライティング」におけるもっとも単純な実装であり、プログラミングシェーダー界隈のハローワールドである。
概要[編集 | ソースを編集]
ある点(頂点やピクセル)は「光源への方向(s)」と「法線(n)」という2つのベクトルを持つとする。 光源の方向は光源とモデルの位置から計算し、法線はあらかめ持つものとし、この2つのベクトルは正規化されたものとする。
このとき拡散反射する光の強さは「方向」と「法線」の角度のコサインに比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直の場合はゼロになる。真上から当たれば強く、真横から当たれば弱いというのは小学生でも感覚的にわかるだろう。
角度のコサインは2つのベクトルの内積に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずともプログラマブルシェーダーによくあるdot関数に2つのベクトルを突っ込んでやればよい。数値を0-1に丸め込むsaturate関数を呼んでいるのはマイナス値(裏面)の場合はゼロとするためである。
float3 intensity = saturate( dot( s, n ) );
もう少しまともに計算するときは減衰(ディフューズ係数)を掛け合わせる。