Ejemplo n.º 1
0
 public RendererData Render(IPixelBuffer pixelArray, IScene scene, RenderConfig renderConfig)
 {
     return(Render(
                pixelArray,
                scene.GetCamera(pixelArray.Width, pixelArray.Height),
                scene.GetWorld(),
                scene.GetLightHitable(),
                renderConfig,
                scene.GetBackgroundFunc()));
 }
Ejemplo n.º 2
0
        private RendererData RenderMultiThreaded(
            IPixelBuffer pixelArray,
            Camera camera,
            IHitable world,
            IHitable lightHitable,
            RenderConfig renderConfig,
            Func <Ray, ColorVector> backgroundFunc)
        {
            var rendererData = new RendererData(pixelArray.Width, pixelArray.Height);

            var rayTracer = new RayTracer(camera, world, lightHitable, renderConfig, pixelArray.Width, pixelArray.Height, backgroundFunc);

            ThreadPool.SetMinThreads(renderConfig.NumThreads * 3, renderConfig.NumThreads * 3);

            var queueDataAvailableEvent = new AutoResetEvent(false);
            var inputQueue  = new ConcurrentQueue <RenderInput>();
            var resultQueue = new ConcurrentQueue <RenderResult>();

            for (var y = pixelArray.Height - 1; y >= 0; y--)
            {
                for (var x = 0; x < pixelArray.Width; x++)
                {
                    inputQueue.Enqueue(new RenderInput(x, y));
                }
            }

            var tasks = new List <Task>();

            try
            {
                for (var thid = 0; thid < renderConfig.NumThreads; thid++)
                {
                    Console.WriteLine($"Creating task for thread id: {thid}");
                    tasks.Add(
                        Task.Run(() => RenderFunc(rayTracer, inputQueue, resultQueue, queueDataAvailableEvent)));
                }

                tasks.Add(Task.Run(() => ResultFunc(pixelArray, rendererData, resultQueue, queueDataAvailableEvent)));

                Task.WaitAll(tasks.ToArray());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            return(rendererData);
        }
Ejemplo n.º 3
0
 public RayTracer(
     Camera camera,
     IHitable world,
     IHitable lightHitable,
     RenderConfig renderConfig,
     int imageWidth,
     int imageHeight,
     Func <Ray, ColorVector> backgroundFunc)
 {
     _camera         = camera;
     _world          = world;
     _lightHitable   = lightHitable;
     _renderConfig   = renderConfig;
     _imageWidth     = Convert.ToSingle(imageWidth);
     _imageHeight    = Convert.ToSingle(imageHeight);
     _backgroundFunc = backgroundFunc;
 }
Ejemplo n.º 4
0
        public RendererData Render(
            IPixelBuffer pixelArray,
            Camera camera,
            IHitable world,
            IHitable lightHitable,
            RenderConfig renderConfig,
            Func <Ray, ColorVector> backgroundFunc)
        {
            Progress?.Invoke(this, new RenderProgressEventArgs(0.0f));

            if (renderConfig.TwoPhase)
            {
                // do a much lighter weight first pass first.
                RenderMultiThreaded(
                    pixelArray,
                    camera,
                    world,
                    lightHitable,
                    new RenderConfig(renderConfig.NumThreads, 5, 1),
                    backgroundFunc);
            }

            return(RenderMultiThreaded(pixelArray, camera, world, lightHitable, renderConfig, backgroundFunc));
        }
Ejemplo n.º 5
0
        public RendererData Render(IPixelBuffer pixelArray, Camera camera, IHitable world, IHitable lightHitable, RenderConfig renderConfig, Func <Ray, ColorVector> backgroundFunc)
        {
            Progress?.Invoke(this, new RenderProgressEventArgs(0.0f));

            return(RenderMultiThreaded(pixelArray, camera, world, lightHitable, renderConfig, backgroundFunc));
        }