protected override void Draw(GameTime gameTime) { base.Draw(gameTime); GraphicsDevice.Clear(Color.Black); //Update lights and camera Camera.main.Update(); Lighting.Update(); //Update graphics state GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.DepthStencilState = DepthStencilState.Default; GraphicsDevice.RasterizerState = new RasterizerState() { CullMode = CullMode.CullClockwiseFace }; //Render shadow map GraphicsDevice.SetRenderTarget(Lighting.ShadowMap); GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.White, 1.0f, 0); effect.CurrentTechnique = effect.Techniques["ShadowMap"]; environment.Render(gameTime, GraphicsDevice, effect); player.Render(gameTime, effect); trafficManager.RenderTraffic(gameTime, effect); //Render scene GraphicsDevice.RasterizerState = new RasterizerState() { CullMode = CullMode.CullCounterClockwiseFace }; GraphicsDevice.SetRenderTarget(null); postProcessor.Begin(); effect.CurrentTechnique = effect.Techniques["ShadowedScene"]; environment.Render(gameTime, GraphicsDevice, effect); player.Render(gameTime, effect); trafficManager.RenderTraffic(gameTime, effect); postProcessor.End(player.crashed); //Render GUI spriteBatch.Begin(); scoreUI.Render(spriteBatch, inTargetLane); countdownUI.Render(spriteBatch); titleUI.Render(spriteBatch, gameTime); if (player.crashed && state != GameState.RESTARTING) { gameOverUI.Render(spriteBatch, gameTime); } spriteBatch.End(); //Render debug if (TrafficGame.DEBUG) { trafficManager.RenderDebug(debugView, Camera.main.View, Camera.main.Projection); debugView.RenderDebugData(Camera.main.Projection, Camera.main.View, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullNone, 0.8f); spriteBatch.Begin(); fpsUI.Render(spriteBatch); spriteBatch.End(); //DEBUG: show shadow map spriteBatch.Begin(0, BlendState.Opaque, SamplerState.AnisotropicClamp); spriteBatch.Draw(Lighting.ShadowMap, new Rectangle(0, GraphicsDevice.Viewport.Height - 256, 256, 256), Color.White); spriteBatch.End(); } }