Пример #1
0
        private void RenderOthers(List <RenderCore> list, RenderType filter, IRenderContext context, IDeviceContextPool deviceContextPool,
                                  ref RenderParameter parameter,
                                  CommandList[] commandsArray, int idx)
        {
            var deviceContext = deviceContextPool.Get();

            SetRenderTargets(deviceContext, ref parameter);
            bool hasValue = false;

            for (int i = 0; i < list.Count; ++i)
            {
                if (list[i].RenderType == filter)
                {
                    list[i].Render(context, deviceContext);
                    hasValue = true;
                }
            }
            if (hasValue)
            {
                commandsArray[idx] = deviceContext.DeviceContext.FinishCommandList(true);
            }
            else
            {
                commandsArray[idx] = null;
            }
            deviceContextPool.Put(deviceContext);
        }
 /// <summary>
 /// Sets the render targets.
 /// </summary>
 /// <param name="parameter">The parameter.</param>
 public void SetRenderTargets(ref RenderParameter parameter)
 {
     ImmediateContext.SetRenderTargets(parameter.DepthStencilView, parameter.RenderTargetView);
     ImmediateContext.SetViewport(ref parameter.ViewportRegion);
     ImmediateContext.SetScissorRectangle(parameter.ScissorRegion.Left, parameter.ScissorRegion.Top,
                                          parameter.ScissorRegion.Right, parameter.ScissorRegion.Bottom);
 }
Пример #3
0
        /// <summary>
        /// Renders the scene.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="renderables">The renderables.</param>
        /// <param name="parameter">The parameter.</param>
        public override void RenderScene(IRenderContext context, List <RenderCore> renderables, ref RenderParameter parameter)
        {
            if (scheduler.ScheduleAndRun(renderables, deferredContextPool, context, parameter, RenderType.Opaque, commandList))
            {
                RenderParameter param = parameter;
                renderOthersTask = Task.Run(() =>
                {
                    RenderOthers(renderables, RenderType.Particle, context, deferredContextPool, ref param, postCommandList, 0);
                    RenderOthers(renderables, RenderType.Transparent, context, deferredContextPool, ref param, postCommandList, 1);
                });

                foreach (var command in commandList.OrderBy(x => x.Key))
                {
                    ImmediateContext.DeviceContext.ExecuteCommandList(command.Value, true);
                    command.Value.Dispose();
                }

                commandList.Clear();
                renderOthersTask.Wait();
                renderOthersTask = null;
                for (int i = 0; i < postCommandList.Length; ++i)
                {
                    if (postCommandList[i] != null)
                    {
                        ImmediateContext.DeviceContext.ExecuteCommandList(postCommandList[i], true);
                        RemoveAndDispose(ref postCommandList[i]);
                    }
                }
            }
            else
            {
                base.RenderScene(context, renderables, ref parameter);
            }
        }
            /// <summary>
            /// Renders the scene.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            /// <param name="testFrustum"></param>
            /// <returns>Number of node has been rendered</returns>
            public virtual int RenderOpaque(RenderContext context, FastList <SceneNode> renderables,
                                            ref RenderParameter parameter, bool testFrustum)
            {
                var renderedCount = 0;
                var count         = renderables.Count;
                var frustum       = context.BoundingFrustum;

                if (!testFrustum)
                {
                    for (var i = 0; i < count; ++i)
                    {
                        renderables[i].Render(context, ImmediateContext);
                        ++renderedCount;
                    }
                }
                else
                {
                    for (var i = 0; i < count; ++i)
                    {
                        if (!renderables[i].TestViewFrustum(ref frustum))
                        {
                            continue;
                        }
                        renderables[i].Render(context, ImmediateContext);
                        ++renderedCount;
                    }
                }
                return(renderedCount);
            }
