/// <summary> /// Renders the given scene to a bitmap, using one thread per line of pixels in the image. /// </summary> /// <param name="scene">The scene to render</param> /// <returns>A bitmap of the rendered scene.</returns> public void RenderSceneToBitmapThreaded(Scene scene, RenderBuffer renderBuffer, int width = -1, int height = -1) { if (width == -1 || height == -1) { width = renderSize.Width; height = renderSize.Height; } else { renderSize = new Size(width, height); } var before = DateTime.UtcNow; List<Task> tasks = new List<Task>(); for (int yCounter = height - 1; yCounter >= 0; yCounter--) { var y = yCounter; var task = Task.Run(() => { for (int xCounter = 0; xCounter < width; xCounter++) { var x = xCounter; var viewPortX = ((2 * x) / (float)width) - 1; var viewPortY = ((2 * y) / (float)height) - 1; var color = TraceRayAgainstScene(GetRay(viewPortX, viewPortY), scene); renderBuffer.SetColor(x, height - y - 1, ref color); } }); tasks.Add(task); } Task.WhenAll(tasks).Wait(); var after = DateTime.UtcNow; System.Diagnostics.Debug.WriteLine("Total render time: " + (after - before).TotalMilliseconds + " ms"); }