Inheritance: IDisposable
        private void Render(TimeSpan timeStamp)
        {
            var device = this.device;

            if (device == null)
            {
                return;
            }
            if (swapChain == null)
            {
                return;
            }
            if (renderRenderable != null)
            {
                // ---------------------------------------------------------------------------
                // this part is done only if the scene is not attached
                // it is an attach and init pass for all elements in the scene-graph
                if (!sceneAttached)
                {
                    try
                    {
                        Light3DSceneShared.Reset();
                        sceneAttached      = true;
                        ClearColor         = renderRenderable.BackgroundColor;
                        IsShadowMapEnabled = renderRenderable.IsShadowMappingEnabled;

                        RenderTechnique = renderRenderable.RenderTechnique == null ? RenderTechniquesManager?.RenderTechniques[DefaultRenderTechniqueNames.Blinn] : renderRenderable.RenderTechnique;

                        if (renderContext != null)
                        {
                            renderContext.Dispose();
                        }
                        renderContext = new RenderContext(this, EffectsManager.GetEffect(RenderTechnique), device.ImmediateContext);
                        renderContext.EnableBoundingFrustum = EnableRenderFrustum;
                        if (EnableSharingModelMode && SharedModelContainer != null)
                        {
                            SharedModelContainer.CurrentRenderHost = this;
                            renderRenderable.Attach(SharedModelContainer);
                        }
                        else
                        {
                            renderRenderable.Attach(this);
                        }

                        RenderTechniquesManager.RenderTechniques.TryGetValue(DeferredRenderTechniqueNames.GBuffer, out gbuffer);
                        RenderTechniquesManager.RenderTechniques.TryGetValue(DeferredRenderTechniqueNames.Deferred, out deferred);

                        if (RenderTechnique == deferred)
                        {
                            deferredRenderer.InitBuffers(this, Format.R32G32B32A32_Float);
                        }
                        else if (RenderTechnique == gbuffer)
                        {
                            deferredRenderer.InitBuffers(this, Format.B8G8R8A8_UNorm);
                        }
                        SetDefaultRenderTargets(false);
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show("DPFCanvas: Error attaching element: " + string.Format(ex.Message), "Error");
                        Debug.WriteLine("DPFCanvas: Error attaching element: " + string.Format(ex.Message), "Error");
                        throw;
                    }
                }
                renderContext.TimeStamp = timeStamp;
                // ---------------------------------------------------------------------------
                // this part is per frame
                // ---------------------------------------------------------------------------
                if (EnableSharingModelMode && SharedModelContainer != null)
                {
                    SharedModelContainer.CurrentRenderHost = this;
                }
                ClearRenderTarget();
                if (RenderTechnique == deferred)
                {
                    // set G-Buffer
                    deferredRenderer.SetGBufferTargets(renderContext);

                    // render G-Buffer pass
                    renderRenderable.Render(renderContext);

                    // call deferred render
                    deferredRenderer.RenderDeferred(renderContext, renderRenderable);
                }
                else if (RenderTechnique == gbuffer)
                {
                    // set G-Buffer
                    deferredRenderer.SetGBufferTargets(targetWidth / 2, targetHeight / 2, renderContext);

                    // render G-Buffer pass
                    renderRenderable.Render(renderContext);

                    // reset render targets and run lighting pass
#if DoubleBuffer
                    deferredRenderer.RenderGBufferOutput(renderContext, ref backBuffer);
#else
                    this.deferredRenderer.RenderGBufferOutput(renderContext, ref this.backBuffer);
#endif
                }
                else
                {
                    renderRenderable.Render(renderContext);
                }
#if DoubleBuffer
                device.ImmediateContext.ResolveSubresource(colorBuffer, 0, backBuffer, 0, Format.B8G8R8A8_UNorm);
#endif
            }
        }
示例#2
0
        private void Render()
        {
            var device = this.device;

            if (device == null)
            {
                return;
            }

            var renderTarget = colorBuffer;

            if (renderTarget == null)
            {
                return;
            }

            if (renderRenderable != null)
            {
                /// ---------------------------------------------------------------------------
                /// this part is done only if the scene is not attached
                /// it is an attach and init pass for all elements in the scene-graph
                if (!sceneAttached)
                {
                    try
                    {
                        Light3D.LightCount = 0;
                        sceneAttached      = true;
                        ClearColor         = renderRenderable.BackgroundColor;
                        IsShadowMapEnabled = renderRenderable.IsShadowMappingEnabled;

                        var blinn = RenderTechniquesManager.RenderTechniques[DefaultRenderTechniqueNames.Blinn];
                        RenderTechnique = renderRenderable.RenderTechnique == null ? blinn : renderRenderable.RenderTechnique;

                        if (renderContext != null)
                        {
                            renderContext.Dispose();
                        }
                        renderContext = new RenderContext(this, EffectsManager.GetEffect(RenderTechnique));
                        renderRenderable.Attach(this);

                        RenderTechniquesManager.RenderTechniques.TryGetValue(DeferredRenderTechniqueNames.GBuffer, out gbuffer);
                        RenderTechniquesManager.RenderTechniques.TryGetValue(DeferredRenderTechniqueNames.Deferred, out deferred);

                        if (RenderTechnique == deferred)
                        {
                            deferredRenderer.InitBuffers(this, Format.R32G32B32A32_Float);
                        }
                        else if (RenderTechnique == gbuffer)
                        {
                            deferredRenderer.InitBuffers(this, Format.B8G8R8A8_UNorm);
                        }
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show("DPFCanvas: Error attaching element: " + string.Format(ex.Message), "Error");
                        Debug.WriteLine("DPFCanvas: Error attaching element: " + string.Format(ex.Message), "Error");
                        throw;
                    }
                }

                // ---------------------------------------------------------------------------
                // this part is per frame
                // ---------------------------------------------------------------------------

                SetDefaultRenderTargets();

                if (RenderTechnique == deferred)
                {
                    /// set G-Buffer
                    deferredRenderer.SetGBufferTargets();

                    /// render G-Buffer pass
                    renderRenderable.Render(renderContext);

                    /// call deferred render
                    deferredRenderer.RenderDeferred(renderContext, renderRenderable);
                }
                else if (RenderTechnique == gbuffer)
                {
                    /// set G-Buffer
                    deferredRenderer.SetGBufferTargets(targetWidth / 2, targetHeight / 2);

                    /// render G-Buffer pass
                    renderRenderable.Render(renderContext);

                    /// reset render targets and run lighting pass
#if MSAA
                    deferredRenderer.RenderGBufferOutput(ref renderTargetNMS);
#else
                    this.deferredRenderer.RenderGBufferOutput(ref this.colorBuffer);
#endif
                }
                else
                {
                    this.device.ImmediateContext.ClearRenderTargetView(colorBufferView, ClearColor);
                    this.device.ImmediateContext.ClearDepthStencilView(depthStencilBufferView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

                    renderRenderable.Render(renderContext);
                }
            }

            this.device.ImmediateContext.Flush();
        }