Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: XÑA en 21 de Octubre de 2013, 10:38:17 AM

Título: Ejemplo PathTracing en .Net ( conversión de SmallPT) y problemas conParallel.For
Publicado por: XÑA en 21 de Octubre de 2013, 10:38:17 AM
Hola, estoy convirtiendo SmallPT ( un path tracing hecho en 99 líneas en C) a .Net.
Y me he encontrado que Parallel.For NO me está funcionando. Cuando ejecuto el programa usando Parallel.For, parece que se queda como colgado, no me hace absolutamente nada...

No lo entiendo, la lógica es que cambiando el for(y) por el Parallel.For me debería funcionar...

¿Podeis echarle un vistazo, a ver qué está fallando? El código es muy sencillo...

Gracias

El código que me falla está en la clase Scene.cs. Si quitamos el Parallel.For, y lo sustituimos por el For que hay justo debajo, funciona perfectamente.... Oo


       void RayTrace(Ray cam, Vec cx, Vec cy, Vec r)
        {
            Parallel.For(0, height, (y) =>
            //for (int y = 0; y < height; y++)
            {
                // Loop over image rows

                for (ushort x = 0; x < width; x++)
                {// Loop cols
                    Xi[0] = 0;
                    Xi[1] = 0;
                    Xi[2] = (ushort)(y * y * y);

                    for (int sy = 0, i = (height - y - 1) * width + x; sy < 2; sy++)     // 2x2 subpixel rows
                        for (int sx = 0; sx < 2; sx++, r = new Vec())
                        {        // 2x2 subpixel cols
                            for (int s = 0; s < samps; s++)
                            {
                                double r1 = 2 * MathUtils.erand48(Xi), dx = r1 < 1 ? Math.Sqrt(r1) - 1 : 1 - Math.Sqrt(2 - r1);
                                double r2 = 2 * MathUtils.erand48(Xi), dy = r2 < 1 ? Math.Sqrt(r2) - 1 : 1 - Math.Sqrt(2 - r2);
                                Vec d = cx * (((sx + .5 + dx) / 2 + x) / width - .5) +
                                        cy * (((sy + .5 + dy) / 2 + y) / height - .5) + cam.d;
                                r = r + Radiance(new Ray(cam.o + d * 140, d.norm()), 0, Xi) * (1.0 / samps);
                            } // Camera rays are pushed ^^^^^ forward to start in interior
                            c[i] = c[i] + new Vec(MathUtils.clamp(r.x), MathUtils.clamp(r.y), MathUtils.clamp(r.z)) * .25;
                        }
                }

                onLineEnded(y);
            }
            );

            SaveImage();
        }


Código fuente: www.mallorcaaldia.com/FTP/SmallPT.rar (http://www.mallorcaaldia.com/FTP/SmallPT.rar)
Título: Re:Ejemplo PathTracing en .Net ( conversión de SmallPT) y problemas conParallel.For
Publicado por: XÑA en 24 de Octubre de 2013, 01:04:51 PM
Buenas, he añadido una entrada con el código, por si alguien quiere jugar un poco con Path Tracing en .Net...


http://javiermaura.wordpress.com/2013/10/24/smallpt-en-net/ (http://javiermaura.wordpress.com/2013/10/24/smallpt-en-net/)
Título: Re:Ejemplo PathTracing en .Net ( conversión de SmallPT) y problemas conParallel.For
Publicado por: Vicente en 24 de Octubre de 2013, 05:53:25 PM
A ver si tengo un rato para depurarlo, lo siento que aun no he podido :S