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())); }
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); }
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; }
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)); }
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)); }