Пример #1
0
        /// <inheritdoc />
        public override Spectrum Sample_Wi(
            Interaction it,
            Point2D u,
            out Vector3D wi,
            out double pdf,
            out Point2D pRaster,
            out VisibilityTester vis)
        {
            // Uniformly sample a lens interaction _lensIntr_
            Point2D     pLens      = LensRadius * Sampling.ConcentricSampleDisk(u);
            Point3D     pLensWorld = CameraToWorld.ExecuteTransform(it.Time, new Point3D(pLens.X, pLens.Y, 0.0));
            Interaction lensIntr   = new Interaction(pLensWorld, it.Time, new MediumInterface(Medium));

            lensIntr.N = (CameraToWorld.ExecuteTransform(it.Time, new Point3D(0.0, 0.0, 1.0))).ToVector3D().ToNormal3D();

            // Populate arguments and compute the importance value
            vis = new VisibilityTester(it, lensIntr);
            wi  = (lensIntr.P - it.P).ToVector3D();
            double dist = wi.Length();

            wi /= dist;

            // Compute PDF for importance arriving at _ref_

            // Compute lens area of perspective camera
            double lensArea = LensRadius != 0.0 ? (Math.PI * LensRadius * LensRadius) : 1.0;

            pdf = (dist * dist) / (lensIntr.N.AbsDot(wi) * lensArea);
            return(We(lensIntr.SpawnRay(-wi), out pRaster));
        }
Пример #2
0
        public override Spectrum Sample_Li(Interaction inter, Point2 <float> u, out Vector3 <float> wi, out float pdf, out VisibilityTester vis)
        {
            Interaction interShape = Shape.Sample(u);

            wi  = (interShape.P - inter.P).Normalized();
            pdf = Shape.Pdf(inter, wi);
            vis = new VisibilityTester(inter, interShape);
            return(L(interShape, -wi));
        }
Пример #3
0
        public override SampledSpectrum Sample(ref Vector3 point, Scene scene, out Vector3 incomingVector,
                                               out VisibilityTester visibilityTester)
        {
            var direction = point - Position;

            incomingVector   = direction.Normalized();
            visibilityTester = new VisibilityTester(Position, point, scene);
            return(Spectrum / direction.LengthSquared);
        }
Пример #4
0
        public override Spectrum Sample_Li(Interaction inter, Point2 <float> u, out Vector3 <float> wi, out float pdf, out VisibilityTester visTester)
        {
            var lightToPoint = position - inter.P;

            wi        = lightToPoint.Normalized();
            pdf       = 1.0f;
            visTester = new VisibilityTester(inter, new SurfaceInteraction(position));

            return(intensity / lightToPoint.LengthSquared());
        }
Пример #5
0
 public override Spectrum Sample_Li(Interaction reference,
                                    Point2D u,
                                    out Vector wi,
                                    out float pdf,
                                    out VisibilityTester visibility)
 {
     wi         = (_pLight - reference.P).Normalize();
     pdf        = 1f;
     visibility = new VisibilityTester(reference, new Interaction(_pLight, MediumInterface));
     return(_I * Falloff(-wi) / Point.DistanceSqr(_pLight, reference.P));
 }
Пример #6
0
        public override Spectrum Sample_Li(Interaction reference,
                                           Point2D u,
                                           out Vector wi,
                                           out float pdf,
                                           out VisibilityTester visibility)
        {
            wi         = (_pLight - reference.P).Normalize();
            pdf        = 1f;
            visibility = new VisibilityTester(reference, new Interaction(_pLight));
            var d2 = Point.DistanceSqr(_pLight, reference.P);

            return(I / d2);
        }
Пример #7
0
        public override SampledSpectrum Sample(ref Vector3 point, Scene scene, out Vector3 incomingVector,
                                               out VisibilityTester visibilityTester)
        {
            var r1 = StaticRandom.NextFloat() * 2 - 1;
            var r2 = StaticRandom.NextFloat() * 2 - 1;
            var pointInDiskLocal = new Vector3(r1 * _radius, 0, r2 * _radius);
            var pointInDiskWorld = ObjectToWorld.TransformPoint(ref pointInDiskLocal);

            incomingVector = point - pointInDiskWorld;
            var cosangle = Vector3.Dot(incomingVector.Normalized(), _normal);

            visibilityTester = new VisibilityTester(pointInDiskWorld, point, scene);
            return(Spectrum * cosangle / incomingVector.Length);
        }