def get_bsdf(self, dgGeom: DifferentialGeometry, dgShading: DifferentialGeometry) -> [BSDF]: dgs = DifferentialGeometry() if self.bumpMap is None: dgs = dgShading else: # todo Bump(bumpMap, dgGeom, dgShading, &dgs); pass bsdf = BSDF(dgs, dgGeom.normal) r = self.Kr.get_evaluate(dgs).get_clamp() if not r.get_is_black(): bsdf.add(SpecularReflection(r, FresnelNoOp())) return bsdf
def EstimateDirect(scene: Scene, renderer: Renderer, light: Light, p: Point3d, n: Normal, wo: Vector3d, time: float, bsdf: BSDF, lightSample: LightSample, bsdfSample: BSDFSample, BxDFTypeFlag: int) -> Spectrum: Ld = Spectrum(0.0) visibility = VisibilityTester() wi, Li, lightPdf = light.Sample_L1(p, lightSample, time, visibility) if lightPdf > 0.0 and not Li.get_is_black(): f = bsdf.f(wo, wi, BxDFTypeFlag) if not f.get_is_black() and visibility.Unoccluded(scene): # Add light's contribution to reflected radiance #Li *= visibility.Transmittance(scene, renderer, None) inv_lightPdf = 1.0 / lightPdf if light.get_is_delta_light(): Ld += f * Li * math.fabs(Vector3d.dot(wi, n)) * inv_lightPdf else: bsdfPdf = bsdf.get_Pdf(wo, wi, BxDFTypeFlag) weight = PowerHeuristic(1, lightPdf, 1, bsdfPdf) Ld += f * Li * math.fabs(Vector3d.dot(wi, n)) * weight * inv_lightPdf # Sample BSDF with multiple importance sampling if not light.get_is_delta_light(): wi, bsdfPdf, sampledType, f = bsdf.Sample_f(wo, bsdfSample, BxDFTypeFlag) if not f.get_is_black() and bsdfPdf > 0.0: weight = 1.0 if not (BxDFTypeFlag & BxDFType.BSDF_SPECULAR): lightPdf = light.get_pdf(p, wi) if lightPdf == 0.0: return Ld weight = PowerHeuristic(1, bsdfPdf, 1, lightPdf) # Add light contribution from BSDF sampling lightIsect = Intersection() Li = Spectrum(0.0) ray = Ray(p, wi, 1e-3, infinity_max_f, time) if scene.get_intersection(ray, lightIsect): if lightIsect.primitive.GetAreaLight() == light: Li = lightIsect.Le(-wi) else: Li = light.Le(ray) if not Li.get_is_black(): Li *= 1.0 #todo renderer.Transmittance(scene, ray, None) Ld += f * Li * math.fabs(Vector3d.dot(wi, n)) * weight / bsdfPdf return Ld
def get_bsdf(self, dgGeom: DifferentialGeometry, dgShading: DifferentialGeometry)->[BSDF]: dgs = DifferentialGeometry() if self.bumpMap is None: dgs = dgShading else: #todo Bump(bumpMap, dgGeom, dgShading, &dgs); pass bsdf = BSDF(dgs, dgGeom.normal) r = self.Kd.get_evaluate(dgs).get_clamp() sig = get_clamp(self.sigma.get_evaluate(dgs), 0.0, 90.0) if r.get_is_black(): bsdf.add(OrenNayar(r,sig)) else: bsdf.add(Lambertian(r)) return bsdf
def get_bsdf(self, dgGeom: DifferentialGeometry, dgShading: DifferentialGeometry)->[BSDF]: dgs = DifferentialGeometry() if self.bumpMap is None: dgs = dgShading else: #todo Bump(bumpMap, dgGeom, dgShading, &dgs); pass bsdf = BSDF(dgs, dgGeom.normal) kd = self.Kd.get_evaluate(dgs).get_clamp() if not kd.get_is_black(): diff = Lambertian(kd) bsdf.add(diff) ks = self.Ks.get_evaluate(dgs).get_clamp() if not ks.get_is_black(): fresnel = FresnelDielectric(1.5, 1.0) rough = self.roughness.get_evaluate(dgs) spec = Microfacet(ks, fresnel, Blinn(1.0 / rough)) bsdf.add(spec) return bsdf