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)); }
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."); }