Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Radiance _KD_Tree::EstimateFilterSmartBilinear::filtered_estimate(Ray const& ray_i, Vec3 const& sample_position, HitRecord const& hit_record, _BoundedPriorityQueue const* bpq) const /*override*/ {
- Materials::Material const* material = hit_record.object->material;
- Float n_sc;
- if (_kd_tree->pmap->num_reconstruction_photons_min == _kd_tree->pmap->num_reconstruction_photons_max) {
- n_sc = 0;
- } else {
- n_sc =
- static_cast<Float>(bpq->backing.size() - _kd_tree->pmap->num_reconstruction_photons_min) /
- static_cast<Float>(_kd_tree->pmap->num_reconstruction_photons_max-_kd_tree->pmap->num_reconstruction_photons_min)
- ;
- }
- Float r_sc = Ash::sqrt(bpq->get_max().distance_sq / _kd_tree->pmap->reconstruction_max_radius_sq);
- Float sc = 1 - r_sc + r_sc*n_sc; //bilinear interpolation
- Radiance total_radiance(Radiance::ZEROES);
- for (auto const& dist_rec : bpq->backing) {
- _PhotonComplete const& photon = _kd_tree->_photons_complete[dist_rec.photon_index];
- Materials::Material::BSDF_sample bsdf;
- if (material->evaluate_bsdf(ray_i,hit_record,-photon.direction,&bsdf)) {
- total_radiance += bsdf.value % photon.energy;
- }
- }
- return (sc * static_cast<Float>(1.0/Ash::PI) / bpq->get_max().distance_sq) * total_radiance;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement