public bool Execute(RenderJobCallBackDelegate progressCallBackAction = null) { bool result = false; if (renderTasks != null) { for (int i = 0; i < renderTasks.Length; i++) { if (renderTasks[i] != null) { if (renderTasks[i].Execute(progressCallBackAction)) { result = true; ExecuteCommand(renderTasks[i].finishCommand); } } } if (result) { ExecuteCommand(finishCommand); } } return(result); }
protected override IRenderResult OnRender(RenderConfig config, RenderJobCallBackDelegate progressCallBackAction) { CameraBase camera = m_Scene.camera; if (camera == null) { throw new System.ArgumentNullException(); } Texture result = new Texture(config.width, config.height); camera.SetRenderTarget(result); RenderJob <PathTracerRenderJobResult, PathTracer> job = new RenderJob <PathTracerRenderJobResult, PathTracer>(config, m_Scene, this); for (int j = 0; j < camera.renderTarget.height; j += 32) { for (int i = 0; i < camera.renderTarget.width; i += 32) { job.AddWork(new PathTracerRenderWork(i, j, (int)config.width, (int)config.height)); } } job.Render(camera.renderTarget, progressCallBackAction); return(result); }
public void Render(IRenderResult renderResult, RenderJobCallBackDelegate progressCallBackAction = null) { int total = m_Works.Count; Task[] tasks = new Task[m_Jobs.Length]; for (int i = 0; i < m_Jobs.Length; i++) { tasks[i] = Task.Run(new Action(m_Jobs[i].Render)); } while (m_Works.Count > 0) { m_ResetEvent.WaitOne(); m_ResetEvent.Reset(); //if (m_Results.Count > 0) //{ // T result = default(T); // if (!m_Results.TryDequeue(out result)) // break; // progressCallBackAction?.Invoke(total - m_Works.Count, total, result); //} progressCallBackAction?.Invoke(total - m_Works.Count, total); } //等待所有任务结束 Task.WaitAll(tasks); if (renderResult != null) { while (m_Results.Count > 0) { T result = default(T); if (!m_Results.TryDequeue(out result)) { return; } if (result != null) { result.ApplyToRenderResult(renderResult); } } } }
public IRenderResult Render(RenderConfig config, RenderJobCallBackDelegate progressCallBackAction = null) { if (m_Scene == null) { throw new System.ArgumentNullException(); } this.tracingTimes = config.traceTimes; #if DEBUG this.isDebugging = false; #endif try { return(OnRender(config, progressCallBackAction)); } catch (System.Exception e) { Log.Err(e.Message); Log.Err(e.StackTrace); } return(null); }
public bool Execute(RenderJobCallBackDelegate progressCallBackAction = null) { if (string.IsNullOrEmpty(scenePath)) { return(false); } if (File.Exists(scenePath) == false) { return(false); } if (string.IsNullOrEmpty(outputPath)) { return(false); } FileInfo outputFileInfo = new FileInfo(outputPath); if (outputFileInfo.Directory == null) { return(false); } if (bounceTimes <= 0) { return(false); } if (numSamples <= 0) { return(false); } if (width <= 0 || height <= 0) { return(false); } var scene = Scene.Create(scenePath); var pt = new PathTracer(scene); RenderConfig config = new RenderConfig() { traceTimes = bounceTimes, samplerType = samplerType, numSamples = numSamples, numSets = 83, width = (uint)width, height = (uint)height, }; var tex = pt.Render(config, progressCallBackAction); if (outputFileInfo.Directory.Exists) { outputFileInfo.Directory.Create(); } if (saveHDR) { tex.Save(Path.Combine(outputFileInfo.FullName, ".hdr")); //tex.SaveToHDR(Path.Combine(outputFileInfo.FullName, ".hdr")); } else { //var bitmap = tex.TransferToBMP(null, 0.45f, tonemapping ? exposure : -1.0f); //FileStream stream = new FileStream(outputFileInfo.FullName, FileMode.Create, FileAccess.Write); //bitmap.Save(stream, ImageFormat.Bmp); //stream.Close(); //bitmap.Dispose(); tex.Save(outputFileInfo.FullName); } return(true); }
protected abstract IRenderResult OnRender(RenderConfig config, RenderJobCallBackDelegate progressCallBackAction);