public void Process(SceneBase world, int ci, int ri, int hres, int vres)
        {
            Vec2 s = world.ViewPlane.PixelSize / zoom;

            int numSamples = world.ViewPlane.NumSamples;

            Vec3 pixelColor = ColorUtils.BLACK;
            Ray  ray        = new Ray(eye, null);
            Vec2 pp         = new Vec2();
            Vec2 sp;

            for (int r = ri; r < vres; r++)     //up - y height
            {
                for (int c = ci; c < hres; c++) //across - x width
                {
                    pixelColor = ColorUtils.BLACK;

                    for (int j = 0; j < numSamples; j++)
                    {
                        sp          = world.ViewPlane.Sampler.SampleUnitSquare();
                        pp.X        = s.X * (c - 0.5 * world.ViewPlane.Hres + sp.X);
                        pp.Y        = s.Y * (r - 0.5 * world.ViewPlane.Vres + sp.Y);
                        ray.D       = RayDirection(pp);
                        pixelColor += world.Tracer.TraceRay(ray, 0);
                    }

                    pixelColor /= numSamples;
                    pixelColor *= exposureTime;

                    world.DisplayPixel(c, r, pixelColor);
                }
            }
        }
        public override void RenderScene(SceneBase world)
        {
            ComputeUVW();

            Vec3 pixelColor = new Vec3();
            Ray  ray        = new Ray();
            Vec2 pp         = new Vec2();
            Vec2 sp;
            int  depth = 0;

            Vec2 s = world.ViewPlane.PixelSize / zoom;

            ray.O = eye;

            int hres       = world.ViewPlane.Hres;
            int vres       = world.ViewPlane.Vres;
            int numSamples = world.ViewPlane.NumSamples;

            for (int r = 0; r < vres; r++)
            {
                for (int c = 0; c < hres; c++)
                {
                    pixelColor = ColorUtils.BLACK;

                    for (int j = 0; j < numSamples; j++)
                    {
                        sp          = world.ViewPlane.Sampler.SampleUnitSquare();
                        pp.X        = s.X * (c - 0.5 * hres + sp.X);
                        pp.Y        = s.Y * (r - 0.5 * vres + sp.Y);
                        ray.D       = RayDirection(pp);
                        pixelColor += world.Tracer.TraceRay(ray, depth);
                    }

                    pixelColor /= numSamples;
                    pixelColor *= exposureTime;

                    world.DisplayPixel(c, r, pixelColor);
                }
            }
        }