Пример #1
0
        public void EndRenderPass(
            IGameContext gameContext,
            IRenderContext renderContext,
            IRenderPass nextPass)
        {
            _renderBatcher.FlushRequests(gameContext, renderContext);

            renderContext.PopRenderTarget();

            renderContext.GraphicsDevice.DepthStencilState = _previousDepthStencilState;
            renderContext.GraphicsDevice.RasterizerState   = _previousRasterizerState;
            renderContext.GraphicsDevice.BlendState        = _previousBlendState;

            renderContext.PushRenderTarget(_diffuseLightRenderTarget);
            renderContext.GraphicsDevice.Clear(Color.Transparent);
            renderContext.PopRenderTarget();

            renderContext.PushRenderTarget(_specularLightRenderTarget);
            renderContext.GraphicsDevice.Clear(Color.Transparent);
            renderContext.PopRenderTarget();

            var lightContext = new DefaultLightContext(
                _colorRenderTarget,
                _normalRenderTarget,
                _depthRenderTarget,
                _specularRenderTarget,
                _diffuseLightRenderTarget,
                _specularLightRenderTarget,
                _lightBlendState,
                _rasterizerStateCullNone,
                _rasterizerStateCullClockwiseFace,
                _rasterizerStateCullCounterClockwiseFace,
                new Vector2(
                    0.5f / renderContext.GraphicsDevice.PresentationParameters.BackBufferWidth,
                    0.5f / renderContext.GraphicsDevice.PresentationParameters.BackBufferHeight));

            var lights = new List <ILight>();

            if (gameContext.World != null)
            {
                foreach (var l in _hierarchy.Lookup(gameContext.World).Children.Select(x => x.UntypedValue).OfType <IHasLights>())
                {
                    lights.AddRange(l.GetLights());
                }
            }

            renderContext.GraphicsDevice.BlendState        = _lightBlendState;
            renderContext.GraphicsDevice.DepthStencilState = _lightDepthStencilState;

            foreach (var light in lights)
            {
                light.Render(gameContext, renderContext, lightContext);
            }

            renderContext.GraphicsDevice.BlendState        = _previousBlendState;
            renderContext.GraphicsDevice.DepthStencilState = _previousDepthStencilState;

            if (DebugGBuffer)
            {
                // Render the G buffer into 4 quadrants on the current render target.
                renderContext.GraphicsDevice.Clear(Color.Purple);
                _graphicsBlit.Blit(
                    renderContext,
                    _colorRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0, 0),
                    new Vector2(0.33f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _normalRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.33f, 0),
                    new Vector2(0.34f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _depthRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.67f, 0f),
                    new Vector2(0.33f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _specularRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.0f, 0.5f),
                    new Vector2(0.33f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _diffuseLightRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.33f, 0.5f),
                    new Vector2(0.34f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _specularLightRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.67f, 0.5f),
                    new Vector2(0.33f, 0.5f));
            }
            else
            {
                var parameterSet = _gbufferCombineEffect.Effect.CreateParameterSet();
                parameterSet["Color"]?.SetValue(_colorRenderTarget);
                parameterSet["DiffuseLight"]?.SetValue(_diffuseLightRenderTarget);
                parameterSet["SpecularLight"]?.SetValue(_specularLightRenderTarget);
                parameterSet["AmbientLight"]?.SetValue(new Vector3(0.2f, 0.2f, 0.2f));

                _graphicsBlit.Blit(
                    renderContext,
                    null,
                    null,
                    _gbufferCombineEffect.Effect,
                    parameterSet,
                    GBufferBlendState);
            }
        }
        public void EndRenderPass(
            IGameContext gameContext, 
            IRenderContext renderContext, 
            IRenderPass nextPass)
        {
            _renderBatcher.FlushRequests(gameContext, renderContext);
            
            renderContext.PopRenderTarget();

            renderContext.GraphicsDevice.DepthStencilState = _previousDepthStencilState;
            renderContext.GraphicsDevice.RasterizerState = _previousRasterizerState;
            renderContext.GraphicsDevice.BlendState = _previousBlendState;
            
            renderContext.PushRenderTarget(_diffuseLightRenderTarget);
            renderContext.GraphicsDevice.Clear(Color.Transparent);
            renderContext.PopRenderTarget();

            renderContext.PushRenderTarget(_specularLightRenderTarget);
            renderContext.GraphicsDevice.Clear(Color.Transparent);
            renderContext.PopRenderTarget();

            var lightContext = new DefaultLightContext(
                _colorRenderTarget,
                _normalRenderTarget,
                _depthRenderTarget,
                _specularRenderTarget,
                _diffuseLightRenderTarget,
                _specularLightRenderTarget,
                _lightBlendState,
                _rasterizerStateCullNone,
                _rasterizerStateCullClockwiseFace,
                _rasterizerStateCullCounterClockwiseFace,
                new Vector2(
                    0.5f/renderContext.GraphicsDevice.PresentationParameters.BackBufferWidth,
                    0.5f/renderContext.GraphicsDevice.PresentationParameters.BackBufferHeight));

            var lights = new List<ILight>();

            foreach (var l in _hierarchy.Lookup(gameContext.World).Children.Select(x => x.UntypedValue).OfType<IHasLights>())
            {
                lights.AddRange(l.GetLights());
            }

            renderContext.GraphicsDevice.BlendState = _lightBlendState;
            renderContext.GraphicsDevice.DepthStencilState = _lightDepthStencilState;
            
            foreach (var light in lights)
            {
                light.Render(gameContext, renderContext, lightContext);
            }

            renderContext.GraphicsDevice.BlendState = _previousBlendState;
            renderContext.GraphicsDevice.DepthStencilState = _previousDepthStencilState;

            if (DebugGBuffer)
            {
                // Render the G buffer into 4 quadrants on the current render target.
                renderContext.GraphicsDevice.Clear(Color.Purple);
                _graphicsBlit.Blit(
                    renderContext,
                    _colorRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0, 0),
                    new Vector2(0.33f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _normalRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.33f, 0),
                    new Vector2(0.34f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _depthRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.67f, 0f),
                    new Vector2(0.33f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _specularRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.0f, 0.5f),
                    new Vector2(0.33f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _diffuseLightRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.33f, 0.5f),
                    new Vector2(0.34f, 0.5f));
                _graphicsBlit.Blit(
                    renderContext,
                    _specularLightRenderTarget,
                    null,
                    null,
                    null,
                    null,
                    new Vector2(0.67f, 0.5f),
                    new Vector2(0.33f, 0.5f));
            }
            else
            {
                var parameterSet = _gbufferCombineEffect.Effect.CreateParameterSet();
                parameterSet["Color"]?.SetValue(_colorRenderTarget);
                parameterSet["DiffuseLight"]?.SetValue(_diffuseLightRenderTarget);
                parameterSet["SpecularLight"]?.SetValue(_specularLightRenderTarget);
                parameterSet["AmbientLight"]?.SetValue(new Vector3(0.2f, 0.2f, 0.2f));

                _graphicsBlit.Blit(
                    renderContext,
                    null,
                    null,
                    _gbufferCombineEffect.Effect,
                    parameterSet,
                    BlendState.Opaque);
            }
        }