Slide 50
Slide 50 text
Copyright 2019 DELiGHTWORKS Inc. All Rights Reserved. 50
アンビエントオクルージョンのシェーダー
float evaluateAO(float3 position, float3 normal)
{
uint2 pixIdx = DispatchRaysIndex().xy; // レイインデックス x=0~1920, y=0~1080
uint2 numPix = DispatchRaysDimensions().xy; // ステージサイズ x=1920, y=1080
// ランダムなシードを計算
uint randSeed = initRand(pixIdx.x + pixIdx.y * numPix.x, 100);
// 遮蔽度合い
float visibility = 0.0f;
// 飛ばすレイの回数
const int aoRayCount = 4;
for (int i = 0; i < aoRayCount; ++i) {
// 法線を中心とした半球上のランダムなベクトルのサンプリング(コサイン重み付き分布)
float3 sampleDir = getCosHemisphereSample(randSeed, normal);
// シャドウレイを飛ばす
float sampleVisibility = shootShadowRay(position, sampleDir, RAY_EPSILON, 10.0, 1);
//遮蔽度合い += サンプリングした値 × コサイン項 / 確率密度関数
float NoL = saturate(dot(normal, sampleDir));
float pdf = NoL / PI;
visibility += sampleVisibility * NoL / pdf;
}
// 平均を取る
return (1 / PI) * (1 / float(aoRayCount)) * visibility;
}
複数レイを飛ばして
平均を取る
数式の詳しい解説はP. 59参照