static Color3 finalGathering(KdTree<Photon> *map , Scene& scene , Intersection& inter , RNG& rng , const Vector3& wo , int gatherSamples , int knn , Real maxSqrDis) { Color3 res = Color3(0.0 , 0.0 , 0.0); for (int i = 0; i < gatherSamples; i++) { Real pdf; Vector3 wi = sampleCosHemisphere(rng.randVector3() , &pdf); Ray ray = Ray(inter.p + wi * EPS , wi); Intersection _inter; Geometry *_g = scene.intersect(ray , _inter); if (_g == NULL) continue; Color3 tmp = estimate(map , 0 , knn , scene , _inter , -wi , maxSqrDis); BSDF bsdf(wi , _inter , scene); Real cosine , bsdfPdf; Color3 brdf = bsdf.f(scene , wo , cosine , &bsdfPdf); if (brdf.isBlack()) continue; pdf *= bsdfPdf; res = res + (tmp | brdf) * (cosine / pdf); } res = res / gatherSamples; return res; }
void Material::samplePhong(Isect &isect, const Vector3d &out, Vector3d &in, double &pdf) const { in = sampleCosHemisphere(isect.normal()); }