示例#1
0
        public Ray GetRay(double s, double t)
        {
            Vector3 rd     = LensRadius * VectorHelpers.GetRandomInUnitDisk();
            Vector3 offset = U * rd.X + V * rd.Y;

            var origin    = Origin + offset;
            var direction = LowerLeftCorner + new Vector3((float)(s * Horizontal.X), (float)(s * Horizontal.Y), (float)(s * Horizontal.Z)) + new Vector3((float)(t * Vertical.X), (float)(t * Vertical.Y), (float)(t * Vertical.Z)) - origin;

            return(new Ray(origin, direction));
        }
示例#2
0
        public static void Render(int _bpp, byte[] buffer)
        {
            Stopwatch st = new Stopwatch();

            st.Start();

            bpp = _bpp;

            //IScene scene = new ToyPathTracerScene();
            //IScene scene = new BookScene();
            //IScene scene = new TwoSpheresScene();
            IScene scene = new LightScene();

            World  = scene.GetSceneWorld();
            Camera = scene.GetDefaultCamera((1f * IMG_WIDTH) / IMG_HEIGHT);
            World.RebuildBvhTree();

            Parallel.For(0, IMG_HEIGHT, y =>
            {
                for (int x = 0; x < IMG_WIDTH; x++)
                {
                    Vector3 color = Vector3.Zero;
                    for (uint sample = 0; sample < AA_POINTS; sample++)
                    {
                        double xOffset = (x + VectorHelpers.RandomFloat() - 0.5f) / ((double)IMG_WIDTH);
                        double yOffset = (y + VectorHelpers.RandomFloat() - 0.5f) / ((double)IMG_HEIGHT);

                        Ray r  = Camera.GetRay(xOffset, yOffset);
                        color += Color(r, 0);
                    }
                    color /= AA_POINTS;

                    int offset       = CoordsToBufferIndex(x, y);
                    buffer[offset++] = DoubleToByte(color.X);
                    buffer[offset++] = DoubleToByte(color.Y);
                    buffer[offset++] = DoubleToByte(color.Z);
                }
            });

            st.Stop();
            Console.WriteLine("Scene rendered in " + st.ElapsedMilliseconds + " ms.");
        }