コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: golsby/CCSycles
        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);
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: ioklkiol/RayTracing2
        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));
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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));
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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));
        }
コード例 #12
0
ファイル: RandomScene.cs プロジェクト: bschne/RaySharp
        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));
        }
コード例 #13
0
ファイル: ImageModel.cs プロジェクト: GraysonWebb/ray-tracer
        /// <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);
        }
コード例 #14
0
        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);
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
        }
コード例 #19
0
        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));
        }
コード例 #20
0
ファイル: ImageModel.cs プロジェクト: GraysonWebb/ray-tracer
        /// <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!");
        }