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); } }