Exemple #1
0
        public static SceneDescription IndirectLight()
        {
            // Single light source at the top
            var lights = new List <Light>()
            {
                new PointLight(Transform.Translate(0, 5, 0), new Spectrum(100))
            };

            var primitives = new List <Primitive>()
            {
                // Small object that should only receive indirect light
                // bouncing from the two side objects
                new GeometricPrimitive(new Sphere(Transform.Translate(0, -1.5f, 0), 0.5f), new PlasticMaterial(new Spectrum(10), new Spectrum(10), 0.01f)),

                // Big object between the light source and the small object
                new GeometricPrimitive(new Sphere(Transform.Identity, 1.0f), new PlasticMaterial(new Spectrum(1), new Spectrum(1), 0.1f)),

                // Side objects to reflect the light
                new GeometricPrimitive(new Sphere(Transform.Translate(-10, 0, 0), 6), new MatteMaterial(new Spectrum(1, 0, 0), 0)),
                new GeometricPrimitive(new Sphere(Transform.Translate(10, 0, 0), 6), new MatteMaterial(new Spectrum(0, 1, 0), 0)),
            };

            var camera = PerspectiveCamera.Create(new Point3 <float>(0, 0, -5), 100);

            return(new SceneDescription(new PrimitiveList(primitives), lights, camera));
        }
Exemple #2
0
        public static SceneDescription SpheresRoughness()
        {
            float[]    roughnesses = { 0.001f, 0.01f, 0.05f, 0.1f, 0.2f, 0.4f, 0.8f };
            Spectrum[] colors      = { new Spectrum(1, 0, 0), new Spectrum(0, 1, 0), new Spectrum(0, 0, 1) };

            var primitives = new List <Primitive>();

            for (var z = -1; z < 2; ++z)
            {
                for (var x = -3; x < 4; ++x)
                {
                    var material = new PlasticMaterial(colors[z + 1], new Spectrum(1), roughnesses[x + 3]);

                    primitives.Add(new GeometricPrimitive(new Sphere(Transform.Translate(x, 0, z), 0.25f), material));
                }
            }

            var lights = new List <Light>()
            {
                new PointLight(Transform.Translate(0, 10, -3), new Spectrum(100)),
                new PointLight(Transform.Translate(-5, -5, 0), new Spectrum(50))
            };

            //var camera = OrthographicCamera.Create(new Point3<float>(0, 3, -5), 8);
            var camera = PerspectiveCamera.Create(new Point3 <float>(0, 3, -4), 100);

            return(new SceneDescription(new PrimitiveList(primitives), lights, camera));
        }
Exemple #3
0
        public static Camera MakeCamera(
            string name,
            ParamSet paramSet,
            TransformSet cam2worldSet,
            double transformStart,
            double transformEnd,
            Film film)
        {
            Camera          camera          = null;
            MediumInterface mediumInterface = new MediumInterface(); // todo: implement graphicsState graphicsState.CreateMediumInterface();

            //static_assert(MaxTransforms == 2,
            //              "TransformCache assumes only two transforms");
            Transform[] cam2world = new Transform[]
            {
                // todo: implement transform cache
                //transformCache.Lookup(cam2worldSet[0]),
                //transformCache.Lookup(cam2worldSet[1])
                cam2worldSet[0],
                cam2worldSet[1]
            };

            AnimatedTransform animatedCam2World = new AnimatedTransform(
                cam2world[0],
                transformStart,
                cam2world[1],
                transformEnd);

            switch (name)
            {
            case "perspective":
                camera = PerspectiveCamera.Create(paramSet, animatedCam2World, film, mediumInterface.Outside);
                break;

            //case "orthographic":
            //  camera = CreateOrthographicCamera(paramSet, animatedCam2World, film, mediumInterface.Outside);
            //  break;
            //case "realistic":
            //  camera = CreateRealisticCamera(paramSet, animatedCam2World, film, mediumInterface.Outside);
            //  break;
            //case "environment":
            //  camera = CreateEnvironmentCamera(paramSet, animatedCam2World, film, mediumInterface.Outside);
            //  break;
            default:
                //Warning("Camera \"%s\" unknown.", name.c_str());
                break;
            }

            paramSet.ReportUnused();
            return(camera);
        }
