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)); }
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)); }
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); }
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)))); }
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)))); }
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 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))); }
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); }