float PlasticBsdf::pdf(const SurfaceScatterEvent &event) const { if (event.wi.z() <= 0.0f || event.wo.z() <= 0.0f) return 0.0f; bool sampleR = event.requestedLobe.test(BsdfLobes::SpecularReflectionLobe); bool sampleT = event.requestedLobe.test(BsdfLobes::DiffuseReflectionLobe); if (sampleR && sampleT) { float Fi = Fresnel::dielectricReflectance(1.0f/_ior, event.wi.z()); float substrateWeight = _avgTransmittance*(1.0f - Fi); float specularWeight = Fi; float specularProbability = specularWeight/(specularWeight + substrateWeight); if (checkReflectionConstraint(event.wi, event.wo)) return specularProbability; else return SampleWarp::cosineHemispherePdf(event.wo)*(1.0f - specularProbability); } else if (sampleT) { return SampleWarp::cosineHemispherePdf(event.wo); } else if (sampleR) { return checkReflectionConstraint(event.wi, event.wo) ? 1.0f : 0.0f; } else { return 0.0f; } }
Vec3f PlasticBsdf::eval(const SurfaceScatterEvent &event) const { if (event.wi.z() <= 0.0f || event.wo.z() <= 0.0f) return Vec3f(0.0f); bool evalR = event.requestedLobe.test(BsdfLobes::SpecularReflectionLobe); bool evalT = event.requestedLobe.test(BsdfLobes::DiffuseReflectionLobe); float eta = 1.0f/_ior; float Fi = Fresnel::dielectricReflectance(eta, event.wi.z()); float Fo = Fresnel::dielectricReflectance(eta, event.wo.z()); if (evalR && checkReflectionConstraint(event.wi, event.wo)) { return Vec3f(Fi); } else if (evalT) { Vec3f diffuseAlbedo = albedo(event.info); Vec3f brdf = ((1.0f - Fi)*(1.0f - Fo)*eta*eta*event.wo.z()*INV_PI)* (diffuseAlbedo/(1.0f - diffuseAlbedo*_diffuseFresnel)); if (_scaledSigmaA.max() > 0.0f) brdf *= std::exp(_scaledSigmaA*(-1.0f/event.wo.z() - 1.0f/event.wi.z())); return brdf; } else { return Vec3f(0.0f); } }
float ThinSheetBsdf::pdf(const SurfaceScatterEvent &event) const { bool sampleR = event.requestedLobe.test(BsdfLobes::SpecularReflectionLobe); if (sampleR && checkReflectionConstraint(event.wi, event.wo)) return 1.0f; else return 0.0f; }
Vec3f ConductorBsdf::eval(const SurfaceScatterEvent &event) const { bool evalR = event.requestedLobe.test(BsdfLobes::SpecularReflectionLobe); if (evalR && checkReflectionConstraint(event.wi, event.wo)) return albedo(event.info)*Fresnel::conductorReflectance(_eta, _k, event.wi.z()); else return Vec3f(0.0f); }
bool ThinSheetBsdf::invert(WritablePathSampleGenerator &/*sampler*/, const SurfaceScatterEvent &event) const { bool sampleR = event.requestedLobe.test(BsdfLobes::SpecularReflectionLobe); return sampleR && checkReflectionConstraint(event.wi, event.wo); }
bool ConductorBsdf::invert(WritablePathSampleGenerator &/*sampler*/, const SurfaceScatterEvent &event) const { return checkReflectionConstraint(event.wi, event.wo); }