public void AdvancePaths(FilmFrame fframe) { for (int i = 0; i < populationSize; i++) { var pathRadiance = EvaluatePath(paths[i].Vertices); var offset = (int)(Width * paths[i].Sample.ImageY + paths[i].Sample.ImageX); fframe.Data[offset] += pathRadiance; fframe.Weight[offset] += 1f; } }
public override void StartRendering(Action<IFilmFrame, int> taskCallback, Action<IFilmFrame> endTaskCallback) { var filmFrame = new FilmFrame(Width, Height); Console.Write("Rendering :["); #if PL Parallel.For(0, Height, new ParallelOptions() { CancellationToken = this.cancelToken.Token, MaxDegreeOfParallelism = CpuThreadsUsed }, ( y) => #else for (int y = 0; y < height; y++) #endif { for (int x = 0; x < Width; x++) { for (int n = 0; n < this.samplesPerPixel; n++) { int ny = y; IRay ray; camera.GetRay(x + (1f - rnd.Value.NextFloat()), (ny) + (1f - rnd.Value.NextFloat()), out ray); var pixelColor = Trace((RayInfo) ray, 1.0f, Air, 0); if (!pixelColor.IsBlack()) { //unchecked { filmFrame.Data[unchecked(x + y * Width)] = pixelColor; filmFrame.Weight[unchecked(x + y * Width)] += 1f; } } } } //for( int x=0; x<width;x++ ) // output.SetPixel(pixels[x + y * width].X, pixels[x + y * width].Y, (pixels[x + y * width].Data / pixels[x + y * width].Weight).ToColor()); taskCallback(filmFrame, y); } #if PL ); #endif if (endTaskCallback != null) endTaskCallback(filmFrame); }
public override void StartRendering(Action<IFilmFrame, int> taskCallback, Action<IFilmFrame> endTaskCallback) { var frame = new FilmFrame(Width, Height); var start = DateTime.UtcNow; Console.Write("Rendering :["); ProcessSamples(frame, taskCallback); stats.elapsed = DateTime.UtcNow - start; if (endTaskCallback != null) endTaskCallback(frame); Console.WriteLine("{0:F9} MRays /sec", (stats.TotalRays / (double)stats.elapsed.Seconds) * 0.000001); Console.WriteLine("{0} Shadows samples per path", shadowRayCount); Console.WriteLine("{0} Triangles", scene.Geometry.Select(item => item.IndexData.Count / 3).Sum()); }
private void ProcessSamples(FilmFrame fframe, Action<IFilmFrame, int> taskCallback) { bool done = false; int iteration = 0; var sw = new Stopwatch(); sw.Start(); while (!done) { for (int i = 0; i < SamplesPerIteration; i++) { samples[i] = sampler.GetNextSample(rnd.Value); } Parallel.ForEach(samples, new ParallelOptions() { MaxDegreeOfParallelism = CpuThreadsUsed }, sample => { #if VERBOSE try { #endif IRay ray; camera.GetRay(sample.ImageX, sample.ImageY, out ray); var eyePathradiance = this.EvaluatePath(PropagatePath((RayInfo)ray, MaxRecursionLevel)); var offset = (int)(Width * sample.ImageY + sample.ImageX); fframe.Data[offset] += eyePathradiance; fframe.Weight[offset] += 1f; stats.totalSamples = Interlocked.Increment(ref stats.totalSamples); stats.elapsed = sw.Elapsed; #if VERBOSE } catch(Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } #endif }); taskCallback(fframe, iteration); iteration++; done = sampler.SamplesPerPixel < sampler.CurrentPass; } sw.Stop(); }