Пример #5
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="items"></param>
 /// <param name="pool"></param>
 /// <param name="context"></param>
 /// <param name="parameter"></param>
 /// <param name="filterType"></param>
 /// <param name="outputCommands"></param>
 /// <returns></returns>
 public bool ScheduleAndRun(List <RenderCore> items, IDeviceContextPool pool,
                            IRenderContext context, RenderParameter parameter, RenderType filterType, List <KeyValuePair <int, CommandList> > outputCommands)
 {
     outputCommands.Clear();
     if (items.Count > schedulerParams.MinimumDrawCalls)
     {
         var partitionParams = Partitioner.Create(0, items.Count, items.Count / schedulerParams.MaxNumberOfTasks + 1);
         Parallel.ForEach(partitionParams, (range, state) =>
         {
             var deferred = pool.Get();
             SetRenderTargets(deferred, ref parameter);
             for (int i = range.Item1; i < range.Item2; ++i)
             {
                 if (items[i].RenderType == filterType)
                 {
                     items[i].Render(context, deferred);
                 }
             }
             var command = deferred.DeviceContext.FinishCommandList(true);
             pool.Put(deferred);
             lock (outputCommands)
             {
                 outputCommands.Add(new KeyValuePair <int, CommandList>(range.Item1, command));
             }
         });
         return(true);
     }
     else
     {
         return(false);
     }
 }
        /// <summary>
        /// <see cref="DX11RenderHostBase.OnRender(TimeSpan)"/>
        /// </summary>
        /// <param name="time">The time.</param>
        protected override void OnRender(TimeSpan time)
        {
            var renderParameter = new RenderParameter()
            {
                RenderTargetView   = RenderTargetBufferView,
                DepthStencilView   = DepthStencilBufferView,
                ScissorRegion      = new Rectangle(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                ViewportRegion     = new ViewportF(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                RenderLight        = RenderConfiguration.RenderLights,
                UpdatePerFrameData = RenderConfiguration.UpdatePerFrameData
            };

            renderer.SetRenderTargets(ref renderParameter);
            renderer.UpdateGlobalVariables(RenderContext, lightNodes, ref renderParameter);
            renderer.RenderPreProc(RenderContext, preProcNodes, ref renderParameter);
            numRendered += renderer.RenderOpaque(RenderContext, opaqueNodes, ref renderParameter);
            numRendered += renderer.RenderOpaque(RenderContext, particleNodes, ref renderParameter);
            numRendered += renderer.RenderTransparent(RenderContext, transparentNodes, ref renderParameter);
            getPostEffectCoreTask?.Wait();
            getPostEffectCoreTask = null;
            renderer.RenderPostProc(RenderContext, postProcNodes, ref renderParameter);
            renderer.RenderPostProc(RenderContext, screenSpacedNodes, ref renderParameter);
            numRendered += preProcNodes.Count + postProcNodes.Count + screenSpacedNodes.Count;
            renderer.RenderToBackBuffer(RenderContext, ref renderParameter);
        }
Пример #7
0
 private void SetRenderTargets(DeviceContextProxy context, ref RenderParameter parameter)
 {
     context.SetRenderTargets(parameter.DepthStencilView, parameter.RenderTargetView);
     context.SetViewport(ref parameter.ViewportRegion);
     context.SetScissorRectangle(parameter.ScissorRegion.Left, parameter.ScissorRegion.Top,
                                 parameter.ScissorRegion.Right, parameter.ScissorRegion.Bottom);
 }
Пример #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="items"></param>
        /// <param name="pool"></param>
        /// <param name="context"></param>
        /// <param name="parameter"></param>
        /// <param name="outputCommands"></param>
        /// <param name="numRendered"></param>
        /// <returns></returns>
        public bool ScheduleAndRun(List <SceneNode> items, IDeviceContextPool pool,
                                   RenderContext context, RenderParameter parameter, List <KeyValuePair <int, CommandList> > outputCommands, out int numRendered)
        {
            outputCommands.Clear();
            int totalCount = 0;

            numRendered = 0;
            Exception exception = null;

            if (items.Count > schedulerParams.MinimumDrawCalls)
            {
                var frustum         = context.BoundingFrustum;
                var partitionParams = Partitioner.Create(0, items.Count, items.Count / schedulerParams.MaxNumberOfTasks + 1);
                Parallel.ForEach(partitionParams, (range, state) =>
                {
                    try
                    {
                        int counter  = 0;
                        var deferred = pool.Get();
                        SetRenderTargets(deferred, ref parameter);
                        for (int i = range.Item1; i < range.Item2; ++i)
                        {
                            if (context.EnableBoundingFrustum && !items[i].TestViewFrustum(ref frustum))
                            {
                                continue;
                            }
                            items[i].RenderCore.Render(context, deferred);
                            ++counter;
                        }
                        var command = deferred.FinishCommandList(true);
                        pool.Put(deferred);
                        lock (outputCommands)
                        {
                            outputCommands.Add(new KeyValuePair <int, CommandList>(range.Item1, command));
                            totalCount += counter;
                        }
                    }
                    catch (Exception ex)
                    {
                        exception = ex;
                    }
                });
                numRendered = totalCount;
                if (exception != null)
                {
                    throw exception;
                }
                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Renders to back buffer.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="parameter">The parameter.</param>
        public virtual void RenderToBackBuffer(RenderContext context, ref RenderParameter parameter)
        {
            var buffer = context.RenderHost.RenderBuffer;

            if (parameter.IsMSAATexture)
            {
                ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.BackBuffer.Resource, 0, buffer.Format);
            }
            else
            {
                ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.BackBuffer.Resource);
            }
        }
            /// <summary>
            /// Renders to ping pong buffer.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderToPingPongBuffer(RenderContext context, ref RenderParameter parameter)
            {
                var buffer = context.RenderHost.RenderBuffer;

                buffer.FullResPPBuffer.Initialize();
                if (parameter.IsMSAATexture)
                {
                    ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.FullResPPBuffer.CurrentTexture, 0, buffer.Format);
                }
                else
                {
                    ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture);
                }
            }
            /// <summary>
            /// Renders the screen spaced.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="start">Start index in renderables</param>
            /// <param name="count">Number of renderables to render.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, int start, int count,
                                                   ref RenderParameter parameter)
            {
                if (count > 0)
                {
                    var buffer             = context.RenderHost.RenderBuffer;
                    var depthStencilBuffer = parameter.IsMSAATexture ? buffer.DepthStencilBuffer : buffer.DepthStencilBufferNoMSAA;
                    ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                    for (var i = start; i < start + count; ++i)
                    {
                        renderables[i].Render(context, ImmediateContext);
                    }
                }
            }
