コード例 #1
0
 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;
                     }
                 }
             }
         }
     }
 }
コード例 #2
0
        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));
        }
コード例 #3
0
ファイル: LINQRaytracer.cs プロジェクト: quitec/ilspy
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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);
        }
コード例 #8
0
ファイル: RayTracer.cs プロジェクト: joshnewnham/webraytracer
        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();
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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");
        }
コード例 #11
0
ファイル: Program.cs プロジェクト: r3db/RayTracer
        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);
            }
        }
コード例 #12
0
        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;
        }
コード例 #13
0
ファイル: MainWindow.xaml.cs プロジェクト: h8null/csharpSIMD
 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);
     }
 }
コード例 #14
0
 public static void LoadScene(string inputFile)
 {
     s = RayTracer.ReadScene(inputFile);
     r = new RayTracer(width, height, (int x, int y, Color c) => {});
 }
コード例 #15
0
ファイル: Program.cs プロジェクト: sperling/RayTracer
        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");
        }
コード例 #16
0
        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;
                }
            }
        }
コード例 #17
0
ファイル: MainWindow.xaml.cs プロジェクト: h8null/csharpSIMD
        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;
        }
コード例 #18
0
ファイル: RayTracer.cs プロジェクト: okagawa/dashboard
 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();
 }
コード例 #19
0
        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));
        }