Exemple #4
0
        public static SceneDescription Disk()
        {
            var primitives = new List <Primitive>()
            {
                new GeometricPrimitive(new Disk(Transform.Identity, 0.5f), new MatteMaterial(new Spectrum(1), 0))
            };

            var lights = new List <Light>()
            {
                new PointLight(Transform.Translate(0, 0, -5), new Spectrum(30))
            };

            return(new SceneDescription(new PrimitiveList(primitives), lights, PerspectiveCamera.Create(new Point3 <float>(0, 0, -1))));
        }
Exemple #5
0
        public static SceneDescription Spheres()
        {
            var primitives = new List <Primitive>()
            {
                new GeometricPrimitive(new Sphere(Transform.Identity, 0.5f), new MatteMaterial(new Spectrum(1), 0)),
                new GeometricPrimitive(new Sphere(Transform.Translate(-0.75f, 0.5f, 0.5f), 0.25f), new MatteMaterial(new Spectrum(1, 0, 0), 0)),
                new GeometricPrimitive(new Sphere(Transform.Translate(0.3f, 0.25f, -0.5f), 0.1f), new MatteMaterial(new Spectrum(0, 1, 0), 0))
            };

            var lights = new List <Light>()
            {
                new PointLight(Transform.Translate(2, 5, -2), new Spectrum(30)),
                new PointLight(Transform.Translate(0, -3, -3), new Spectrum(30))
            };

            return(new SceneDescription(new PrimitiveList(primitives), lights, PerspectiveCamera.Create(new Point3 <float>(0, 0, -1))));
        }
Exemple #6
0
        public static void TestRender(int spp, int height)
        {
            var aspectRatio = 1f;
            var width       = (int)(height * aspectRatio);
            var from        = new Point(278, 278, -800f);
            var to          = new Point(278, 278, 0);

            var fov = MathF.Deg(278f / 400f);

            //var transform = Transform.LookAt2(from, to, Vectors.Up);
            var transform = Transform.Translate(278, 278, -800);
            var dist      = Point.Distance(from, to);

            var filter = new MitchellFilter(new Vector2(2f, 2f), 0.5f, 0.25f);
            var film   = new Film(new PixelVector(width, height), new Bounds2D(0, 0, 1, 1), filter, 20f, 1f);
            var camera = PerspectiveCamera.Create(transform, aspectRatio, 0.8f, dist, fov, film);

            //var integrator = new AmbientOcclusionIntegrator(true, 64, camera,
            //                                                new HaltonSampler(spp, film.GetSampleBounds()),
            //                                                film.CroppedBounds);

            //var integrator = new DepthIntegrator(700f, 1000f, camera, new HaltonSampler(spp, film.GetSampleBounds()),
            //                                                film.CroppedBounds);

            //var integrator = new NormalIntegrator(camera, new HaltonSampler(spp, film.GetSampleBounds()),
            //                                                film.CroppedBounds);

            //var integrator = new WhittedIntegrator(5, camera, new HaltonSampler(spp, film.GetSampleBounds()),
            //                                       film.CroppedBounds);

            var integrator = new PathIntegrator(5, camera, new HaltonSampler(spp, film.GetSampleBounds()),
                                                film.CroppedBounds, 1f, LightSampleStrategy.Uniform);

            film.SetSink(new Sink(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "tri"));

            var scene = Build();

            Console.WriteLine("Rendering at {0}x{1}...", width, height);
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            integrator.Render(scene);
            stopwatch.Stop();
            Console.WriteLine("Done ({0})", stopwatch.Elapsed);
        }
Exemple #7
0
        public static SceneDescription LargeAreaLight()
        {
            var lightTransform = Transform.LookAt(new Point3 <float>(0.5f, 1.5f, 0), new Point3 <float>(0, 0, 0), new Vector3 <float>(0, 1, 0)).Inverse();
            var lightShape     = new Disk(lightTransform, 4);
            var light          = new DiffuseAreaLight(lightTransform, new Spectrum(5), lightShape, 1, true);

            var primitives = new List <Primitive>()
            {
                new GeometricPrimitive(new Disk(Transform.Translate(0, -1, 0) * Transform.RotateX(90), 1.5f), new MatteMaterial(new Spectrum(1), 0)),

                new GeometricPrimitive(new Sphere(Transform.Translate(-0.75f, -0.5f, 0), 0.25f), new MatteMaterial(new Spectrum(1, 0, 0), 0)),
                new GeometricPrimitive(new Sphere(Transform.Translate(0, -0.25f, 0), 0.25f), new MatteMaterial(new Spectrum(0, 1, 0), 0)),
                new GeometricPrimitive(new Sphere(Transform.Translate(0.75f, 0, 0), 0.25f), new MatteMaterial(new Spectrum(1, 1, 0), 0)),

                new GeometricPrimitive(lightShape, new MatteMaterial(new Spectrum(1), 0), light)
            };

            var lights = new List <Light>()
            {
                light
            };

            return(new SceneDescription(new PrimitiveList(primitives), lights, PerspectiveCamera.Create(new Point3 <float>(0, 1, -1), 100)));
        }
