private void InitScene() { int width = 2000; int height = 1000; bool isSky = true; Vector3D lookFrom = new Vector3D(13, 2, 3); Vector3D lookAt = new Vector3D(0, 0, 0); float diskToFocus = (lookFrom - lookAt).Length(); float aperture = 0; Camera camera = new Camera(lookFrom, lookAt, new Vector3D(0, 1, 0), 20, (float)width / (float)height, aperture, 0.7f * diskToFocus, 0, 1); Texture checker = new CheckerTexture( new ConstantTexture(new Vector3D(0.2f, 0.3f, 0.1f)), new ConstantTexture(new Vector3D(0.9f, 0.9f, 0.9f))); List <Hitable> list = new List <Hitable>(); list.Add(new Sphere(new Vector3D(0, -1000, 0), 1000, new Lambertian(checker))); for (int a = -11; a < 11; a++) { for (int b = -11; b < 11; b++) { double chooseMat = Mathf.Randomfloat(); Vector3D center = new Vector3D(a + 0.9f * Mathf.Randomfloat(), 0.2f, b + 0.9f * Mathf.Randomfloat()); if ((center - new Vector3D(4, 0.2f, 0)).Length() > 0.9) { if (chooseMat < 0.8) { list.Add(new MovingSphere(center, center + new Vector3D(0, 0.5f * Mathf.Randomfloat(), 0), 0, 1, 0.2f, new Lambertian(new ConstantTexture(new Vector3D( Mathf.Randomfloat() * Mathf.Randomfloat(), Mathf.Randomfloat() * Mathf.Randomfloat(), Mathf.Randomfloat() * Mathf.Randomfloat()))))); } else if (chooseMat < 0.95) { list.Add(new Sphere(center, 0.2f, new Metal(new Vector3D( 0.5f * (1 + Mathf.Randomfloat()), 0.5f * (1 + Mathf.Randomfloat()), 0.5f * (1 + Mathf.Randomfloat())), 0.5f * (1 + Mathf.Randomfloat())))); } else { list.Add(new Sphere(center, 0.2f, new Dielectric(1.5f))); } } } } list.Add(new Sphere(new Vector3D(0, 1, 0), 1, new Dielectric(1.5f))); list.Add(new Sphere(new Vector3D(-4, 1, 0), 1, new Lambertian(new ConstantTexture(new Vector3D(0.4f, 0.2f, 0.1f))))); list.Add(new Sphere(new Vector3D(4, 1, 0), 1, new Metal(new Vector3D(0.7f, 0.6f, 0.5f), 0))); BVHNode bb = new BVHNode(list, list.Count, 0, 1); HitableList world = new HitableList(); world.list.Add(bb); scene = new Scene(width, height, world, isSky, camera, 0, false); }
public void RepeatsInX() { var texture = new CheckerTexture(Colors.White, Colors.Black); texture.LocalColorAt(new Point(0, 0, 0)).Should().Be(Colors.White); texture.LocalColorAt(new Point(0.99f, 0, 0)).Should().Be(Colors.White); texture.LocalColorAt(new Point(1.01f, 0, 0)).Should().Be(Colors.Black); texture.LocalColorAt(new Point(2.01f, 0, 0)).Should().Be(Colors.White); }
static public Shader create_some_setup_shader() { var some_setup = new Shader(Client, Shader.ShaderType.Material) { Name = "some_setup ", UseMis = false, UseTransparentShadow = true, HeterogeneousVolume = false }; var brick_texture = new BrickTexture(); brick_texture.ins.Vector.Value = new float4(0.000f, 0.000f, 0.000f); brick_texture.ins.Color1.Value = new float4(0.800f, 0.800f, 0.800f); brick_texture.ins.Color2.Value = new float4(0.200f, 0.200f, 0.200f); brick_texture.ins.Mortar.Value = new float4(0.000f, 0.000f, 0.000f); brick_texture.ins.Scale.Value = 1.000f; brick_texture.ins.MortarSize.Value = 0.020f; brick_texture.ins.Bias.Value = 0.000f; brick_texture.ins.BrickWidth.Value = 0.500f; brick_texture.ins.RowHeight.Value = 0.250f; var checker_texture = new CheckerTexture(); checker_texture.ins.Vector.Value = new float4(0.000f, 0.000f, 0.000f); checker_texture.ins.Color1.Value = new float4(0.000f, 0.004f, 0.800f); checker_texture.ins.Color2.Value = new float4(0.200f, 0.000f, 0.007f); checker_texture.ins.Scale.Value = 5.000f; var diffuse_bsdf = new DiffuseBsdfNode(); diffuse_bsdf.ins.Color.Value = new float4(0.800f, 0.800f, 0.800f); diffuse_bsdf.ins.Roughness.Value = 0.000f; diffuse_bsdf.ins.Normal.Value = new float4(0.000f, 0.000f, 0.000f); var texture_coordinate = new TextureCoordinateNode(); some_setup.AddNode(brick_texture); some_setup.AddNode(checker_texture); some_setup.AddNode(diffuse_bsdf); some_setup.AddNode(texture_coordinate); brick_texture.outs.Color.Connect(diffuse_bsdf.ins.Color); checker_texture.outs.Color.Connect(brick_texture.ins.Mortar); texture_coordinate.outs.Normal.Connect(checker_texture.ins.Vector); texture_coordinate.outs.UV.Connect(brick_texture.ins.Vector); diffuse_bsdf.outs.BSDF.Connect(some_setup.Output.ins.Surface); some_setup.FinalizeGraph(); return(some_setup); }
private HitableList TwoSpheres() { List <IHitable> list = new List <IHitable>(); Texture checker = new CheckerTexture( new ConstantTexture(new Vector3D(0.2, 0.3, 0.1)), new ConstantTexture(new Vector3D(0.9, 0.9, 0.9))); list.Add(new Sphere(new Vector3D(0, -10, 0), 10, new Lambertian(checker))); list.Add(new Sphere(new Vector3D(0, 10, 0), 10, new Lambertian(checker))); return(new HitableList(list, list.Count)); }
public static List <Hitable> MakeSphereScene(ContentManager content, int sceneComplexity) { var list = new List <Hitable>(); list.Add(new Sphere(new Vector3(0, -1000, 0), 1000, new MetalMaterial(new CheckerTexture(), 0.2f))); var temp = new Vector3(4, 0.2f, 0); for (var a = -sceneComplexity; a < sceneComplexity; a++) { for (var b = -sceneComplexity; b < sceneComplexity; b++) { var chooseMat = Random.Value; var center = new Vector3(a + 0.9f + Random.Value, 0.2f, b + 0.9f + Random.Value); if ((center - temp).Length() > 0.9f) { if (chooseMat < 0.8f) { list.Add(new Sphere(center, 0.2f, new LambertMaterial(Random.Value, Random.Value, Random.Value))); } else if (chooseMat < 0.95f) { list.Add(new Sphere(center, 0.2f, new MetalMaterial(0.5f * (1 + Random.Value), 0.5f * (1 + Random.Value), 0.5f * (1 + Random.Value), 0.5f * Random.Value))); } else { list.Add(new Sphere(center, 0.2f, new MetalMaterial(0.5f * (1 + Random.Value), 0.5f * (1 + Random.Value), 0.5f * (1 + Random.Value), 0.5f * Random.Value))); } } } } var earthTexture = content.Load <Texture2D>("earth"); var amigaTexture = new CheckerTexture(new ConstantTexture(new Color(0.9f, 0.0f, 0.0f)), new ConstantTexture(new Color(0.9f, 0.9f, 0.9f))); var amigaEmissiveTexture = new CheckerTexture(new ConstantTexture(Color.Red), new ConstantTexture(Color.Black)); if (sceneComplexity > 0) { list.Add(new Sphere(new Vector3(0, 1, -2), 1, new LambertMaterial(new ImageTexture(earthTexture)))); list.Add(new Sphere(new Vector3(-4, 1, 0), 1, new LambertMaterial(amigaTexture, amigaEmissiveTexture))); list.Add(new Sphere(new Vector3(4, 1, 0), 1, new MetalMaterial(0.7f, 0.6f, 0.5f, 0.0f))); list.Add(new Cube(new Vector3(0, 0, 2), new Vector3(1, 1, 3), new LambertMaterial(amigaTexture))); } /*var skin_adventurer = content.Load<Texture2D>("skin_adventurer"); * list.Add(new Mesh(content.Load<Model>("basicCharacter"), new MetalMaterial(0, 0, 0, 0), 0.1f));*/ return(list); }
public static (List <IHitable>, Camera) RandomScene(ImSoRandom rnd, int nx, int ny) { var world = new List <IHitable>(); var texture = new CheckerTexture(new ConstantTexture(0.2f, 0.3f, 0.1f), new ConstantTexture(0.9f, 0.9f, 0.9f)); world.Add(new Sphere(new Vector3(0, -1000f, 0), 1000, new Lambertian(texture))); for (int a = -11; a < 11; a++) { for (int b = -11; b < 11; b++) { float choose_mat = rnd.NextFloat(); var center = new Vector3(a + 0.9f * rnd.NextFloat(), 0.2f, b + 0.9f * rnd.NextFloat()); if ((center - new Vector3(4, 0.2f, 0)).Length() > 0.9) { if (choose_mat < 0.8) { // diffuse world.Add(new MovingSphere(center, center + new Vector3(0, 0.5f * rnd.NextFloat(), 0), 0.0f, 1.0f, 0.2f, new Lambertian(new ConstantTexture(rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat())))); //world.Add(new Sphere(center, 0.2f, new Lambertian(new Vector3(rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat())))); } else if (choose_mat < 0.95) { // metal world.Add(new Sphere(center, 0.2f, new Metal(new Vector3(0.5f * (1 + rnd.NextFloat()), 0.5f * (1 + rnd.NextFloat()), 0.5f * (1 + rnd.NextFloat())), 0.5f * rnd.NextFloat()))); } else { // glass world.Add(new Sphere(center, 0.2f, new Dialectric(1.5f))); } } } } world.Add(new Sphere(new Vector3(0, 1, 0), 1.0f, new Dialectric(1.5f))); world.Add(new Sphere(new Vector3(-4, 1, 0), 1.0f, new Lambertian(new ConstantTexture(0.4f, 0.2f, 0.1f)))); world.Add(new Sphere(new Vector3(4, 1, 0), 1.0f, new Metal(new Vector3(0.7f, 0.6f, 0.5f), 0f))); world.Add(new Sphere(new Vector3(0, 0, 0), 20.0f, new DiffuseLight(new ConstantTexture(new Vector3(1, 1, 1))))); var lookFrom = new Vector3(13, 2, 3); var lookAt = new Vector3(0, 0, 0); var distToFocus = 10; var aperture = 0.1f; var cam = new Camera(lookFrom, lookAt, new Vector3(0, 1, 0), 20, (float)nx / (float)ny, aperture, distToFocus, 0.0f, 1.0f); return(world, cam); }
private HitableList RandomScene() { List <IHitable> list = new List <IHitable>(); Texture checker = new CheckerTexture( new ConstantTexture(new Vector3D(0.2, 0.3, 0.1)), new ConstantTexture(new Vector3D(0.9, 0.9, 0.9))); list.Add(new Sphere(new Vector3D(0, -1000, 0), 1000, new Lambertian(checker))); for (int a = -11; a < 11; a++) { for (int b = -11; b < 11; b++) { double chooseMat = RandomDouble(); Vector3D center = new Vector3D(a + 0.9 * RandomDouble(), 0.2, b + 0.9 * RandomDouble()); if ((center - new Vector3D(4, 0.2, 0)).Length() > 0.9) { if (chooseMat < 0.8) { list.Add(new MovingSphere(center, center + new Vector3D(0, 0.5 * RandomDouble(), 0), 0, 1, 0.2, new Lambertian(new ConstantTexture(new Vector3D( RandomDouble() * RandomDouble(), RandomDouble() * RandomDouble(), RandomDouble() * RandomDouble()))))); } else if (chooseMat < 0.95) { list.Add(new Sphere(center, 0.2, new Metal(new ConstantTexture(new Vector3D( 0.5 * (1 + RandomDouble()), 0.5 * (1 + RandomDouble()), 0.5 * (1 + RandomDouble()))), 0.5 * (1 + RandomDouble())))); } else { list.Add(new Sphere(center, 0.2, new Dielectric(1.5))); } } } } list.Add(new Sphere(new Vector3D(0, 1, 0), 1, new Dielectric(1.5))); list.Add(new Sphere(new Vector3D(-4, 1, 0), 1, new Lambertian( new ConstantTexture(new Vector3D(0.4, 0.2, 0.1))))); list.Add(new Sphere(new Vector3D(4, 1, 0), 1, new Metal( new ConstantTexture(new Vector3D(0.7, 0.6, 0.5)), 0))); return(new HitableList(list, list.Count)); }
public CheckerTextureScene(double aspect) { var checker_texture = CheckerTexture.Create(0.2, 0.3, 0.2, 0.9, 0.9, 0.9); IHitable[] hitables = { new Sphere(Vec3.Create(0, -10, 0), 10, new Lambertian(checker_texture)), new Sphere(Vec3.Create(0, 10, 0), 10, new Lambertian(checker_texture)) }; World = new BVHNode(hitables, 0, 1); var lookFrom = Vec3.Create(13, 2, 3); var lookAt = Vec3.Create(0, 0, 0); double dist_to_focus = 10; double aderpture = 0; Camera = Camera.CreateLookAt(lookFrom, lookAt, Vec3.Create(0, 1, 0), 20, aspect, aderpture, dist_to_focus); }
public CoverSceneRT1Motion(double aspect) { var sampler = new Random(); List <IHitable> hitables = new List <IHitable>(); hitables.Add(new Sphere(Vec3.Create(0, -1000, 0), 1000, new Lambertian(CheckerTexture.Create(0.2, 0.3, 0.1, 0.9, 0.9, 0.9)))); for (int a = -11; a < 11; ++a) { for (int b = -11; b < 11; ++b) { double choos_mat = sampler.NextDouble(); Vec3 center = Vec3.Create(a + 0.9 * sampler.NextDouble(), 0.2, b + 0.9 * sampler.NextDouble()); if ((center - Vec3.Create(4, 0.2, 0)).Length > 0.9) { if (choos_mat < 0.8) // diffuse { hitables.Add(new MovingSphere(center, center + Vec3.Create(0, 0.5, 0) * sampler.NextDouble(), 0, 1, 0.2, new Lambertian(ConstantTexture.Create(sampler.NextDouble() * sampler.NextDouble(), sampler.NextDouble() * sampler.NextDouble(), sampler.NextDouble() * sampler.NextDouble())))); } else if (choos_mat < 0.9) // metal { hitables.Add(new Sphere(center, 0.2, new Metal(ConstantTexture.Create(0.5 * (1 + sampler.NextDouble()), 0.5 * (1 + sampler.NextDouble()), 0.5 * (1 + sampler.NextDouble())), 0.5 * sampler.NextDouble()))); } else // glass { hitables.Add(new Sphere(center, 0.2, new Dielectric(1.5))); } } } } hitables.Add(new Sphere(Vec3.Create(0, 1, 0), 1, new Dielectric(1.5))); hitables.Add(new Sphere(Vec3.Create(-4, 1, 0), 1, new Lambertian(ConstantTexture.Create(0.4, 0.2, 0.1)))); hitables.Add(new Sphere(Vec3.Create(4, 1, 0), 1, new Metal(ConstantTexture.Create(0.7, 0.6, 0.5), 0))); double time0 = 0; double time1 = 1; World = new BVHNode(hitables.ToArray(), time0, time1); var lookFrom = Vec3.Create(12, 2, 3); var lookAt = Vec3.Create(0, 0, 0); double dist_to_focus = 10; double aderpture = 0.1; Camera = Camera.CreateLookAt(lookFrom, lookAt, Vec3.Create(0, 1, 0), 20, aspect, aderpture, dist_to_focus, time0, time1); }
public List <IHittable> Generate() { var world = new List <IHittable>(); var checker = new CheckerTexture(new Vec3(0.2, 0.3, 0.1), new Vec3(0.9, 0.9, 0.9)); world.Add(new Sphere { Material = new Lambertian(checker), Center = new Vec3(0, -10, 0), Radius = 10 }); world.Add(new Sphere { Material = new Lambertian(checker), Center = new Vec3(0, 10, 0), Radius = 10 }); return(world); }
internal static IHitTarget GenerateRandomBvhScene() { var rng = new Random(); var returnList = new List <IHitTarget>(); var checkerTexture = new CheckerTexture(new ConstantTexture(new Color(0.2, 0.3, 0.1)), new ConstantTexture(new Color(0.9, 0.9, 0.9))); var perlinTexture = new NoiseTexture(new Color(1, 1, 1), 10.0, NoiseTypes.TURBULENCE); returnList.Add(new Sphere(new Vec3(0, -1000, 0), 1000, new Lambertian(perlinTexture))); for (var i = -11; i < 11; ++i) { for (var j = -11; j < 11; ++j) { var materialPicker = rng.NextDouble(); var center = new Vec3(i + 0.9 * rng.NextDouble(), 0.2, j + 0.9 * rng.NextDouble()); if (!((center - new Vec3(4, 0.2, 0)).GetLength() > 0.9)) { continue; } if (materialPicker < 0.7) { returnList.Add(new Sphere(center, 0.2, new Lambertian(new ConstantTexture(new Color(rng.NextDouble() * rng.NextDouble(), rng.NextDouble() * rng.NextDouble(), rng.NextDouble() * rng.NextDouble()))))); } else if (materialPicker < 0.8) { returnList.Add(new Sphere(center, 0.2, new Glossy(new Color(0.5 * (1 + rng.NextDouble()), 0.5 * (1 + rng.NextDouble()), 0.5 * (1 + rng.NextDouble())), 0.5 * rng.NextDouble()))); } else { returnList.Add(new Sphere(center, 0.2, new Dielectric(new Color(1, 1, 1), 1.5))); } } } returnList.Add(new Sphere(new Vec3(0, 1, 0), 1.0, new Dielectric(new Color(1, 1, 1), 1.5))); returnList.Add(new Sphere(new Vec3(-4, 1, 0), 1.0, new Lambertian(new ConstantTexture(new Color(0.4, 0.2, 0.1))))); returnList.Add(new Sphere(new Vec3(4, 1, 0), 1.0, new Glossy(new Color(0.7, 0.6, 0.5), 0.05))); return(new BvhNode(returnList, 0.0, 1.0)); }
public override Hitable GetObjects() { List <Hitable> list = new List <Hitable>(); var checker = new CheckerTexture(new ConstantTexture(new Vec3(0.2, 0.3, 0.1)), new ConstantTexture(new Vec3(0.9, 0.9, 0.9))); list.Add(new Sphere(new Vec3(0.0, -1000.0, 0.0), 1000, new Lambertian(checker))); for (int a = -11; a < 11; a++) { for (int b = -11; b < 11; b++) { double chooseMaterial = FastRandom.RandomDouble(); Vec3 center = new Vec3(a + 0.9 * FastRandom.RandomDouble(), 0.2, b + 0.9 * FastRandom.RandomDouble()); if ((center - new Vec3(4.0, 0.2, 0.0)).Length() > 0.9) { if (chooseMaterial < 0.8) // diffuse { list.Add(new MovingSphere(center, center + new Vec3(0.0, 0.5 * FastRandom.RandomDouble(), 0.0), 0.0, 1.0, 0.2, new Lambertian(new ConstantTexture(new Vec3(FastRandom.RandomDouble() * FastRandom.RandomDouble(), FastRandom.RandomDouble() * FastRandom.RandomDouble(), (FastRandom.RandomDouble() * FastRandom.RandomDouble())))))); } else if (chooseMaterial < 0.95) // metal { list.Add(new Sphere(center, 0.2, new Metal(new Vec3(0.5 * (1.0 + FastRandom.RandomDouble()), 0.5 * (1.0 + FastRandom.RandomDouble()), 0.5 * (1.0 + FastRandom.RandomDouble())), 0.5 * FastRandom.RandomDouble()))); } else // dielectric { list.Add(new Sphere(center, 0.2, new Dielectric(1.5))); } } } } list.Add(new Sphere(new Vec3(0.0, 1.0, 0.0), 1.0, new Dielectric(1.5))); list.Add(new Sphere(new Vec3(-4.0, 1.0, 0.0), 1.0, new Lambertian(new ConstantTexture(new Vec3(0.4, 0.2, 0.1))))); list.Add(new Sphere(new Vec3(4.0, 1.0, 0.0), 1.0, new Metal(new Vec3(0.7, 0.6, 0.5), 0.0))); return((Hitable) new BvhNode(list, 0.0, 1.0)); }
/// <summary> /// Scene from pdf 2, texture; two checker balls touching. /// </summary> private void CreateScene3() { // Set up camera this.hFovDeg = 25; var lookFrom = new Vec3(13, 2, 3); var lookAt = new Vec3(0, 0, 0); var lookUp = new Vec3(0, 1, 0); float focusDist = 10; float aperture = 0; this.camera = new CartesianCamera(this.rows, this.columns, this.hFovDeg, lookFrom, lookAt, lookUp, aperture, focusDist); // Add items var hitables = new List <Hitable>(); var oddTexture = new ConstantTexture(new Vec3(0.2f, 0.3f, 0.1f)); var evenTexture = new ConstantTexture(new Vec3(0.9f, 0.9f, 0.9f)); var checkerTexture = new CheckerTexture(evenTexture, oddTexture); hitables.Add(new Sphere(new Vec3(0, -10, 0), 10, new Lambertian(checkerTexture))); hitables.Add(new Sphere(new Vec3(0, 10, 0), 10, new Lambertian(checkerTexture))); this.world = new HitableList(hitables); }
public List <IHittable> Generate() { var world = new List <IHittable>(); var checker = new CheckerTexture(new Vec3(0.2, 0.3, 0.1), new Vec3(0.9, 0.9, 0.9)); var groundMat = new Lambertian(checker); world.Add(new Sphere { Center = new Vec3(0, -1000, 0), Radius = 1000, Material = groundMat }); var earthTex = new ImageTexture("../../Data/earthmap.jpg"); var earthMat = new Lambertian(earthTex); for (var a = -11; a < 11; a++) { for (var b = -11; b < 11; b++) { var chooseMat = MathUtils.RandDouble(); var radius = MathUtils.RandDouble(0.2, 0.3); var offset = 1.0 - (radius / 2); var center = new Vec3( a + offset * MathUtils.RandDouble(), radius, b + offset * MathUtils.RandDouble()); if ((center - new Vec3(4, radius, 0)).Length <= 0.9) { continue; } if (chooseMat < 0.05) { var albedo = Vec3.Random() * Vec3.Random() * 10; var mat = new DiffuseLight(albedo); world.Add(new Sphere { Center = center, Material = mat, Radius = radius }); } if (chooseMat < 0.2) { var albedo = Vec3.Random() * Vec3.Random(); var mat = new Lambertian(albedo); var c2 = center + new Vec3(0, MathUtils.RandDouble(0, 0.2), 0); world.Add(new MovingSphere { Center0 = center, Center1 = c2, Radius = radius, Time0 = 0, Time1 = 1, Material = mat }); } else if (chooseMat < 0.4) { world.Add(new Sphere { Center = center, Radius = radius, Material = earthMat }); } else if (chooseMat < 0.6) { var color1 = Vec3.Random() * Vec3.Random(); var color2 = Vec3.One - color1; var scale = MathUtils.RandomInt(3, 10); var mat = new Lambertian(new NoiseTexture(color1, color2, scale)); world.Add(new Sphere { Center = center, Radius = radius, Material = mat }); } else if (chooseMat < 0.8) { var albedo = Vec3.Random(0.5, 1); var fuzz = MathUtils.RandDouble(0, 0.5); var mat = new Metal { Albedo = albedo, Fuzz = fuzz }; world.Add(new Sphere { Center = center, Radius = radius, Material = mat }); } else { var mat = new Dielectric { RefractionIndex = 1.5 }; world.Add(new Sphere { Center = center, Radius = radius, Material = mat }); } } } var mat1 = new Dielectric { RefractionIndex = 1.5 }; var mat2 = new Lambertian(new Vec3(0.4, 0.2, 0.1)); var mat3 = new Metal { Albedo = new Vec3(0.7, 0.6, 0.5), Fuzz = 0.0 }; world.Add(new Sphere { Center = new Vec3(0, 1, 0), Radius = 1.0, Material = mat1 }); world.Add(new Sphere { Center = new Vec3(-4, 1, 0), Radius = 1, Material = mat2 }); world.Add(new Sphere { Center = new Vec3(4, 1, 0), Radius = 1.0, Material = mat3 }); return(world); }
public static void ColRowTestRender() { Console.WriteLine("Loading file..."); //var filePath = Path.Combine(GetExecutionPath(), "indoor_env.ppm"); var filePath = Path.Combine(GetExecutionPath(), "winter_river_1k.ppm"); Console.WriteLine("Parsing file..."); var textureCanvas = PPM.ParseFile(filePath); var image = new UVImage(textureCanvas); var map = new TextureMap(image, UVMapping.Spherical); var skySphere = new Sphere() { Material = { Texture = map, Ambient = 1.5f, CastsShadows = false, Transparency = 1f } }; skySphere.SetTransform(Transform.RotateY(3.4f).Scale(1000f)); var g = new Group(); var dx = 2.75f; var dz = 3.5f; var y = 1f; var nX = 10; var nZ = 1; var delta = 1f / (nX * nZ - 1); int n = 0; bool metallic = false; for (var z = 0; z < nZ; z++) { for (var x = 0; x < nX; x++) { var s = new Sphere(); s.SetTransform(Transform.TranslateY(1f).Scale(1.2f).Translate(x * dx, 0, z * dz)); // var color = x % 2 == 0 ? new Color(1f, 1f, 1f) : new Color(1f, 0.3f, 0.3f); var color = new Color(1f, 0.3f, 0.3f); s.Material.Texture = SolidColor.Create(color); s.Material.SpecularColor = metallic ? color : new Color(0.2f, 0.2f, 0.2f); s.Material.Roughness = MathFunction.Saturate(n * delta + 0.01f); s.Material.Metallic = metallic ? 1f : 0f; s.Material.Ambient = 0f; s.Material.Reflective = 0.9f; g.AddChild(s); n++; } } var lightGray = new Color(0.9f, 0.9f, 0.9f); var darkGray = new Color(0.1f, 0.9f, 0.1f); var s1 = new StripeTexture(lightGray, darkGray); var s2 = new StripeTexture(lightGray, darkGray); s2.SetTransform(Transform.RotateY(MathF.PI / 2)); var pattern = new BlendedCompositeTexture(s1, s2); pattern.SetTransform(Transform.Scale(1f / 30f)); var text = new CheckerTexture(new Color(0.3f, 0.7f, 0.3f), new Color(0.13f, 0.13f, 0.13f)); text.SetTransform(Transform.Scale(1f / 16f)); var floor = new Cube { Material = { Texture = text, SpecularColor = new Color(0.3f, 0.3f, 0.3f), Metallic = 0f, Roughness = 0.45f, Ambient = 0.15f } }; floor.SetTransform(Transform.TranslateY(-1f).Scale(40f)); var min = g.LocalBounds().Min; var max = g.LocalBounds().Max; var dir = max - min; var mid = min + (dir * 0.5f); var g2 = new Group(g, floor, skySphere); //var g2 = new Group(g); g2.Divide(1); var w = new World(); w.SetLights(new PointLight(new Point(mid.X, 500, -500), new Color(1.7f, 1.7f, 1.7f))); w.SetObjects(g2); //var width = 1200; //var height = 140; //var transform = Transforms.View(new Point(mid.X, 6f, -32f), mid, new Vector(0, 1, 0)); //var c = new PinholeCamera(transform, MathF.PI / 4f, width, height); ////var c = new ApertureCamera(MathF.PI / 4f, width, height, 0.04f, new Point(mid.X, 6f, -32f), mid); //var ws = new ComposableWorldShading(3, GGXNormalDistribution.Instance, GGXSmithGeometricShadow.Instance, SchlickFresnelFunction.Instance, w); ////var ws = new PhongWorldShading(3, w); //var scene = new Scene(c, ws); //var aaa = new AdaptiveRenderer(4, 0.00001f, scene); //var canvas = new Canvas(width, height); var width = 1200; var height = 140; var from = new Point(mid.X, 6f, -32f); var to = mid; var canvas = new Canvas(width, height); var pps = new PerPixelSampler(400); var fov = MathF.PI / 4f; var aspectRatio = (float)width / height; var camera = new ApertureCamera(fov, aspectRatio, 0.2F, from, to, Vectors.Up); var cws = new ComposableWorldSampler(2, 16, GGXNormalDistribution.Instance, GGXSmithGeometricShadow.Instance, SchlickFresnelFunction.Instance, w); var ctx = new RenderContext(canvas, new RenderPipeline(cws, camera, pps)); Console.WriteLine("Rendering at {0}x{1}...", width, height); var stopwatch = new Stopwatch(); stopwatch.Start(); ctx.Render(); //RenderContext.Render(canvas, aaa); PPM.ToFile(canvas, Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "col_row"); stopwatch.Stop(); Console.WriteLine("Done ({0})", stopwatch.Elapsed); }
public static void RowTestByDelegate(int spp, string fileSuffix, Func <int, Material> materialFunc) { Console.WriteLine("Loading file..."); var filePath = Path.Combine(GetExecutionPath(), "winter_river_1k.ppm"); Console.WriteLine("Parsing file..."); var textureCanvas = PPM.ParseFile(filePath); var image = new UVImage(textureCanvas); var map = new TextureMap(image, UVMapping.Spherical); var skySphere = new Sphere { Material = { Texture = map, Ambient = 1.5f, CastsShadows = false, Transparency = 1f } }; skySphere.SetTransform(Transform.RotateY(3.4f).Scale(1000f)); var g = new Group(); var dx = 2.75f; var dz = 3.5f; var y = 1f; var nX = 10; var nZ = 1; int n = 0; for (var z = 0; z < nZ; z++) { for (var x = 0; x < nX; x++) { var s = new Sphere(); s.SetTransform(Transform.TranslateY(1f).Scale(1.2f).Translate(x * dx, 0, z * dz)); s.SetMaterial(materialFunc(x + 1)); g.AddChild(s); n++; } } var lightGray = new Color(0.9f, 0.9f, 0.9f); var darkGray = new Color(0.1f, 0.9f, 0.1f); var s1 = new StripeTexture(lightGray, darkGray); var s2 = new StripeTexture(lightGray, darkGray); s2.SetTransform(Transform.RotateY(MathF.PI / 2)); var pattern = new BlendedCompositeTexture(s1, s2); pattern.SetTransform(Transform.Scale(1f / 30f)); var text = new CheckerTexture(new Color(0.3f, 0.7f, 0.3f), new Color(0.13f, 0.13f, 0.13f)); text.SetTransform(Transform.Scale(1f / 16f)); var floor = new Cube { Material = { Texture = text, SpecularColor = new Color(0.3f, 0.3f, 0.3f), Metallic = 0f, Roughness = 0.45f, Ambient = 0.15f } }; floor.SetTransform(Transform.TranslateY(-1f).Scale(40f)); var min = g.LocalBounds().Min; var max = g.LocalBounds().Max; var dir = max - min; var mid = min + (dir * 0.5f); var g2 = new Group(g, floor, skySphere); g2.Divide(1); var w = new World(); w.SetLights(new PointLight(new Point(mid.X, 500, -500), new Color(1.7f, 1.7f, 1.7f))); w.SetObjects(g2); var width = 1200; var height = 140; var from = new Point(mid.X, 6f, -32f); var to = mid; var canvas = new Canvas(width, height); var pps = new PerPixelSampler(spp); var fov = MathF.PI / 4f; var aspectRatio = (float)width / height; var camera = new ApertureCamera(fov, aspectRatio, 0.2F, from, to, Vectors.Up); var cws = new ComposableWorldSampler(2, 16, GGXNormalDistribution.Instance, GGXSmithGeometricShadow.Instance, SchlickFresnelFunction.Instance, w); var ctx = new RenderContext(canvas, new RenderPipeline(cws, camera, pps)); Console.WriteLine("Rendering at {0}x{1}...", width, height); var stopwatch = new Stopwatch(); stopwatch.Start(); ctx.Render(); PPM.ToFile(canvas, Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "col_row_" + fileSuffix); stopwatch.Stop(); Console.WriteLine("Done ({0})", stopwatch.Elapsed); }
public void CreateScene(int width, int height, FloatColor color, bool useAntialiasing) { var renderTarget = new Framebuffer(width, height); renderTarget.Clear(color); var objects = new List <IHittable> { new Plane(new Vector3(0, -2, 0), new Vector3(0, 1, 0), new ReflectiveMaterial(FloatColor.White, 0.4f, 0, 1000, 0.6f, CheckerTexture.Create(FloatColor.Green, FloatColor.Black).ToInfo())), new Sphere(new Vector3(-3.5f, 0, 0), 2, new ReflectiveMaterial(FloatColor.UnityYellow, 0.7f, 0.5f, 1000, 0.3f)), new Sphere(new Vector3(3.5f, 0, 0), 2, new ReflectiveMaterial(Color.GreenYellow.ToFloatColor(), 0.7f, 0.5f, 1000, 0.3f)), new Sphere(new Vector3(0, 0, 3.5f), 2, new ReflectiveMaterial(Color.DeepSkyBlue.ToFloatColor(), 0.7f, 0.5f, 1000, 0.3f)), new Sphere(new Vector3(0, 0, -3.5f), 2, new TransparentMaterial(Color.Red.ToFloatColor(), 0.1f, 0, 0.3f, 1.05f, 0.9f)), }; var sampler = new Sampler(new RegularGenerator(), new SquareDistributor(), 25, 1); var camera = new PinholeCamera(renderTarget, new Vector3(6, 2, -15), new Vector3(0, 0.3f, 0), new Vector3(0, -1, 0), new Vector2(0.7f, 0.7f * height / width), 2) { Sampler = sampler, MaxDepth = 5 }; Scene = new Scene(objects, camera, new List <Light> { new PointLight { Position = new Vector3(-5, 5, -3), Color = FloatColor.White, Intensity = 2 }, }, FloatColor.Black); }
public static void SolidTestRender(int spp) { Console.WriteLine("Loading file..."); var filePath = Path.Combine(GetExecutionPath(), "neon_env.ppm"); //var filePath = Path.Combine(GetExecutionPath(), "winter_river_1k.ppm"); Console.WriteLine("Parsing file..."); var textureCanvas = PPM.ParseFile(filePath); var image = new UVImage(textureCanvas); var map = new TextureMap(image, UVMapping.Spherical); var skySphere = new Sphere { Material = { Texture = map, Ambient = 1.0f, CastsShadows = false, Transparency = 0f, Roughness = 1f, SpecularColor = new Color(0.0f, 0.0f, 0.0f) } }; skySphere.SetTransform(Transform.RotateY(3.3f).Scale(1000f)); var radius = 0.25f; var red = new Material { Texture = new SolidColor(new Color(1, 0, 0)), Reflective = 0.3f, Roughness = 0.3f, Ambient = 0.0f, Metallic = 0.3f, SpecularColor = new Color(0.3f, 0.3f, 0.3f) }; var blue = new Material { Texture = new SolidColor(new Color(0, 0, 1)), Reflective = 0.3f, Roughness = 0.3f, Ambient = 0.0f, Metallic = 0.3f, SpecularColor = new Color(0.3f, 0.3f, 0.3f) }; var yellow = new Material { Texture = new SolidColor(new Color(1, 1, 0)), Reflective = 0.3f, Roughness = 0.3f, Ambient = 0.0f, Metallic = 0.3f, SpecularColor = new Color(0.3f, 0.3f, 0.3f) }; var white = new Material { Texture = new SolidColor(new Color(1, 1, 1)), Reflective = 0.3f, Roughness = 0.3f, Ambient = 0.0f, Metallic = 0.3f, SpecularColor = new Color(0.3f, 0.3f, 0.3f) }; var blackPip = new Material { Texture = new SolidColor(new Color(0.1f, 0.1f, 0.1f)), Ambient = 0.0f, Roughness = 0.8f, Metallic = 0f, SpecularColor = new Color(0.2f, 0.2f, 0.2f) }; var whitePip = new Material { Texture = new SolidColor(new Color(0.95f, 0.95f, 0.95f)), Ambient = 0.0f, Roughness = 0.8f, Metallic = 0f, SpecularColor = new Color(0.2f, 0.2f, 0.2f) }; var d1 = CutPips(RoundedCube(radius, blue), whitePip); var d2 = CutPips(RoundedCube(radius, red), whitePip); var d3 = CutPips(RoundedCube(radius, white), blackPip); var d4 = CutPips(RoundedCube(radius, yellow), blackPip); d1.SetTransform(Transform.RotateY(-2.2f).TranslateY(1f).Scale(0.5f)); d2.SetTransform(Transform.RotateZ(MathF.PI / 2f).TranslateY(1f).TranslateX(2f).TranslateZ(1f).Scale(0.5f)); d3.SetTransform(Transform.RotateY(0.5f).TranslateY(1f).TranslateX(-4f).TranslateZ(1f).Scale(0.5f)); d4.SetTransform(Transform.RotateY(-0.2f).TranslateY(3f).TranslateX(0.2f).TranslateZ(1.25f).Scale(0.5f)); var lightGray = new Color(0.48f, 0.48f, 0.48f); var darkGray = new Color(0.15f, 0.15f, 0.15f); //var s1 = new StripeTexture(lightGray, darkGray); //var s2 = new StripeTexture(lightGray, darkGray); //s2.SetTransform(Transforms.RotateY(MathF.PI / 2)); //var pattern = new BlendedCompositeTexture(s1, s2); //pattern.SetTransform(Transforms.Scale(1f / 20f)); var pattern = new CheckerTexture(lightGray, darkGray); pattern.SetTransform(Transform.Scale(1f / 20f)); var floor = new Cube { Material = { Texture = pattern, Roughness = 0.5f, Specular = 0.1f, Diffuse = 0.3f, Reflective = 0.15f, SpecularColor = new Color(0.3f, 0.3f, 0.3f), Ambient = 0f } }; floor.SetTransform(Transform.TranslateY(-1f).Scale(20f)); var g = new Group(d1, d2, d3, d4, floor, skySphere); g.Divide(1); var w = new World(); w.SetLights(new AreaLight(new Point(-8, 10, -10), new Vector(12f, 0, 0), 6, new Vector(0, 0f, -10f), 3, new Color(1.1f, 1.1f, 1.1f), new Sequence(0.7f, 0.3f, 0.9f, 0.1f, 0.5f))); //w.SetLights(new PointLight(new Point(-8, 10, -10), new Color(0.9f, 0.9f, 0.9f))); //w.SetLights(new AreaLight(new Point(-3, 6, -4), new Vector(1f, 0, 0), 3, new Vector(0, 1f, 0), 3, // new Color(1.4f, 1.4f, 1.4f), new Sequence(0.7f, 0.3f, 0.9f, 0.1f, 0.5f))); //w.SetLights(new AreaLight(new Point(-10, 10, -10), new Vector(1,0,0), 4, new Vector(0,1,0), 3, Colors.White)); w.SetObjects(g); //var width = 600; //var height = 400; //var transform = Transforms.View(new Point(0, 1.5f, -5f), new Point(0, 1, 0), new Vector(0, 1, 0)); //var c = new PinholeCamera(transform, MathF.PI / 3f, width, height); //var ws = new ComposableWorldShading(2, GGXNormalDistribution.Instance, SchlickBeckmanGeometricShadow.Instance, SchlickFresnelFunction.Instance, w); ////var ws = new PhongWorldShading(2, w); //var scene = new Scene(c, ws); ////var aaa = new AdaptiveRenderer(2, 0.01f, scene); //var aaa = new SamplesPerPixelRenderer(24, scene); //var canvas = new Canvas(width, height); var width = 600; var height = 400; var from = new Point(0, 1.5f, -5f); var to = new Point(0, 1, -0.5f); var canvas = new Canvas(width, height); var pps = new PerPixelSampler(spp); var fov = MathF.PI / 3f; var aspectRatio = (float)width / height; var camera = new ApertureCamera(fov, aspectRatio, 0.15f, from, to, Vectors.Up); //var transform = Transforms.View(from, to, new Vector(0, 1, 0)); //var camera = new PinholeCamera2(transform, fov, aspectRatio); //var cws = new PhongWorldShading2(4, w); var cws = new ComposableWorldSampler(2, 4, GGXNormalDistribution.Instance, SchlickBeckmanGeometricShadow.Instance, SchlickFresnelFunction.Instance, w); var ctx = new RenderContext(canvas, new RenderPipeline(cws, camera, pps)); Console.WriteLine("Rendering at {0}x{1}...", width, height); var stopwatch = new Stopwatch(); stopwatch.Start(); ctx.Render(); // RenderContext.Render(canvas, aaa); PPM.ToFile(canvas, Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "solid"); stopwatch.Stop(); Console.WriteLine("Done ({0})", stopwatch.Elapsed); }
public IHitable GetWorld() { var list = new HitableList(); var checkerTexture = new CheckerTexture( new ColorTexture(0.2f, 0.3f, 0.1f), new ColorTexture(0.9f, 0.9f, 0.9f), Vector3.One * 10.0f); // original color of large sphere... // var colorTexture = new ColorTexture(0.5f, 0.5f, 0.5f); list.Add(new Sphere(new Vector3(0.0f, -1000.0f, 0.0f), 1000.0f, new LambertianMaterial(checkerTexture))); for (int a = -11; a < 11; a++) { for (int b = -11; b < 11; b++) { float chooseMat = RandomService.Nextfloat(); var center = new Vector3( Convert.ToSingle(a) * RandomService.Nextfloat(), 0.2f, Convert.ToSingle(b) + (0.9f * RandomService.Nextfloat())); if ((center - new Vector3(4.0f, 0.2f, 0.0f)).Length() > 0.9) { if (chooseMat < 0.8) { // diffuse list.Add( new Sphere( center, 0.2f, new LambertianMaterial( new ColorTexture( RandomService.Nextfloat() * RandomService.Nextfloat(), RandomService.Nextfloat() * RandomService.Nextfloat(), RandomService.Nextfloat() * RandomService.Nextfloat())))); } else if (chooseMat < 0.95) { // metal list.Add( new Sphere( center, 0.2f, new MetalMaterial( new ColorVector( 0.5f * (1.0f + RandomService.Nextfloat()), 0.5f * (1.0f + RandomService.Nextfloat()), 0.5f * (1.0f + RandomService.Nextfloat())), 0.5f * RandomService.Nextfloat()))); } else { // glass list.Add(new Sphere(center, 0.2f, new DialectricMaterial(1.5f))); } } } } list.Add(new Sphere(new Vector3(0.0f, 1.0f, 0.0f), 1.0f, new DialectricMaterial(1.5f))); list.Add(new Sphere(new Vector3(-4.0f, 1.0f, 0.0f), 1.0f, new LambertianMaterial(new ColorTexture(0.4f, 0.2f, 0.1f)))); list.Add(new Sphere(new Vector3(4.0f, 1.0f, 0.0f), 1.0f, new MetalMaterial(new ColorVector(0.7f, 0.6f, 0.5f), 0.0f))); return(new BvhNode(list, 0.0f, 1.0f)); }
/// <summary> /// Scene from pdf 1; three spheres with lots around. /// </summary> private void CreateScene1() { Console.WriteLine("Populating scene.."); // Set up camera this.hFovDeg = 35; var lookFrom = new Vec3(13, 2, 3); var lookAt = new Vec3(0, 0, 0); var lookUp = new Vec3(0, 1, 0); float focusDist = (lookAt - lookFrom).Length; float aperture = 0.1f; this.camera = new CartesianCamera(this.rows, this.columns, this.hFovDeg, lookFrom, lookAt, lookUp, aperture, focusDist); // Add spheres var hitables = new List <Hitable>(); var oddTexture = new ConstantTexture(new Vec3(0.2f, 0.3f, 0.1f)); var evenTexture = new ConstantTexture(new Vec3(0.9f, 0.9f, 0.9f)); var checkerTexture = new CheckerTexture(evenTexture, oddTexture); hitables.Add(new Sphere(new Vec3(0, -1000, 0), 1000, new Lambertian(checkerTexture))); Random random = new Random(10); int dim = this.ballPlacementDimension; for (int a = -dim; a < dim; a++) { for (int b = -dim; b < dim; b++) { double chooseMat = random.NextDouble(); var center = new Vec3(a + 0.9f * (float)random.NextDouble(), 0.2f, b + 0.9f * (float)random.NextDouble()); if ((center - new Vec3(4, 0.2f, 0)).Length > 0.9) { if (chooseMat < 0.4) // diffuse { hitables.Add(new Sphere(center, 0.2f, new Lambertian( new ConstantTexture(new Vec3((float)(random.NextDouble() * random.NextDouble()), (float)(random.NextDouble() * random.NextDouble()), (float)(random.NextDouble() * random.NextDouble())))))); } else if (chooseMat < 0.65) // metal { hitables.Add(new Sphere(center, 0.2f, new Metal( new Vec3(0.5f * (float)(1 + random.NextDouble()), 0.5f * (float)(1 + random.NextDouble()), 0.5f * (float)(1 + random.NextDouble())), 0.5f * (float)random.NextDouble()))); } else // glass { hitables.Add(new Sphere(center, 0.2f, new Dielectric(1.5f))); } } } } hitables.Add(new Sphere(new Vec3(0, 1, 0), 1, new Dielectric(1.5f))); hitables.Add(new Sphere(new Vec3(-4, 1, 0), 1, new Lambertian(new ConstantTexture(new Vec3(0.4f, 0.2f, 0.1f))))); hitables.Add(new Sphere(new Vec3(4, 1, 0), 1, new Metal(new Vec3(0.7f, 0.6f, 0.5f), 0))); //this.world = new HitableList(hitables); this.world = new BVHNode(hitables, this.tMin, this.tMax, new Random()); Console.WriteLine("Populated Scene!"); }