public virtual Spectrum rho(int nSamples, IEnumerable <Point2D> samples1, IEnumerable <Point2D> samples2) { var u1 = samples1.ToList(); var u2 = samples2.ToList(); Spectrum r = Spectrum.Create(0.0); for (int i = 0; i < nSamples; ++i) { // Estimate one term of $\rho_\roman{hh}$ Vector3D wo = Sampling.UniformSampleHemisphere(u1[i]); double pdfo = Sampling.UniformHemispherePdf(); Spectrum f = Sample_f(wo, out Vector3D wi, u2[i], out double pdfi, out BxdfType sampledType); if (pdfi > 0) { r += f * Reflection.AbsCosTheta(wi) * Reflection.AbsCosTheta(wo) / (pdfo * pdfi); } } return(r / (Math.PI * nSamples)); }