public void Computing() { time.Start(); RayTracer.RayTracer raytracer = new RayTracer.RayTracer(antiAliasing, renderDiffuse, renderHighlights, renderShadow, renderReflection, renderRefraction); while (countRange != 0) { for (int i = 0; i < Clients.ListClients.Count; i++) //тут появляется проблема при отключении клиента { //т.к. уменьшается количество клиентов в списке if (Clients.ListClients.Count > 0 && (Clients.ListClients [i].Done == "Ready" || Clients.ListClients [i].Done == "OK")) { for (int j = 0; j < RangeList.Count; j++) { if (RangeList [j].state == RangeOfCalculation.CurrentState.notComputing) { RangeList [j].state = RangeOfCalculation.CurrentState.computing; clients [i].RayTraceRowsAsync(scene, rect, RangeList [j].start, Steps, raytracer, j); Clients.ListClients [i].Done = "Working"; Clients.ListClients [i].Task = j; break; } } } } } }
public Tuple <double, int> Perfomance(Scene scene, Rectangle viewport, RayTracer.RayTracer raytracer, int step, int number) { Stopwatch time = new Stopwatch(); time.Start(); RayTraceRows(scene, viewport, 0, step, raytracer, 0); time.Stop(); return(Tuple.Create <double, int>(time.ElapsedMilliseconds, number)); }
static void Main() { const int width = 50; const int height = 50; RayTracer rayTracer = new RayTracer(width, height, (int x, int y, Color color) => { Console.Write("{0},{1}:{2};", x, y, color); }); rayTracer.Render(rayTracer.DefaultScene); }
public static void Run(string inputFile, string outputFile) { Color[,] bitmap = new Color[width, height]; RayTracer rayTracer = new RayTracer(width, height, (int x, int y, Color color) => { bitmap[x, y] = color; }); rayTracer.Render(RayTracer.ReadScene(inputFile)); WritePPM(outputFile, bitmap); }
static void Main(string[] args) { var config = Config.NewDefaultForDev(); var stopWatch = new Stopwatch(); var framebuffer = new Image(config.ImageWidth, config.ImageHeight); var scene = Scenes.RandomSpheres(config); var rayTracer = new RayTracer(scene, config.SamplesPerPixel, config.MaxDepth); Console.WriteLine("Rendering {0} with config: {1}", scene.Name, config); using (var progressBar = new ConsoleProgressBar("Progress")) { stopWatch.Start(); int imageW = config.ImageWidth; int imageH = config.ImageHeight; int scanlinesComplete = 0; // For now I'm adding parallelism using the built in 'Parallel.For'. // I think more performance could be gained via parallelism using a custom solution. // For example, I could manually manage a set of worker threads. The image would then be divided // into a grid of small tiles which are then added onto a work queue. Each worker thread // would pick up tiles off the queue as they complete them until all the work is done. // Each worker thread could be assigned it's own instance of Random too so we could avoid // the ThreadLocalRandom. But, I would need to have a more sophisticated benchmarking utility // in place before I go and do this. Something that aggregates many samples, and has test scenes // for different scenarios. For now this simple parallelism works fine. Parallel.For(0, imageH, j => { for (int i = 0; i < imageW; i++) { var color = rayTracer.Trace(i, j, imageW, imageH); framebuffer.SetPixel(new Pixel(color), i, j); } int progress = Interlocked.Increment(ref scanlinesComplete); progressBar.Report((float)progress / (imageH - 1)); }); stopWatch.Stop(); } Console.WriteLine("Render completed in {0}", stopWatch.Elapsed); string outputPath = string.Format("{0}_{1}x{2}_{3}.tga", scene.Name, config.ImageWidth, config.ImageHeight, config.SamplesPerPixel); framebuffer.WriteToTGA(outputPath); Console.WriteLine("Render saved to {0}", outputPath); }
public RayTracerForm(RayTracer rayTracer) { Rectangle screenRectangle = RectangleToScreen(this.ClientRectangle); this.rayTracer = rayTracer; Width = 1024; Height = 512 + screenRectangle.Top - this.Top; SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); UpdateStyles(); }
public static void RunDemo() { var width = 400; var height = 400; Color[,] bitmap = new Color[width, height]; RayTracer rayTracer = new RayTracer(width, height, (int x, int y, Color color) => { bitmap[x, y] = color; }); rayTracer.Render(rayTracer.DemoScene); WritePPM("demo.ppm", bitmap); }
private void RayTracerForm_Load(object sender, EventArgs e) { this.Show(); RayTracer rayTracer = new RayTracer(width, height, (int x, int y, System.Drawing.Color color) => { bitmap.SetPixel(x, y, color); if (x == 0) { pictureBox.Refresh(); } }); rayTracer.Render(rayTracer.DefaultScene); pictureBox.Invalidate(); }
public static void Run(string inputFile, string outputFile) { var vs = RayTracer.ReadScene(inputFile); var view = vs.Item1; var width = view.Item1; var height = view.Item2; Color[,] bitmap = new Color[width, height]; RayTracer rayTracer = new RayTracer(width, height, (int x, int y, Color color) => { bitmap[x, y] = color; }); rayTracer.Render(vs.Item2); WritePPM(outputFile, bitmap); }
static void Main(string[] args) { var camera = new Camera(width, height, Utility.MakeVector(new double[] { 0, 0, 0 }), Utility.MakeVector(new double[] { 0, 0, 0 }), Math.PI / 2); var bitmap = new DirectBitmap((int)width, (int)height); var scene = GetScene(); var lights = GetLights(); var rayTracer = new RayTracer(camera, bitmap, scene, lights); rayTracer.RayTrace(); bitmap.UnlockBits(); bitmap.Save("output.bmp"); }
private static void Main() { const int width = 4 * 1920; const int height = 4 * 1080; var spheres = Enumerable.Range(0, 100).Select(_ => SphereBuilder.Begin .WithinX(0, width) .WithinY(0, height) .WithinZ(0, 600) .WithinRadius(100, 500) .Build()).ToArray(); var raytracer = new RayTracer(spheres); for (var w = 0; w < 4; w++) { var sw = Stopwatch.StartNew(); var bmp = raytracer.Trace(width, height); Console.WriteLine("{0} ms", sw.ElapsedMilliseconds); bmp.Save($"result-{w}.png", ImageFormat.Png); } }
private void bTest1Click(object sender, RoutedEventArgs e) { SetupScene(Convert.ToInt32(this.tbStepRange.Text)); binding.SendTimeout = new TimeSpan(0, 2, 0); int n = Clients.ListClients.Count; for (int i = n - 1; i >= 0; i--) //при повторном запуске задачи проверяет наличие соединения между сервером и клиентом { //чтобы убрать из списка клиентов те клиенты, которые выдали ошибку при предыдущем вычислении задачи. try //Если же соединение было обнаружено, то клиент остается в списке { if (Clients.ListClients [i].Done == "Not ready") { ClientServiceClient client = new ClientServiceClient(binding, new EndpointAddress("http://" + Clients.ListClients [i].IP + ":8734/ClientService/")); if (client.CheckConnection() == true) { Clients.ListClients [i].Done = " "; } } } catch (Exception) { Clients.RemoveClient(Clients.ListClients [i].IP); } } RayTracer.RayTracer raytracer = new RayTracer.RayTracer(antiAliasing, renderDiffuse, renderHighlights, renderShadow, renderReflection, renderRefraction); clients = new ClientServiceClient [Clients.ListClients.Count]; Steps = Convert.ToInt32(tbRectangles.Text); // # of rectangles for (int i = 0; i < Clients.ListClients.Count; i++) { EndpointAddress address = new EndpointAddress("http://" + Clients.ListClients [i].IP + ":8734/ClientService/"); clients [i] = new ClientServiceClient(binding, address); clients [i].PerfomanceCompleted += MainWindow_PerfomanceCompleted; clients [i].PerfomanceAsync(scene, rect, raytracer, Steps, i); } bGO.IsEnabled = true; }
private void OnLineRendered(int rowNumber, RayTracer.Color[] lineColors) { var colors = ColorsToBRGA32(lineColors); InvokeOnApplicationDispatcher(() => WriteColorsToBitmap(rowNumber, colors)); linesRendered++; if (linesRendered == totalLines) { var totalTime = (DateTime.UtcNow - renderStartTime).TotalMilliseconds; SetRenderTimeText(totalTime); } }
public static void LoadScene(string inputFile) { s = RayTracer.ReadScene(inputFile); r = new RayTracer(width, height, (int x, int y, Color c) => {}); }
private unsafe void RayTracerForm_Load(object sender, EventArgs e) { Stopwatch timer = Stopwatch.StartNew(); this.Show(); var bits = bitmap.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); RayTracer rayTracer = new RayTracer(width, height, (byte *)bits.Scan0); rayTracer.Render(rayTracer.DefaultScene); bitmap.UnlockBits(bits); timer.Stop(); Console.WriteLine(timer.ElapsedMilliseconds + " ms"); }
async static Task Main(string[] args) // args contains one input, scene filename { var utf8 = new UTF8Encoding(); UdpClient server = new UdpClient(3334); bool notReceivedFirstPacket = true; var listener = server.ReceiveAsync(); byte[] initialLine = new byte[0]; IPEndPoint clientIP = null; while (notReceivedFirstPacket) { var action = Task.WaitAny(listener); switch (action) { case 0: var firstPacket = await listener; initialLine = firstPacket.Buffer; clientIP = firstPacket.RemoteEndPoint; notReceivedFirstPacket = false; break; default: break; } } String[] decodedLine = utf8.GetString(initialLine, 0, initialLine.Length).Split("~"); String[] sceneFile = new String[Int32.Parse(decodedLine[1])]; sceneFile[Int32.Parse(decodedLine[0]) - 1] = decodedLine[2]; int width = Int32.Parse(decodedLine[3]); int height = Int32.Parse(decodedLine[4]); listener = server.ReceiveAsync(); var timeout = Task.Delay(500); var sceneNotComplete = true; while (sceneNotComplete) { var action = Task.WaitAny(listener, timeout); switch (action) { case 0: var sceneLine = await listener; decodedLine = utf8.GetString(sceneLine.Buffer).Split("~"); sceneFile[Int32.Parse(decodedLine[0]) - 1] = decodedLine[2]; if (sceneFile.Count(l => l == null) == 0) { sceneNotComplete = false; } listener = server.ReceiveAsync(); break; case 1: // timeout and we don't have every line var missingIndices = sceneFile.Select((l, i) => new { l, i }) .Where(o => o.l == null) .Select(o => o.i); foreach (var index in missingIndices) { var missingLine = PackMissingLine(index); server.Send(missingLine, missingLine.Length, clientIP); } timeout = Task.Delay(500); break; default: break; } } listener = server.ReceiveAsync(); var tracerScene = RayTracer.RayTracer.ReadScene(sceneFile); RayTracer.RayTracer rayTracer = new RayTracer.RayTracer(width, height); server.Send(new byte[0], 0, clientIP); // Confirmation var jobNotComplete = true; while (jobNotComplete) { var action = Task.WaitAny(listener); switch (action) { case 0: var clientRequest = await listener; var bufferedRequest = clientRequest.Buffer; var packetLength = bufferedRequest.Length; if (packetLength == 4) // ensure this is a request { var y = UnpackLineRequest(bufferedRequest); var returnTrace = rayTracer.Render(tracerScene.Item2, y); server.Send(returnTrace, returnTrace.Length, clientIP); } else if (packetLength == 0) //confirmation from client that job is finished { jobNotComplete = false; } listener = server.ReceiveAsync(); break; default: break; } } }
private int[] ColorsToBRGA32(RayTracer.Color[] lineColors) { var int32Colors = new Int32[lineColors.Length]; for (int i = 0; i < lineColors.Length; i++) { int32Colors[i] = RayTracer.Color.ToBGRA32(lineColors[i]); } return int32Colors; }
private void RayTracerForm_Load(object sender, EventArgs e) { this.Show(); RayTracer rayTracer = new RayTracer(width, height, (int x, int y, System.Drawing.Color color) => { bitmap.SetPixel(x, y, color); if (x == 0) pictureBox.Refresh(); }); rayTracer.Render(rayTracer.DefaultScene); pictureBox.Invalidate(); }
public Tuple <Bitmap, int, RayTracer.RayTracer, int, DateTime> RayTraceRows(Scene scene, Rectangle viewport, int startRow, int numberOfRowsToTrace, RayTracer.RayTracer raytracer, int numberOfRange) { Console.SetCursorPosition(10, 2); Console.Write(" "); int maxsamples = (int)raytracer.AntiAliasing; RayTracer.Color [ , ] buffer = new RayTracer.Color [viewport.Width + 2, numberOfRowsToTrace + 2]; DateTime timestart = DateTime.Now; Bitmap image = new Bitmap(viewport.Width, numberOfRowsToTrace); int y = 0; for (y = startRow; y < (startRow + numberOfRowsToTrace) + 2; y++) { for (int x = 0; x < viewport.Width + 2; x++) { double yp = y * 1.0f / viewport.Height * 2 - 1; double xp = x * 1.0f / viewport.Width * 2 - 1; Ray ray = scene.Camera.GetRay(xp, yp); // this will trigger the raytracing algorithm buffer [x, y - startRow] = raytracer.CalculateColor(ray, scene); // if current line is at least 2 lines into the scan if ((x > 1) && (y > startRow + 1)) { if (raytracer.AntiAliasing != AntiAliasing.None) { RayTracer.Color avg = (buffer [x - 2, y - startRow - 2] + buffer [x - 1, y - startRow - 2] + buffer [x, y - startRow - 2] + buffer [x - 2, y - startRow - 1] + buffer [x - 1, y - startRow - 1] + buffer [x, y - startRow - 1] + buffer [x - 2, y - startRow] + buffer [x - 1, y - startRow] + buffer [x, y - startRow]) / 9; if (raytracer.AntiAliasing == AntiAliasing.Quick) { // this basically implements a simple mean filter // it quick but not very accurate buffer [x - 1, y - startRow - 1] = avg; } else { // use a more accurate antialasing method (MonteCarlo implementation) // this will fire multiple rays per pixel if (avg.Distance(buffer [x - 1, y - startRow - 1]) > 0.18) // 0.18 is a treshold for detailed aliasing { for (int i = 0; i < maxsamples; i++) { // get some 'random' samples double rx = Math.Sign(i % 4 - 1.5) * (raytracer.IntNoise(x + y * viewport.Width * maxsamples * 2 + i) + 1) / 4; // interval <-0.5, 0.5> double ry = Math.Sign(i % 2 - 0.5) * (raytracer.IntNoise(x + y * viewport.Width * maxsamples * 2 + 1 + i) + 1) / 4; // interval <-0.5, 0.5> xp = (x - 1 + rx) * 1.0f / viewport.Width * 2 - 1; yp = (y - 1 + ry) * 1.0f / viewport.Height * 2 - 1; ray = scene.Camera.GetRay(xp, yp); // execute even more ray traces, this makes detailed anti-aliasing expensive buffer [x - 1, y - startRow - 1] += raytracer.CalculateColor(ray, scene); } buffer [x - 1, y - startRow - 1] /= (maxsamples + 1); } } } image.SetPixel(x - 2, y - startRow - 2, buffer [x - 1, y - startRow - 1].ToArgb()); } } //if ( ((y - startRow) / numberOfRowsToTrace * 100) % 10 == 0 ) //{ // Console.SetCursorPosition(10, 3); // Console.Write(((y-startRow) / numberOfRowsToTrace * 100) + "% "); //} } Console.SetCursorPosition(10, 3); Console.Write(100 + "% "); return(Tuple.Create <Bitmap, int, RayTracer.RayTracer, int, DateTime>(image, numberOfRange, raytracer, startRow, timestart)); }