Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ejemplo PathTracing en .Net ( conversión de SmallPT) y problemas conParallel.For

Iniciado por XÑA, 21 de Octubre de 2013, 10:38:17 AM

« anterior - próximo »

XÑA

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

XÑA

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/







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.