예제 #1
0
        public void CapturesRadius()
        {
            var f = new MitchellFilter(new Vector2(2f), 0.5f, 0.25f);

            f.Radius.Should().Be(new Vector2(2f));
            f.InverseRadius.Should().Be(new Vector2(0.5f));
        }
예제 #2
0
        public void ValueAtOrigin()
        {
            var b      = 0.5f;
            var zero1D = (6f - 2 * b) * (1f / 6f);
            var f      = new MitchellFilter(new Vector2(2f), b, 0.25f);

            f.Evaluate(new Point2D(0f, 0f)).Should().BeApproximately(zero1D * zero1D, 0.0001f);
        }
예제 #3
0
        public void ValuesAtRadiusShouldBeZero()
        {
            var f = new MitchellFilter(new Vector2(2f), 0.5f, 0.25f);

            f.Evaluate(new Point2D(2f, 0f)).Should().BeApproximately(0f, 0.001f);
            f.Evaluate(new Point2D(0f, 2f)).Should().BeApproximately(0f, 0.001f);
            f.Evaluate(new Point2D(0f, -2f)).Should().BeApproximately(0f, 0.001f);
            f.Evaluate(new Point2D(System.MathF.Sqrt(2f), System.MathF.Sqrt(2f))).Should().BeApproximately(0f, 0.001f);
        }
예제 #4
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);
        }
public static ResamplingFilter Create(ResamplingFilters filter) {

  ResamplingFilter resamplingFilter = null;

  switch (filter) {
    case ResamplingFilters.Box:
      resamplingFilter = new BoxFilter();
      break;
    case ResamplingFilters.Triangle:
      resamplingFilter = new TriangleFilter();
      break;
    case ResamplingFilters.Hermite:
      resamplingFilter = new HermiteFilter();
      break;
    case ResamplingFilters.Bell:
      resamplingFilter = new BellFilter();
      break;
    case ResamplingFilters.CubicBSpline:
      resamplingFilter = new CubicBSplineFilter();
      break;
    case ResamplingFilters.Lanczos3:
      resamplingFilter = new Lanczos3Filter();
      break;
    case ResamplingFilters.Mitchell:
      resamplingFilter = new MitchellFilter();
      break;
    case ResamplingFilters.Cosine:
      resamplingFilter = new CosineFilter();
      break;
    case ResamplingFilters.CatmullRom:
      resamplingFilter = new CatmullRomFilter();
      break;
    case ResamplingFilters.Quadratic:
      resamplingFilter = new QuadraticFilter();
      break;
    case ResamplingFilters.QuadraticBSpline:
      resamplingFilter = new QuadraticBSplineFilter();
      break;
    case ResamplingFilters.CubicConvolution:
      resamplingFilter = new CubicConvolutionFilter();
      break;
    case ResamplingFilters.Lanczos8:
      resamplingFilter = new Lanczos8Filter();
      break;
  }

  return resamplingFilter;
}
예제 #6
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);
        }
예제 #7
0
        public void NegativeLobesNearRadiusExtent()
        {
            var f = new MitchellFilter(new Vector2(2f), 0.5f, 0.25f);

            f.Evaluate(new Point2D(1.8f, 0f)).Should().BeLessThan(0f);
        }
예제 #8
0
    public static ResamplingFilter Create(ResamplingFilters filter)
    {
        ResamplingFilter resamplingFilter = null;

        switch (filter)
        {
        case ResamplingFilters.Box:
            resamplingFilter = new BoxFilter();
            break;

        case ResamplingFilters.Triangle:
            resamplingFilter = new TriangleFilter();
            break;

        case ResamplingFilters.Hermite:
            resamplingFilter = new HermiteFilter();
            break;

        case ResamplingFilters.Bell:
            resamplingFilter = new BellFilter();
            break;

        case ResamplingFilters.CubicBSpline:
            resamplingFilter = new CubicBSplineFilter();
            break;

        case ResamplingFilters.Lanczos3:
            resamplingFilter = new Lanczos3Filter();
            break;

        case ResamplingFilters.Mitchell:
            resamplingFilter = new MitchellFilter();
            break;

        case ResamplingFilters.Cosine:
            resamplingFilter = new CosineFilter();
            break;

        case ResamplingFilters.CatmullRom:
            resamplingFilter = new CatmullRomFilter();
            break;

        case ResamplingFilters.Quadratic:
            resamplingFilter = new QuadraticFilter();
            break;

        case ResamplingFilters.QuadraticBSpline:
            resamplingFilter = new QuadraticBSplineFilter();
            break;

        case ResamplingFilters.CubicConvolution:
            resamplingFilter = new CubicConvolutionFilter();
            break;

        case ResamplingFilters.Lanczos8:
            resamplingFilter = new Lanczos8Filter();
            break;
        }

        return(resamplingFilter);
    }
