「ディフューズ・ライティング」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
imported>Administrator
11行目: 11行目:
 
このとき拡散反射する光の強さは「方向」と「法線」の角度の[[コサイン]]に比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直の場合はゼロになる。真上から当たれば強く、真横から当たれば弱いというのは小学生でも感覚的にわかるだろう。
 
このとき拡散反射する光の強さは「方向」と「法線」の角度の[[コサイン]]に比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直の場合はゼロになる。真上から当たれば強く、真横から当たれば弱いというのは小学生でも感覚的にわかるだろう。
  
角度のコサインは2つの[[ベクトル]]の[[内積]]に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずとも[[プログラマブルシェーダー]]によくあるdot関数に2つのベクトルを突っ込んでやればよい。max関数を呼んでいるのはマイナス値(裏面)の場合はゼロとするためである。
+
角度のコサインは2つの[[ベクトル]]の[[内積]]に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずとも[[プログラマブルシェーダー]]によくあるdot関数に2つのベクトルを突っ込んでやればよい。数値を0-1に丸め込むsaturate関数を呼んでいるのはマイナス値(裏面)の場合はゼロとするためである。
  
 
<source lang="hlsl">
 
<source lang="hlsl">
     float3 intensity = max( dot( s, n ), 0.0 );
+
     float3 intensity = saturate( dot( s, n ) );
 
</source>
 
</source>
  

2018年11月14日 (水) 07:34時点における版

ディフューズ・ライティング英語:diffuse light、拡散光)とは、3DCGにおいてモデルの表面に当たった光が均一に反射拡散するものとして計算するアルゴリズムである。

いわゆる「ライティング」におけるもっとも単純な実装であり、プログラミングシェーダー界隈のハローワールドである。

概要

ある点(頂点ピクセル)は「光源への方向(s)」と「法線(n)」という2つのベクトルを持つとする。 光源の方向は光源とモデルの位置から計算し、法線はあらかめ持つものとし、この2つのベクトルは正規化されたものとする。

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

このとき拡散反射する光の強さは「方向」と「法線」の角度のコサインに比例する。法線と同一方向(角度ゼロ度)の場合は最大値に、法線に垂直の場合はゼロになる。真上から当たれば強く、真横から当たれば弱いというのは小学生でも感覚的にわかるだろう。

角度のコサインは2つのベクトル内積に比例する。つまり拡散反射する光の強さは「sとnの内積の積」として表現できるので、いちいち自前でコサインを計算せずともプログラマブルシェーダーによくあるdot関数に2つのベクトルを突っ込んでやればよい。数値を0-1に丸め込むsaturate関数を呼んでいるのはマイナス値(裏面)の場合はゼロとするためである。

    float3 intensity = saturate( dot( s, n ) );

もう少しまともに計算するときは減衰(ディフューズ係数)を掛け合わせる。

関連項目