アンビエント光吸収
環境光吸収式は、実際のソフトシャドウを生成するための技術である.従来のシャドウインプリメンテーションでは、シャドウを放出して光をテストし、光とランプが遮断されているかどうかをテストします.一方,環境光吸収は半球面にランダムに光線を放出し,光線と環境の交点個数を用いてシャドウの深さをシミュレートした.
その実現の原理は以下の通りである.
得られたresultを使用して、レンダリング結果を減衰させます.
その実現の原理は以下の通りである.
//
optix::Onb onb(ffnormal);
unsigned int seed = rot_seed( rnd_seeds[ launch_index ], frame );
float result = 0.0f;
const float inv_sqrt_samples = 1.0f / float(sqrt_occlusion_samples);
// sqrt_occulsion_sample*sqrt_occulsion_sample
for( int i=0; i<sqrt_occlusion_samples; ++i ) {
for( int j=0; j<sqrt_occlusion_samples; ++j ) {
PerRayData_occlusion prd_occ;
prd_occ.occlusion = 0.0f;
// Stratify samples via simple jitterring
float u1 = (float(i) + rnd( seed ) )*inv_sqrt_samples;
float u2 = (float(j) + rnd( seed ) )*inv_sqrt_samples;
//
float3 dir;
optix::cosine_sample_hemisphere( u1, u2, dir );
onb.inverse_transform( dir );
optix::Ray occlusion_ray = optix::make_Ray( phit, dir, 2, scene_epsilon,
occlusion_distance );
rtTrace( top_object, occlusion_ray, prd_occ );
//
result += 1.0f-prd_occ.occlusion;
}
}
result /= (float)(sqrt_occlusion_samples*sqrt_occlusion_samples);
得られたresultを使用して、レンダリング結果を減衰させます.