예제 #1
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);

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

            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);
        }
예제 #2
0
        public Integrator MakeIntegrator(PbrtOptions options)
        {
            Camera camera = MakeCamera(options);

            if (camera == null)
            {
                //Error("Unable to create camera");
                return(null);
            }

            Sampler sampler =
                PbrtApi.MakeSampler(SamplerName, SamplerParams, camera.Film);

            if (sampler == null)
            {
                //Error("Unable to create sampler.");
                return(null);
            }

            Integrator integrator = null;

            switch (IntegratorName)
            {
            case "whitted":
                integrator = WhittedIntegrator.Create(IntegratorParams, sampler, camera);
                break;

            //case "directlighting":
            //  integrator =
            //    CreateDirectLightingIntegrator(IntegratorParams, sampler, camera);
            //  break;
            //case "path":
            //  integrator = CreatePathIntegrator(IntegratorParams, sampler, camera);
            //  break;
            //case "volpath":
            //  integrator = CreateVolPathIntegrator(IntegratorParams, sampler, camera);
            //  break;
            //case "bdpt":
            //  integrator = CreateBDPTIntegrator(IntegratorParams, sampler, camera);
            //  break;
            //case "mlt":
            //  integrator = CreateMLTIntegrator(IntegratorParams, camera);
            //  break;
            //case "ambientocclusion":
            //  integrator = CreateAOIntegrator(IntegratorParams, sampler, camera);
            //  break;
            //case "sppm":
            //  integrator = CreateSPPMIntegrator(IntegratorParams, camera);
            //  break;
            default:
                //Error("Integrator \"%s\" unknown.", IntegratorName.c_str());
                return(null);
            }

            if (HasScatteringMedia && IntegratorName != "volpath" &&
                IntegratorName != "bdpt" && IntegratorName != "mlt")
            {
                //Warning(
                //    "Scene has scattering media but \"%s\" integrator doesn't support "
                //    "volume scattering. Consider using \"volpath\", \"bdpt\", or "
                //    "\"mlt\".", IntegratorName.c_str());
            }

            IntegratorParams.ReportUnused();
            // Warn if no light sources are defined
            if (!Lights.Any())
            {
                //Warning(
                //  "No light sources defined in scene; "
                //"rendering a black image.");
            }

            return(integrator);
        }