Пример #12
0
        /// <summary>
        /// <see cref="DX11RenderHostBase.OnRender(TimeSpan)"/>
        /// </summary>
        /// <param name="time">The time.</param>
        protected override void OnRender(TimeSpan time)
        {
            var renderParameter = new RenderParameter()
            {
                RenderTargetView     = new global::SharpDX.Direct3D11.RenderTargetView[] { RenderTargetBufferView },
                DepthStencilView     = DepthStencilBufferView,
                CurrentTargetTexture = RenderBuffer.ColorBuffer.Resource,
                IsMSAATexture        = RenderBuffer.ColorBufferSampleDesc.Count > 1,
                ScissorRegion        = new Rectangle(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                ViewportRegion       = new ViewportF(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                RenderLight          = RenderConfiguration.RenderLights,
                UpdatePerFrameData   = RenderConfiguration.UpdatePerFrameData
            };

            renderer.SetRenderTargets(ref renderParameter);
            renderer.UpdateGlobalVariables(RenderContext, lightNodes, ref renderParameter);
            for (int i = 0; i < needUpdateCores.Count; ++i)
            {
                needUpdateCores[i].Update(RenderContext, renderer.ImmediateContext);
            }
            renderer.RenderPreProc(RenderContext, preProcNodes, ref renderParameter);
            numRendered += renderer.RenderOpaque(RenderContext, opaqueNodes, ref renderParameter);
            numRendered += renderer.RenderOpaque(RenderContext, particleNodes, ref renderParameter);
            numRendered += renderer.RenderTransparent(RenderContext, transparentNodes, ref renderParameter);

            getPostEffectCoreTask?.Wait();
            getPostEffectCoreTask = null;
            if (RenderConfiguration.FXAALevel != FXAALevel.None || postProcNodes.Count > 0)
            {
                renderer.RenderToPingPongBuffer(RenderContext, ref renderParameter);
                renderParameter.IsMSAATexture = false;
                renderer.RenderPostProc(RenderContext, postProcNodes, ref renderParameter);
                renderParameter.CurrentTargetTexture = RenderBuffer.FullResPPBuffer.CurrentTexture;
                renderParameter.RenderTargetView     = new global::SharpDX.Direct3D11.RenderTargetView[] { RenderBuffer.FullResPPBuffer.CurrentRTV };
            }

            renderer.RenderScreenSpaced(RenderContext, screenSpacedNodes, ref renderParameter);
            renderer.RenderToBackBuffer(RenderContext, ref renderParameter);
            numRendered += preProcNodes.Count + postProcNodes.Count + screenSpacedNodes.Count;
            if (ShowRenderDetail != RenderDetail.None)
            {
                getTriangleCountTask?.Wait();
                renderStatistics.NumModel3D = perFrameFlattenedScene.Count;
                renderStatistics.NumCore3D  = numRendered;
            }
        }
        /// <summary>
        /// Renders the scene.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="renderables">The renderables.</param>
        /// <param name="parameter">The parameter.</param>
        /// <returns>Number of node has been rendered</returns>
        public override int RenderOpaque(RenderContext context, List <SceneNode> renderables, ref RenderParameter parameter)
        {
            if (scheduler.ScheduleAndRun(renderables, deferredContextPool, context, parameter, commandList, out int counter))
            {
                RenderParameter param = parameter;

                foreach (var command in commandList.OrderBy(x => x.Key))
                {
                    ImmediateContext.ExecuteCommandList(command.Value, true);
                    command.Value.Dispose();
                }
                commandList.Clear();
                return(counter);
            }
            else
            {
                return(base.RenderOpaque(context, renderables, ref parameter));
            }
        }
            /// <summary>
            /// Renders the screen spaced.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="start">Start index in renderables</param>
            /// <param name="count">Number of renderables to render.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, int start, int count,
                                                   ref RenderParameter parameter)
            {
                if (count > 0)
                {
                    var hasMSAA            = context.RenderHost.RenderBuffer.ColorBufferSampleDesc.Count == 1;
                    var buffer             = context.RenderHost.RenderBuffer;
                    var depthStencilBuffer = hasMSAA ? buffer.DepthStencilBuffer : context.GetOffScreenDS(OffScreenTextureSize.Full, Format.D32_Float_S8X24_UInt);
                    ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                    for (var i = start; i < start + count; ++i)
                    {
                        renderables[i].Render(context, ImmediateContext);
                    }
                    if (!hasMSAA)
                    {
                        depthStencilBuffer.Dispose();
                    }
                }
            }
            /// <summary>
            /// Renders to back buffer.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderToBackBuffer(RenderContext context, ref RenderParameter parameter)
            {
                if (context.RenderHost.FeatureLevel >= global::SharpDX.Direct3D.FeatureLevel.Level_11_0 &&
                    context.RenderHost.RenderConfiguration.FXAALevel != FXAALevel.None)
                {
                    postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel;
                    postFXAACore.Render(context, ImmediateContext);
                }
                ImmediateContext.Flush();
                var buffer = context.RenderHost.RenderBuffer;

                if (parameter.IsMSAATexture)
                {
                    ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.BackBuffer.Resource, 0, buffer.Format);
                }
                else
                {
                    ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.BackBuffer.Resource);
                }
            }