Exemple #8
0
        public static void RowTestByDelegate(int spp, string fileSuffix, Func <float, int, IMaterial> materialFunc)
        {
            var dx    = 3.65f;
            var nX    = 11;
            var delta = 1f / (nX - 1);
            var prims = new List <IPrimitive>();

            for (var x = 0; x < nX; x++)
            {
                var s1t = Transform.Translate(x * dx, 0, 0);
                var s1  = new Sphere(s1t, Transform.Invert(s1t), false, 1.5f, -1.5f, 1.5f, 360);
                var s1g = new GeometricPrimitive(s1, materialFunc(delta * x, x + 1), null);
                prims.Add(s1g);
            }

            var slt = Transform.Translate(5, 2, -4);
            var slg = new Sphere(slt, Transform.Invert(slt), false, 0.5f, -0.5f, 0.5f, 360);
            var ls  = Spectrum.FromBlackbodyT(7500);
            var dl  = new DiffuseAreaLight(slt, null, ls * 100, 20, slg);
            var sg  = new GeometricPrimitive(slg, new MatteMaterial(new ConstantTexture <Spectrum>(ls), new ConstantTexture <float>(0f), null), dl);

            prims.Add(sg);

            var bvh = new BVH(prims.ToArray(), SplitMethod.HLBVH);

            var mid = bvh.WorldBounds.Centroid;

            var width  = 1200;
            var height = 140;
            var from   = new Point(mid.X, 6f, -12f);
            var to     = mid;

            var fov         = 5.6f;
            var aspectRatio = (float)width / height;

            var transform = Transform.Translate(mid.X, 0f, -50f);
            var dist      = Point.Distance(from, to);
            var filter    = new MitchellFilter(new Vector2(2.5f, 2.5f), 0.7f, 0.15f);
            var film      = new Film(new PixelVector(width, height), new Bounds2D(0, 0, 1, 1), filter, 20f, 1f);
            var camera    = PerspectiveCamera.Create(transform, aspectRatio, 0.0f, dist, fov, film);

            //var integrator = new WhittedIntegrator(4, camera, new HaltonSampler(spp, film.GetSampleBounds()),
            //                                       film.CroppedBounds);

            var integrator = new PathIntegrator(3, camera, new HaltonSampler(spp, film.GetSampleBounds()),
                                                film.CroppedBounds, 6f, LightSampleStrategy.Spatial);

            film.SetSink(new Sink(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "row_" + fileSuffix));

            var lt  = Transform.Translate(mid.X - 60, 200, -80);
            var s   = Spectrum.FromBlackbodyT(4500) * 100000f;
            var pl1 = new PointLight(lt, null, s);

            lt = Transform.Translate(mid.X + 100, 100, -200);
            s  = Spectrum.FromBlackbodyT(2200) * 50000f;
            var pl2 = new PointLight(lt, null, s);

            lt = Transform.Translate(mid.X, 1000f, 0);
            s  = Spectrum.FromBlackbodyT(7000) * 5f;
            var pl3 = new DistantLight(lt, s, new Vector(0, -0.5f, 1));

            lt = Transform.Translate(mid.X, 10, -300);
            s  = Spectrum.FromBlackbodyT(5500) * 100000f;
            var pl4 = new PointLight(lt, null, s);

            var splt = Transform.RotateX(MathF.Rad(18f)).RotateY(MathF.Rad(75)).Translate(0, 10, -8);

            s = Spectrum.FromBlackbodyT(5500) * 100000f;
            var sl = new SpotLight(splt, null, s, 5f, 2f);

            var scene = new Scene(bvh, new ILight[] { pl1, pl2, pl3, pl4, dl, sl });

            //var scene = new Scene(bvh, new ILight[] { dl });

            Console.WriteLine("Rendering at {0}x{1}...", width, height);
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            integrator.Render(scene);
            stopwatch.Stop();
            Console.WriteLine("Done ({0})", stopwatch.Elapsed);
        }