예제 #9
0
        public static unsafe BitmapBase SizePos(BitmapBase source, double scaleWidth, double scaleHeight, int inX, int inY, int outX, int outY, int maxWidth = 0, int maxHeight = 0, Filter filter = null)
        {
            if (source.Width <= 0 || source.Height <= 0)
            {
                return(source.ToBitmapSame());
            }

            PixelRect pureImg = source.PreciseSize(0);

            if (pureImg.Width <= 0 || pureImg.Height <= 0)
            {
                return(source.ToBitmapSame());
            }

            int outWidth  = (int)Math.Round(pureImg.Width * scaleWidth);
            int outHeight = (int)Math.Round(pureImg.Height * scaleHeight);

            if (scaleWidth == 1 && scaleHeight == 1)
            {
                //no resize needed
                if (inX != outX || inY != outY)
                {
                    BitmapBase result;
                    if (maxWidth == 0 && maxHeight == 0)
                    {
                        result = new BitmapRam(outX - inX + source.Width, outY - inY + source.Height);
                    }
                    else
                    {
                        result = new BitmapRam(Math.Min(outX - inX + source.Width, maxWidth), Math.Min(outY - inY + source.Height, maxHeight));
                    }

                    result.DrawImage(source, outX - inX, outY - inY);
                    return(result);
                }
                else
                {
                    return(source.ToBitmapSame());
                }
            }

            if (filter == null)
            {
                if (scaleWidth < 1)
                {
                    filter = new LanczosFilter();
                }
                else
                {
                    filter = new MitchellFilter();
                }
            }

            int transparentOffset;

            if (pureImg.Left != 0 || pureImg.Top != 0)
            {
                transparentOffset = pureImg.Left * 4 + pureImg.Top * source.Stride;
                // Resample looks better if transprent pixels is cropped. Especially if the image is square
                // Data+DataOffset, pureImg.Width, pureImg.Height instead of Data, Width, Height works like left-top cropping
            }
            else
            {
                transparentOffset = 0;
            }

            BitmapBase afterHorzResample, afterVertResample;

            // Horizontal resampling
            if (scaleWidth == 1)
            {
                afterHorzResample = source;
            }
            else
            {
                afterHorzResample = new BitmapRam(outWidth, pureImg.Height);
                ContributorEntry[] contrib = filter.PrecomputeResample(scaleWidth, pureImg.Width, outWidth);
                Resample1D(afterHorzResample, source, transparentOffset, contrib, outWidth, pureImg.Height, true);
                transparentOffset = 0;
            }

            // Vertical resampling
            if (scaleHeight == 1)
            {
                afterVertResample = afterHorzResample;
            }
            else
            {
                afterVertResample = new BitmapRam(outWidth, outHeight);
                ContributorEntry[] contrib = filter.PrecomputeResample(scaleHeight, pureImg.Height, outHeight);
                Resample1D(afterVertResample, afterHorzResample, transparentOffset, contrib, outHeight, outWidth, false);
            }

            BitmapBase final;
            //At this point image will be resized and moved to another BitmapBase anyway
            int drawX = outX - (int)Math.Round((inX - pureImg.Left) * scaleWidth);
            int drawY = outY - (int)Math.Round((inY - pureImg.Top) * scaleHeight);

            if (maxWidth == 0 && maxHeight == 0)
            {
                final = new BitmapRam(Math.Max(drawX + outWidth, maxWidth), Math.Max(drawY + outHeight, maxHeight));
            }
            else
            {
                final = new BitmapRam(Math.Max(drawX + outWidth, maxWidth), Math.Max(drawY + outHeight, maxHeight));
            }
            final.DrawImage(afterVertResample, drawX, drawY);
            return(final);
        }