Пример #16
0
        private void menuFileExport_Click(object sender, EventArgs e)
        {
            if (mesh != null)
            {
                FormExport export = new FormExport();

                string file = settings.OfdDirectory;

                if (!file.EndsWith("\\"))
                {
                    file += "\\";
                }

                file += settings.CurrentFile;

                export.ImageName = Path.ChangeExtension(file, ".png");

                if (export.ShowDialog() == DialogResult.OK)
                {
                    int format = export.ImageFormat;
                    int size   = export.ImageSize;

                    if (format == 1)
                    {
                        EpsImage eps = new EpsImage();
                        eps.Export(this.mesh, export.ImageName, size);
                    }
                    else if (format == 2)
                    {
                        SvgImage svg = new SvgImage();
                        svg.Export(this.mesh, export.ImageName, size);
                    }
                    else
                    {
                        RasterImage img = new RasterImage();
                        img.ColorScheme = RenderParameter.LightScheme();
                        img.Export(this.mesh, export.ImageName, size);
                    }
                }
            }
        }
Пример #17
0
        /// <summary>
        /// <see cref="DX11RenderHostBase.OnRender(TimeSpan)"/>
        /// </summary>
        /// <param name="time">The time.</param>
        protected override void OnRender(TimeSpan time)
        {
            var renderParameter = new RenderParameter()
            {
                RenderTargetView   = RenderTargetBufferView,
                DepthStencilView   = DepthStencilBufferView,
                ScissorRegion      = new Rectangle(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                ViewportRegion     = new ViewportF(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                RenderLight        = RenderConfiguration.RenderLights,
                UpdatePerFrameData = RenderConfiguration.UpdatePerFrameData
            };

            renderer.SetRenderTargets(ref renderParameter);
            renderer.UpdateGlobalVariables(RenderContext, lightRenderables, ref renderParameter);
            renderer.RenderPreProc(RenderContext, preProcRenderCores, ref renderParameter);
            renderer.RenderScene(RenderContext, generalRenderCores, ref renderParameter);
            getPostEffectCoreTask?.Wait();
            getPostEffectCoreTask = null;
            renderer.RenderPostProc(RenderContext, postProcRenderCores, ref renderParameter);
            renderer.RenderPostProc(RenderContext, screenSpacedRenderCores, ref renderParameter);
        }
        public virtual void RenderToBackBuffer(RenderContext context, ref RenderParameter parameter)
        {
            var buffer = context.RenderHost.RenderBuffer;

            if (context.RenderHost.RenderConfiguration.FXAALevel == FXAALevel.None || buffer.ColorBufferSampleDesc.Count > 1)
            {
                ImmediateContext.DeviceContext.Flush();
                switch (buffer.ColorBufferSampleDesc.Count)
                {
                case 1:
                    ImmediateContext.DeviceContext.CopyResource(buffer.ColorBuffer.Resource, buffer.BackBuffer.Resource);
                    break;

                default:
                    ImmediateContext.DeviceContext.ResolveSubresource(buffer.ColorBuffer.Resource, 0, buffer.BackBuffer.Resource, 0, Format.B8G8R8A8_UNorm);
                    break;
                }
            }
            else
            {
                postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel;
                postFXAACore.Render(context, ImmediateContext);
            }
        }
        /// <summary>
        /// Renders to ping pong buffer.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="parameter">The parameter.</param>
        public virtual void RenderToPingPongBuffer(RenderContext context, ref RenderParameter parameter)
        {
            var buffer = context.RenderHost.RenderBuffer;

            buffer.FullResPPBuffer.Initialize();
            if (context.RenderHost.FeatureLevel < global::SharpDX.Direct3D.FeatureLevel.Level_11_0 ||
                context.RenderHost.RenderConfiguration.FXAALevel == FXAALevel.None || parameter.IsMSAATexture)
            {
                if (parameter.IsMSAATexture)
                {
                    ImmediateContext.ResolveSubresource(parameter.CurrentTargetTexture, 0, buffer.FullResPPBuffer.CurrentTexture, 0, buffer.Format);
                }
                else
                {
                    ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture);
                }
            }
            else
            {
                ImmediateContext.CopyResource(parameter.CurrentTargetTexture, buffer.FullResPPBuffer.CurrentTexture);
                postFXAACore.FXAALevel = context.RenderHost.RenderConfiguration.FXAALevel;
                postFXAACore.Render(context, ImmediateContext);
            }
        }
Пример #20
0
            /// <summary>
            /// <see cref="DX11RenderHostBase.OnRender(TimeSpan)"/>
            /// </summary>
            /// <param name="time">The time.</param>
            protected override void OnRender(TimeSpan time)
            {
                var renderParameter = new RenderParameter()
                {
                    RenderTargetView     = new global::SharpDX.Direct3D11.RenderTargetView[] { RenderTargetBufferView },
                    DepthStencilView     = DepthStencilBufferView,
                    CurrentTargetTexture = RenderBuffer.ColorBuffer.Resource,
                    IsMSAATexture        = RenderBuffer.ColorBufferSampleDesc.Count > 1,
                    ScissorRegion        = new Rectangle(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                    ViewportRegion       = new ViewportF(0, 0, RenderBuffer.TargetWidth, RenderBuffer.TargetHeight),
                    RenderLight          = RenderConfiguration.RenderLights,
                    UpdatePerFrameData   = RenderConfiguration.UpdatePerFrameData
                };

                renderer.SetRenderTargets(ref renderParameter);
                renderer.UpdateGlobalVariables(RenderContext, lightNodes, ref renderParameter);
                for (var i = 0; i < needUpdateCores.Count; ++i)
                {
                    needUpdateCores[i].Update(RenderContext, renderer.ImmediateContext);
                }
                renderer.RenderPreProc(RenderContext, preProcNodes, ref renderParameter);
                numRendered += renderer.RenderOpaque(RenderContext, opaqueNodesInFrustum, ref renderParameter, false);
                numRendered += renderer.RenderOpaque(RenderContext, particleNodes, ref renderParameter, true);
                numRendered += renderer.RenderTransparent(RenderContext, transparentNodesInFrustum, ref renderParameter);

                getPostEffectCoreTask?.Wait();
                getPostEffectCoreTask = null;
                if (RenderConfiguration.FXAALevel != FXAALevel.None ||
                    postEffectNodes.Count > 0 || globalEffectNodes.Count > 0)
                {
                    renderer.RenderToPingPongBuffer(RenderContext, ref renderParameter);
                    renderParameter.IsMSAATexture        = false;
                    renderParameter.CurrentTargetTexture = RenderBuffer.FullResPPBuffer.CurrentTexture;
                    renderParameter.RenderTargetView[0]  = RenderBuffer.FullResPPBuffer.CurrentRTV;
                }
                if (postEffectNodes.Count > 0)
                {
                    renderer.RenderPostProc(RenderContext, postEffectNodes, ref renderParameter);
                    renderParameter.CurrentTargetTexture = RenderBuffer.FullResPPBuffer.CurrentTexture;
                    renderParameter.RenderTargetView[0]  = RenderBuffer.FullResPPBuffer.CurrentRTV;
                }
                if (globalEffectNodes.Count > 0)
                {
                    renderer.RenderPostProc(RenderContext, globalEffectNodes, ref renderParameter);
                    renderParameter.CurrentTargetTexture = RenderBuffer.FullResPPBuffer.CurrentTexture;
                    renderParameter.RenderTargetView[0]  = RenderBuffer.FullResPPBuffer.CurrentRTV;
                }
                if (screenSpacedNodes.Count > 0)
                {
                    var start = 0;
                    while (start < screenSpacedNodes.Count)
                    {
                        if (screenSpacedNodes[start].AffectsGlobalVariable)
                        {
                            nodesWithPostEffect.Clear();
                            var i = start + 1;
                            for (; i < screenSpacedNodes.Count; ++i)
                            {
                                if (screenSpacedNodes[i].AffectsGlobalVariable)
                                {
                                    break;
                                }
                                if (screenSpacedNodes[i].HasAnyPostEffect)
                                {
                                    nodesWithPostEffect.Add(screenSpacedNodes[i]);
                                }
                            }
                            renderer.RenderScreenSpaced(RenderContext, screenSpacedNodes, start, i - start, ref renderParameter);
                            renderer.RenderPostProc(RenderContext, postEffectNodes, ref renderParameter);
                            RenderContext.RestoreGlobalTransform();
                            start = i;
                        }
                        else
                        {
                            ++start;
                        }
                    }
                }
                renderer.RenderToBackBuffer(RenderContext, ref renderParameter);
                numRendered += preProcNodes.Count + postEffectNodes.Count + screenSpacedNodes.Count;
                if (ShowRenderDetail != RenderDetail.None)
                {
                    getTriangleCountTask?.Wait();
                    renderStatistics.NumModel3D = perFrameFlattenedScene.Count;
                    renderStatistics.NumCore3D  = numRendered;
                }
            }
        /// <summary>
        /// Renders the scene.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="renderables">The renderables.</param>
        /// <param name="parameter">The parameter.</param>
        /// <returns>Number of node has been rendered</returns>
        public virtual int RenderOpaque(RenderContext context, List <SceneNode> renderables, ref RenderParameter parameter)
        {
            int renderedCount = 0;
            int count         = renderables.Count;
            var frustum       = context.BoundingFrustum;

            for (int i = 0; i < count; ++i)
            {
                if (context.EnableBoundingFrustum && !renderables[i].TestViewFrustum(ref frustum))
                {
                    continue;
                }
                renderables[i].RenderCore.Render(context, ImmediateContext);
                ++renderedCount;
            }
            return(renderedCount);
        }
            /// <summary>
            /// Renders the screenspaced node's post proc.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="screenSpacedWithPostEffects"></param>
            /// <param name="nodesWithPostEffects"></param>
            /// <param name="postProcNodes"></param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderScreenSpacedPostProc(RenderContext context,
                                                           FastList <SceneNode> screenSpacedWithPostEffects,
                                                           FastList <SceneNode> nodesWithPostEffects,
                                                           FastList <SceneNode> postProcNodes, ref RenderParameter parameter)
            {
                var i = 0;

                while (i < screenSpacedWithPostEffects.Count)
                {
                    if (screenSpacedWithPostEffects[i].AffectsGlobalVariable)
                    {
                        context.RestoreGlobalTransform();
                        screenSpacedWithPostEffects[i].Render(context, ImmediateContext);
                        nodesWithPostEffects.Clear();
                        while (++i < screenSpacedWithPostEffects.Count &&
                               !screenSpacedWithPostEffects[i].AffectsGlobalVariable)
                        {
                            nodesWithPostEffects.Add(screenSpacedWithPostEffects[i]);
                        }
                        RenderPostProc(context, postProcNodes, ref parameter);
                        continue;
                    }
                    ++i;
                }
            }
            /// <summary>
            /// Renders the post proc.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderPostProc(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter)
            {
                var count = renderables.Count;

                for (var i = 0; i < count; ++i)
                {
                    renderables[i].Render(context, ImmediateContext);
                }
            }
            /// <summary>
            /// Renders the pre proc.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderPreProc(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter)
            {
                var count = renderables.Count;

                for (var i = 0; i < count; ++i)
                {
                    renderables[i].Render(context, ImmediateContext);
                }
                if (context.SSAOEnabled)
                {
                    preSSAOCore.Radius  = context.RenderHost.RenderConfiguration.SSAORadius;
                    preSSAOCore.Quality = context.RenderHost.RenderConfiguration.SSAOQuality;
                    preSSAOCore.Render(context, ImmediateContext);
                }
            }
        /// <summary>
        /// Renders the pre proc.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="renderables">The renderables.</param>
        /// <param name="parameter">The parameter.</param>
        public virtual void RenderPreProc(RenderContext context, List <SceneNode> renderables, ref RenderParameter parameter)
        {
            int count = renderables.Count;

            for (int i = 0; i < count; ++i)
            {
                renderables[i].RenderCore.Render(context, ImmediateContext);
            }
        }
            /// <summary>
            /// Renders the transparent.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            /// <returns></returns>
            public virtual int RenderTransparent(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter)
            {
                if (renderables.Count == 0)
                {
                    return(0);
                }
                if (context.RenderHost.RenderConfiguration.OITRenderType != OITRenderType.None &&
                    context.RenderHost.FeatureLevel >= global::SharpDX.Direct3D.FeatureLevel.Level_11_0)
                {
                    switch (context.RenderHost.RenderConfiguration.OITRenderType)
                    {
                    case OITRenderType.SinglePassWeighted:
                        oitWeightedCore.ExternRenderParameter = parameter;
                        oitWeightedCore.Render(context, ImmediateContext);
                        return(oitWeightedCore.RenderCount);

                    case OITRenderType.DepthPeeling:
                        oitDepthPeelingCore.ExternRenderParameter = parameter;
                        oitDepthPeelingCore.PeelingIteration      = context.OITDepthPeelingIteration;
                        oitDepthPeelingCore.Render(context, ImmediateContext);
                        return(oitDepthPeelingCore.RenderCount);
                    }
                }
                var renderedCount = 0;
                var count         = renderables.Count;

                for (var i = 0; i < count; ++i)
                {
                    renderables[i].Render(context, ImmediateContext);
                    ++renderedCount;
                }
                return(renderedCount);
            }
 /// <summary>
 /// Updates the global variables. Such as light buffer and global transformation buffer
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="lights">The lights.</param>
 /// <param name="parameter">The parameter.</param>
 public virtual void UpdateGlobalVariables(RenderContext context, FastList <SceneNode> lights, ref RenderParameter parameter)
 {
     ImmediateContext.Reset();
     if (parameter.RenderLight)
     {
         context.LightScene.LightModels.ResetLightCount();
         var count = lights.Count;
         for (var i = 0; i < count && i < Constants.MaxLights; ++i)
         {
             lights[i].Render(context, ImmediateContext);
         }
     }
     if (parameter.UpdatePerFrameData)
     {
         context.UpdatePerFrameData(ImmediateContext);
     }
 }
            /// <summary>
            /// Renders the screen spaced.
            /// </summary>
            /// <param name="context">The context.</param>
            /// <param name="renderables">The renderables.</param>
            /// <param name="parameter">The parameter.</param>
            public virtual void RenderScreenSpaced(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter)
            {
                int count = renderables.Count;

                if (count > 0)
                {
                    var  buffer     = context.RenderHost.RenderBuffer;
                    bool useDefault = parameter.RenderTargetView[0] == buffer.ColorBuffer.RenderTargetView;

                    var depthStencilBuffer = useDefault ? buffer.DepthStencilBuffer : context.GetOffScreenDS(OffScreenTextureSize.Full, Format.D32_Float_S8X24_UInt);
                    ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                    for (int i = 0; i < count; ++i)
                    {
                        renderables[i].Render(context, ImmediateContext);
                    }
                    if (!useDefault)
                    {
                        depthStencilBuffer.Dispose();
                    }
                }
            }
 /// <summary>
 /// Renders the transparent.
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="renderables">The renderables.</param>
 /// <param name="parameter">The parameter.</param>
 /// <returns></returns>
 public virtual int RenderTransparent(RenderContext context, FastList <SceneNode> renderables, ref RenderParameter parameter)
 {
     if (context.RenderHost.RenderConfiguration.EnableOITRendering &&
         context.RenderHost.FeatureLevel >= global::SharpDX.Direct3D.FeatureLevel.Level_11_0)
     {
         transparentRenderCore.ExternRenderParameter = parameter;
         transparentRenderCore.Render(context, ImmediateContext);
         return(transparentRenderCore.RenderCount);
     }
     else
     {
         int renderedCount = 0;
         var frustum       = context.BoundingFrustum;
         int count         = renderables.Count;
         for (int i = 0; i < count; ++i)
         {
             renderables[i].Render(context, ImmediateContext);
             ++renderedCount;
         }
         return(renderedCount);
     }
 }
        /// <summary>
        /// Renders the screen spaced.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="renderables">The renderables.</param>
        /// <param name="parameter">The parameter.</param>
        public virtual void RenderScreenSpaced(RenderContext context, List <SceneNode> renderables, ref RenderParameter parameter)
        {
            int count = renderables.Count;

            if (count > 0)
            {
                var  buffer     = context.RenderHost.RenderBuffer;
                bool useDefault = parameter.RenderTargetView[0] == buffer.ColorBuffer.RenderTargetView;

                var depthStencilBuffer = useDefault ? buffer.DepthStencilBuffer : buffer.FullResDepthStencilPool.Get(Format.D32_Float_S8X24_UInt);
                ImmediateContext.SetRenderTargets(depthStencilBuffer, parameter.RenderTargetView);

                for (int i = 0; i < count; ++i)
                {
                    renderables[i].RenderCore.Render(context, ImmediateContext);
                }
                if (!useDefault)
                {
                    buffer.FullResDepthStencilPool.Put(Format.D32_Float_S8X24_UInt, depthStencilBuffer);
                }
            }
        }