Beispiel #1
0
        static Hitable CornellBox()
        {
            var      red      = new Lambertian(new vec3(0.65f, 0.05f, 0.05f));
            var      white    = new Lambertian(new vec3(0.73f, 0.73f, 0.73f));
            var      green    = new Lambertian(new vec3(0.12f, 0.45f, 0.15f));
            Material aluminum = new Metal(new vec3(0.8f, 0.85f, 0.88f), 0.3f);

            var light = new DiffuseLight(new SolidTexture(new vec3(15, 15, 15)));
            int i     = 0;

            Hitable[] hitables = new Hitable[8];
            hitables[i++] = new YZRect(555, 0, 555, 0, 555, green, true);
            hitables[i++] = new YZRect(0, 0, 555, 0, 555, red);
            var lightRect = new XZRect(554, 213, 343, 227, 332, light, true);

            hitables[i++] = lightRect;
            hitables[i++] = new XZRect(0, 0, 555, 0, 555, aluminum);
            hitables[i++] = new XZRect(555, 0, 555, 0, 555, white, true);
            hitables[i++] = new XYRect(555, 0, 555, 0, 555, white, true);

            //Hitable box = new Box(new vec3(0, 0, 0), new vec3(165, 165, 165), white);
            //box = new Tranlate(new RotateY(box, -18), new vec3(130, 0, 65));
            //hitables[i++] = box;
            Sphere sp = new Sphere(new vec3(190, 90.5f, 190), 90f, new Dieletric(1.6f));

            hitables[i++] = sp;
            Hitable box2 = new Box(new vec3(0, 0, 0), new vec3(165, 330, 165), white);

            box2          = new Tranlate(new RotateY(box2, 15), new vec3(265, 0, 295));
            hitables[i++] = box2;
            _lightPDf     = new LightPDF(lightRect);
            _spherePDF    = new SpherePDF(sp);
            return(new HitList(hitables.Where(p => p != null).ToArray()));
        }
Beispiel #2
0
        //class Scene : Hitable
        //{
        //    AABB _box;
        //    Hitable _inner;
        //    public Scene(HitList l,float t0,float t1)
        //    {
        //        _box = l.BoundVolume(t0,t1);
        //        _inner = l;
        //    }
        //    public AABB BoundVolume(float t0, float t1)
        //    {
        //        return _box;
        //    }

        //    public bool Hit(Ray ray, float min, float max, out HitRecord r)
        //    {
        //        r = null;
        //        if(!_box.Hit(ray,min,max))
        //        {
        //            return false;
        //        }
        //        return _inner.Hit(ray, min, max, out r);
        //    }
        //}

        static Hitable random_scene(bool bvh)
        {
            int n = 500;

            Hitable[] list  = new Hitable[n + 1];
            vec3      black = new vec3(0.1f, 0.1f, 0.2f);
            vec3      white = new vec3(1f, 1f, 1f);
            var       check = new CheckTexture(black, white);
            var       noise = new NoiseTexture(new Noise());

            list[0] = new Sphere(new vec3(0, -1000, 0), 1000, new Lambertian(noise));
            int i = 1;

            //for (int a = -11; a < 11; a++)
            //{
            //    for (int b = -11; b < 11; b++)
            //    {
            //        float choose_mat = Exten.rand01();
            //        var center = new vec3(a + 0.9f * Exten.rand01(), 0.2f, b + 0.9f * Exten.rand01());
            //        if ((center - new vec3(4f, 0.2f, 0f)).length() > 0.9f)
            //        {
            //            if (choose_mat < 0.8)
            //            {  // diffuse
            //                var color = new vec3(Exten.rand01() * Exten.rand01(), Exten.rand01() * Exten.rand01(), Exten.rand01() * Exten.rand01());

            //                var mat = new Lambertian(new SolidTexture(color));
            //                list[i++] = new Sphere(center, 0.2f,mat);
            //            }
            //            else if (choose_mat < 0.95f)
            //            { // metal
            //                list[i++] = new Sphere(center, 0.2f,
            //                        new Metal(new vec3(0.5f * (1 + drand48()), 0.5f * (1 + drand48()), 0.5f * (1 + drand48())), 0.5f * drand48()));
            //            }
            //            else
            //            {  // glass
            //                list[i++] = new Sphere(center, 0.2f, new Dieletric(1.5f));
            //            }
            //        }
            //    }
            //}

            //list[i++] = new Sphere(new vec3(2, 1, 0), 1.0f, new Dieletric(1.3f));
            //list[i++] = new Sphere(new vec3(-3, 1, 2), 1.0f, new Metal(new vec3(0.4f, 0.2f, 0.1f),0.2f));
            list[i++] = new Sphere(new vec3(4, 1, 0), 1.0f, new Lambertian(noise));
            //list[i++] = new Sphere(new vec3(4, 1, -0.5f), 1.0f, new Metal(new vec3(0.7f, 0.6f, 0.5f), 0.0f));
            var finalList = list.Where(p => p != null).ToArray();

            if (!bvh)
            {
                return(new HitList(finalList));
            }
            else
            {
                //Array.Sort(finalList, new BVHNode.BVHComparer(0));
                return(new BVHNode(finalList, 0, finalList.Length, 0, 1));
            }
        }
