Advertisement
Geometrian

Photonmapping Bilinear Estimate

Nov 22nd, 2015
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. Radiance _KD_Tree::EstimateFilterSmartBilinear::filtered_estimate(Ray const& ray_i, Vec3 const& sample_position, HitRecord const& hit_record, _BoundedPriorityQueue const* bpq) const /*override*/ {
  2.     Materials::Material const* material = hit_record.object->material;
  3.  
  4.     Float n_sc;
  5.     if (_kd_tree->pmap->num_reconstruction_photons_min == _kd_tree->pmap->num_reconstruction_photons_max) {
  6.         n_sc = 0;
  7.     } else {
  8.         n_sc =
  9.             static_cast<Float>(bpq->backing.size() - _kd_tree->pmap->num_reconstruction_photons_min) /
  10.             static_cast<Float>(_kd_tree->pmap->num_reconstruction_photons_max-_kd_tree->pmap->num_reconstruction_photons_min)
  11.         ;
  12.     }
  13.     Float r_sc = Ash::sqrt(bpq->get_max().distance_sq / _kd_tree->pmap->reconstruction_max_radius_sq);
  14.     Float sc = 1 - r_sc + r_sc*n_sc; //bilinear interpolation
  15.  
  16.     Radiance total_radiance(Radiance::ZEROES);
  17.     for (auto const& dist_rec : bpq->backing) {
  18.         _PhotonComplete const& photon = _kd_tree->_photons_complete[dist_rec.photon_index];
  19.  
  20.         Materials::Material::BSDF_sample bsdf;
  21.         if (material->evaluate_bsdf(ray_i,hit_record,-photon.direction,&bsdf)) {
  22.             total_radiance += bsdf.value % photon.energy;
  23.         }
  24.     }
  25.  
  26.     return (sc * static_cast<Float>(1.0/Ash::PI) / bpq->get_max().distance_sq) * total_radiance;
  27. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement