Example #1
0
    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
Example #2
0
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
Example #3
0
    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
Example #4
0
    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