예제 #1
0
    def Li(self, scene: Scene, renderer: Renderer, ray: Ray, intersection: Intersection, sample: Sample) -> Spectrum:
        L = Spectrum(0.0)
        wo = -ray.direction

        bsdf = intersection.get_bsdf(ray)

        # Compute emitted light if ray hit an area light source
        L += intersection.Le(wo)

        if len(scene.lights) > 0:
            if self.strategy == LightStrategy.SAMPLE_ALL_UNIFORM:
                L += UniformSampleAllLights(scene, renderer, intersection.differentialGeometry.point,
                                            intersection.differentialGeometry.normal, wo,
                                            ray.time, bsdf, sample, self.lightSampleOffsets, self.bsdfSampleOffsets)
            elif self.strategy == LightStrategy.SAMPLE_ONE_UNIFORM:
                L += UniformSampleOneLight(scene, renderer, intersection.differentialGeometry.point,
                                           intersection.differentialGeometry.normal, wo,
                                           ray.time, bsdf, sample, self.lightSampleOffsets, self.bsdfSampleOffsets,
                                           self.lightNumOffset)
        return L
    def Li(self, scene: Scene, renderer: Renderer, ray: Ray, intersection: Intersection, sample: Sample)->Spectrum:

        occlusion = 0
        intersection.ray_epsilon = infinity_max_f

        bsdf = intersection.get_bsdf(ray)
        p = bsdf.dgShading.point

        n = maths.tools.get_face_forward(intersection.differentialGeometry.normal, -ray.direction)

        for i in range(self.samples_count):
            w = maths.tools.get_uniform_sample_sphere(random(), random())

            if Vector3d.dot(w, n) < 0.0:
                w = -w

            r = Ray(p, w, 0.01, self.max_distance)
            if scene.get_is_intersected(r):
                occlusion += 1

        return Spectrum(1.0-(float(occlusion) / float(self.samples_count)))