Beispiel #3
0
        static Hitable SimpleLight()
        {
            Texture perlintext = new NoiseTexture(new Noise());

            Hitable[] hitables = new Hitable[4];
            int       i        = 0;
            var       tex2     = new SolidTexture(new vec3(4, 4, 4));

            hitables[i++] = new Sphere(new vec3(0, -1000, 0), 1000, new Lambertian(perlintext));
            hitables[i++] = new Sphere(new vec3(0, 2, 0), 2, new Lambertian(perlintext));
            //hitables[i++] = new Sphere(new vec3(0, 7, 0), 2, new DiffuseLight(tex2));
            hitables[i++] = new XYRect(-2, 3, 5, 1, 3, new DiffuseLight(tex2));
            var finalList = hitables.Where(h => h != null).ToArray();

            return(new BVHNode(finalList, 0, finalList.Length, 0, 1));
        }
Beispiel #4
0
        static Hitable FinalTest()
        {
            int nb = 20;

            Hitable[] list    = new Hitable[30];
            Hitable[] boxlist = new Hitable[10000];
            Material  ground  = new Lambertian(new SolidTexture(new vec3(0.48f, 0.83f, 0.53f)));
            int       b       = 0;

            for (int i = 0; i < nb; i++)
            {
                for (int j = 0; j < nb; j++)
                {
                    float w  = 100;
                    float x0 = -1000 + i * w;
                    float z0 = -1000 + j * w;
                    float y0 = 0;
                    float x1 = x0 + w;
                    float y1 = 100 * (Exten.rand01() + 0.01f);
                    float z1 = z0 + w;
                    boxlist[b++] = new Box(new vec3(x0, y0, z0), new vec3(x1, y1, z1), ground);
                }
            }
            int l = 0;

            list[l++] = new BVHNode(boxlist, 0, b, 0, 1);
            Material light = new DiffuseLight(new SolidTexture(new vec3(7, 7, 7)));

            list[l++] = new XZRect(554, 123, 423, 147, 412, light);
            vec3 center = new vec3(400, 400, 200);

            //public Sphere(vec3 c, vec3 c1, float r, Material m, float time1, float time2)
            list[l++] = new Sphere(center, center + new vec3(30, 0, 0), 50, new Lambertian(new SolidTexture(new vec3(0.7f, 0.3f, 0.1f))), 0, 1);
            list[l++] = new Sphere(new vec3(260, 150, 45), 50, new Dieletric(1.5f));
            list[l++] = new Sphere(new vec3(0, 150, 145), 50, new Metal(new vec3(0.8f, 0.8f, 0.9f), 10.0f));
            Hitable boundary = new Sphere(new vec3(360, 150, 145), 70, new Dieletric(1.5f));

            list[l++] = boundary;
            boundary  = new Sphere(new vec3(0, 0, 0), 5000, new Dieletric(1.5f));
            Texture pertext = new NoiseTexture(new Noise());

            list[l++] = new Sphere(new vec3(220, 280, 300), 80, new Lambertian(pertext));
            return(new HitList(list.Where(arg => arg != null).ToArray()));
        }
        static Hitable random_scene()
        {
            int n = 500;

            Hitable[] list = new Hitable[n + 1];
            list[0] = new Sphere(new UnityEngine.Vector3(0, -1000, 0), 1000, new Metal(new UnityEngine.Vector3(0.5f, 0.5f, 0.5f), 0.1f));
            int i = 1;

            for (int a = -11; a < 11; a++)
            {
                for (int b = -11; b < 11; b++)
                {
                    float choose_mat = Exten.rand01();
                    var   center     = new UnityEngine.Vector3(a + 0.9f * Exten.rand01(), 0.2f, b + 0.9f * Exten.rand01());
                    if ((center - new UnityEngine.Vector3(4f, 0.2f, 0f)).length() > 0.9f)
                    {
                        if (choose_mat < 0.8)
                        {  // diffuse
                            list[i++] = new Sphere(center, 0.2f, new Lambertian(new UnityEngine.Vector3(Exten.rand01() * Exten.rand01(), Exten.rand01() * Exten.rand01(), Exten.rand01() * Exten.rand01())));
                        }
                        else if (choose_mat < 0.95f)
                        { // metal
                            list[i++] = new Sphere(center, 0.2f,
                                                   new Metal(new UnityEngine.Vector3(0.5f * (1 + drand48()), 0.5f * (1 + drand48()), 0.5f * (1 + drand48())), 0.5f * drand48()));
                        }
                        else
                        {  // glass
                            list[i++] = new Sphere(center, 0.2f, new Dieletric(1.5f));
                        }
                    }
                }
            }

            list[i++] = new Sphere(new UnityEngine.Vector3(2, 1, 0), 1.0f, new Dieletric(1.3f));
            //list[i++] = new Sphere(new vec3(-3, 1, 2), 1.0f, new Metal(new vec3(0.4f, 0.2f, 0.1f),0.2f));
            //list[i++] = new Sphere(new vec3(4, 1, 0), 1.0f, new Metal(new vec3(0.7f, 0.6f, 0.5f), 0.0f));
            //list[i++] = new Sphere(new vec3(4, 1, -0.5f), 1.0f, new Metal(new vec3(0.7f, 0.6f, 0.5f), 0.0f));
            return(new HitList(list.Where(p => p != null).ToArray()));
        }