Metal Raytracing Lighting

Metal Raytracing Sample のライティング計算のコア部分は ShadeKernel 内で行われる。ShadeKernel は ShadowKernel とセットで計算され、複数回のライトバウンスを考慮するときは、このセットを2回、3回と呼び出す。

Inverse-square law

逆二乗の法則。光の強さは距離の二乗に反比例する。つまり、距離が2倍になれば強さは 1/4。距離が4倍離れれば、強さは 1/16になる。

// ライト距離の逆数を算出
float3 lightDirection = lightSamplePosition – intersectionPoint;
lightDistance = length(lightDirection);
float inverseLightDistance = 1.0f / max(lightDistance, 1e-3f); // 0 除算回避

// 正規化。lightDirection に逆数を乗算すれば方向だけが取れる?
lightDirection *= inverseLightDistance;

// 逆二乗の法則で、lightColor の値を減衰させる
lightColor = light.color;
lightColor *= (inverseLightDistance * inverseLightDistance);

// 更にライトは、ライト自体の放射強度も変わる
lightColor *= saturate(dot(-lightDirection, light.forward));

lightDirection がマイナスなので、ライト光源から IntersetcionPoint へのベクトル。それと light.forwad との内積を取っているので、ライト光源自体の角度による減衰のために、この計算がある?エリアライトで light.forward 方向が一番強く放射するようになっている。でも Point Light の時も必要なのか?、

// 更にライトは、ライトの方向とサーフェスの法線によっても減衰する
lightColor *= saturate(dot(surfaceNormal, lightDirection));

サーフェスと lightDirection の内積で、面にあたる光の強度を変える。

// 最終的に交差点での色と、ライトの色が最終的な色になる
shadowRay.color = lightColor * intersectionPointColor;

2次レイ、3次レイ

1次レイの場合と処理は ray.color = 1.0f で初期化。サーフェースの色が複数回跳ね返るため、2次レイを投げる時、1次レイの color (lightは含まない?) と、二次レイでヒットした箇所の色を color * surfaceColor の結果を ray.Color に入れて投げている。

コメントを残す

メールアドレスが公開されることはありません。