Exemplo n.º 1
0
        public void Execute(Random rand, PixelBuffer pb)
        {
            var w     = Scene.ImageWidth;
            var h     = Scene.ImageHeight;
            var samps = Scene.SamplesPerPixel;
            var cam   = Scene.Camera;

            var cx = new Vec(w * 0.5135 / h);
            var cy = cx.Cross(cam.Direction).Norm * 0.5135;

            for (var py = 0; py < Height; py++)
            {
                for (var px = 0; px < Width; px++)
                {
                    var x = X + px;
                    var y = Y + py;

                    var c = new Vec();

                    for (var sy = 0; sy < 2; sy++)
                    {
                        for (var sx = 0; sx < 2; sx++)
                        {
                            var r = new Vec();
                            for (var s = 0; s < samps; s++)
                            {
                                Prec r1 = 2 * rand.NextDouble(), dx = r1 < 1 ? Math.Sqrt(r1) - 1 : 1 - Math.Sqrt(2 - r1);
                                Prec r2 = 2 * rand.NextDouble(), dy = r2 < 1 ? Math.Sqrt(r2) - 1 : 1 - Math.Sqrt(2 - r2);
                                Vec  d = cx * (((sx + .5 + dx) / 2 + x) / w - .5) +
                                         cy * (((sy + .5 + dy) / 2 + y) / h - .5) + cam.Direction;

                                r += Radiance(new Ray(cam.Origin + d * 140, d.Norm), 0, rand) * (1.0 / samps);
                            }
                            c += r * 0.25;
                        }
                    }

                    pb.PutPixel(px, py, c);
                }
            }
        }