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)); }
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); }
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); }
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; }
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); }
public void NegativeLobesNearRadiusExtent() { var f = new MitchellFilter(new Vector2(2f), 0.5f, 0.25f); f.Evaluate(new Point2D(1.8f, 0f)).Should().BeLessThan(0f); }
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); }
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); }