アンビエント光吸収


環境光吸収式は、実際のソフトシャドウを生成するための技術である.従来のシャドウインプリメンテーションでは、シャドウを放出して光をテストし、光とランプが遮断されているかどうかをテストします.一方,環境光吸収は半球面にランダムに光線を放出し,光線と環境の交点個数を用いてシャドウの深さをシミュレートした.
その実現の原理は以下の通りである.
// 
  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を使用して、レンダリング結果を減衰させます.