void Gen_UniformHemisphere(BSDF* bsdf, const Vector3f& wo, Vector3f* wi, Float* pdf, Spectrum* f) { float u1 = rng.UniformFloat(); float u2 = rng.UniformFloat(); Vector3f wiL = UniformSampleHemisphere(Point2f(u1, u2)); *wi = bsdf->LocalToWorld(wiL); *pdf = UniformHemispherePdf(); *f = bsdf->f(wo, *wi); }
void Gen_UniformHemisphere(BSDF* bsdf, const Vector & wo, Vector* wi, float* pdf, Spectrum* f) { float u1 = rng.RandomFloat(); float u2 = rng.RandomFloat(); Vector wiL = UniformSampleHemisphere(u1, u2); *wi = bsdf->LocalToWorld(wiL); *pdf = UniformHemispherePdf(); *f = bsdf->f(wo, *wi); }
Spectrum BxDF::rho(int nSamples, const Point2f *u1, const Point2f *u2) const { Spectrum r(0.f); for (int i = 0; i < nSamples; ++i) { // Estimate one term of $\rho_\roman{hh}$ Vector3f wo, wi; wo = UniformSampleHemisphere(u1[i]); Float pdfo = UniformHemispherePdf(), pdfi = 0; Spectrum f = Sample_f(wo, &wi, u2[i], &pdfi); if (pdfi > 0) r += f * AbsCosTheta(wi) * AbsCosTheta(wo) / (pdfo * pdfi); } return r / (Pi * nSamples); }