コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
                    }
                }
            }
        }
コード例 #4
0
ファイル: RendererBase.cs プロジェクト: AsehesL/PathTracer
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: RendererBase.cs プロジェクト: AsehesL/PathTracer
 protected abstract IRenderResult OnRender(RenderConfig config, RenderJobCallBackDelegate progressCallBackAction);