/// <summary> /// Activate the black and white filter for a given player. /// Important: parameters about duration are set in the shader-initialization. /// </summary> /// <param name="playerId">Id of the player to apply the shader</param> public void ActivateBlackAndWhite(int playerId) { PostProcessingEffect ppEffect = _fixEffects[PostprocessingType.BlackAndWhite]; ppEffect.Activate(playerId, true); ppEffect.SetParameterForPlayer(playerId, "startTime", Time.CurrentTime); }
/// <summary> /// Activate the shockwave filter for a given player. /// Important: parameters about duration are set in the shader-initialization. /// </summary> /// <param name="position">3D-space coordinate of the position for the shockwave</param> /// <param name="animationLength">Length of the animation for the shockwave to go over the whole screen</param> /// <param name="deactivate">Deactivate the shader after <paramref name="deactivateAfter"/></param> /// <param name="deactivateAfter">If <paramref name="deactivate"/> is set to true, after this many seconds the effect is disabled for this player-id.</param> public void ActivateShockWave(Vector3 position, float animationLength = 0.6f, bool deactivate = true, float deactivateAfter = 5.0f) { PostProcessingEffect ppEffect = new PostProcessingEffect(PostprocessingType.ShockWave, false, _loadedEffects[PostprocessingType.ShockWave], position); for (int playerId = 0; playerId < GameManager.NumPlayers; ++playerId) { Vector2 screenPosition = Screen.Cameras[playerId].WorldToScreenPoint01(position); ppEffect.Activate(playerId, true); ppEffect.SetParameterForPlayer(playerId, "startTime", Time.CurrentTime); ppEffect.SetParameterForPlayer(playerId, "centerCoord", screenPosition); ppEffect.SetParameterForPlayer(playerId, "animationLength", animationLength); ppEffect.SetParameter("shockParams", new Vector3(10.0f, 0.8f, 0.1f)); } _effects.Add(ppEffect); if (deactivate) { // ReSharper disable once ObjectCreationAsStatement new Timer(deactivateAfter, () => DectivateShader(ppEffect.Id)); } }
private PostProcessingManager(List <PostprocessingType> initialized) { foreach (PostprocessingType pType in Enum.GetValues(typeof(PostprocessingType))) { string fileName = pType.ToString(); _loadedEffects[pType] = File.Load <Effect>("Other/effects/" + fileName); } foreach (PostprocessingType pType in initialized) { PostProcessingEffect ppEffect = new PostProcessingEffect(pType, false, _loadedEffects[pType]); _fixEffects[pType] = ppEffect; ppEffect.SetParameter("players", GameManager.NumPlayers); // Special parameters for some effects switch (pType) { case PostprocessingType.BlackAndWhite: ppEffect.SetParameter("durationFadeIn", 0.1f); ppEffect.SetParameter("durationFadeOut", 1.9f); ppEffect.SetParameter("max", 1.0f); ppEffect.SetParameter("min", 0.1f); break; case PostprocessingType.GaussianBlur: ppEffect.SetParameter("screenSize", new Vector2(Screen.Width, Screen.Height)); break; case PostprocessingType.TwoPassBlur: ppEffect.SetParameter("screenSize", new Vector2(Screen.Width, Screen.Height)); break; case PostprocessingType.DepthOfField: float nearClip = Camera.Near; float farClip = Camera.FarDepth; farClip = farClip / (farClip - nearClip); ppEffect.SetParameter("Distance", Distance); ppEffect.SetParameter("Range", Range); ppEffect.SetParameter("Near", nearClip); ppEffect.SetParameter("Far", farClip); PostProcessingEffect ppBlur = new PostProcessingEffect(PostprocessingType.TwoPassBlur, false, _loadedEffects[PostprocessingType.TwoPassBlur]); ppBlur.SetParameter("players", GameManager.NumPlayers); ppBlur.SetParameter("screenSize", new Vector2(Screen.Width, Screen.Height)); ppBlur.SetParameter("active", new Vector4(1, 1, 1, 1)); for (var i = 0; i < GameManager.NumPlayers; i++) { ppEffect.Activate(i, true); ppBlur.Activate(i, true); } _twoPassEffect = ppBlur; break; case PostprocessingType.Chromatic: for (var i = 0; i < GameManager.NumPlayers; i++) { ppEffect.Activate(i, true); } break; case PostprocessingType.Vignette: for (var i = 0; i < GameManager.NumPlayers; i++) { ppEffect.Activate(i, true); } break; case PostprocessingType.ColorGrading: ppEffect.SetParameter("Size", 16f); ppEffect.SetParameter("SizeRoot", 4f); ppEffect.SetParameter("LUT", File.Load <Texture2D>("Images/lut/lut")); for (var i = 0; i < GameManager.NumPlayers; i++) { ppEffect.Activate(i, true); } break; case PostprocessingType.ShockWave: ppEffect.SetParameter("centerCoord", new Vector2(0.5f, 0.5f)); ppEffect.SetParameter("shockParams", new Vector3(10.0f, 0.8f, 0.1f)); break; case PostprocessingType.Wave: ppEffect.SetParameter("centerCoord", new Vector2(0.5f, 0.5f)); ppEffect.SetParameter("shockParams", new Vector3(10.0f, 0.8f, 0.1f)); break; } _effects.Add(ppEffect); } }
/// <summary> /// Apply all postprocessing-effects on the 3D-rendered output /// </summary> /// <param name="spriteBatch"></param> public void Draw(SpriteBatch spriteBatch) { RenderTarget2D curTarget = SceneTarget; int targetI = 0; // if dynamic props are needed foreach (var ppShader in _effects) { if (ppShader.IsActive()) { ppShader.SetParameter("active", ppShader.ActiveParameter); ppShader.SetParameter("time", Time.CurrentTime); switch (ppShader.Type) { case PostprocessingType.DepthOfField: RenderTarget2D curBlurTarget = SceneTarget; // get the gaussian blur shader PostProcessingEffect blurShader = _twoPassEffect; blurShader.SetParameter("active", new Vector4(1, 1, 1, 1)); foreach (EffectPass pass in blurShader.Effect.CurrentTechnique.Passes) { // Setup next render-target to apply next filter RenderTarget2D nextTarget = (targetI++ % 2 == 0) ? _blurTarget1 : _blurTarget2; Graphics.gD.SetRenderTarget(nextTarget); // apply post processing shader SpriteBatchBegin(ref spriteBatch); pass.Apply(); spriteBatch.Draw(curBlurTarget, new Rectangle(0, 0, Screen.Width, Screen.Height), Color.White); SpriteBatchEnd(ref spriteBatch); Graphics.gD.SetRenderTarget(null); curBlurTarget = nextTarget; } // apply post processing shader Graphics.gD.SetRenderTarget(null); SpriteBatchBegin(ref spriteBatch); spriteBatch.Draw(curBlurTarget, new Rectangle(0, 0, Screen.Width, Screen.Height), Color.White); SpriteBatchEnd(ref spriteBatch); // set the blurred scene and the depth map as parameter ppShader.SetParameter("BlurScene", curBlurTarget); ppShader.SetParameter("DepthTexture", DepthTarget); //ppShader.SetParameter("Range", Range); //ppShader.SetParameter("Distance", Distance); break; case PostprocessingType.ShockWave: for (int playerId = 0; playerId < GameManager.NumPlayers; ++playerId) { Vector2 screenPosition = Screen.Cameras[playerId].WorldToScreenPoint01(ppShader.Position); ppShader.SetParameterForPlayer(playerId, "centerCoord", screenPosition); } break; case PostprocessingType.Wave: for (int playerId = 0; playerId < GameManager.NumPlayers; ++playerId) { Vector2 screenPosition = Screen.Cameras[playerId].WorldToScreenPoint01(ppShader.Position); float distance = (ppShader.Position - Screen.Cameras[playerId].transform.position).Length(); ppShader.SetParameterForPlayer(playerId, "centerCoord", screenPosition); ppShader.SetParameterForPlayer(playerId, "cameraDistance", distance); } break; } foreach (EffectPass pass in ppShader.Effect.CurrentTechnique.Passes) { // Setup next render-target to apply next filter RenderTarget2D nextTarget = (targetI++ % 2 == 0) ? _renderTarget1 : _renderTarget2; Graphics.gD.SetRenderTarget(nextTarget); // apply post processing shader SpriteBatchBegin(ref spriteBatch); pass.Apply(); spriteBatch.Draw(curTarget, new Rectangle(0, 0, Screen.Width, Screen.Height), Color.White); SpriteBatchEnd(ref spriteBatch); Graphics.gD.SetRenderTarget(null); curTarget = nextTarget; } } } // draw to screen Graphics.gD.SetRenderTarget(null); SpriteBatchBegin(ref spriteBatch); spriteBatch.Draw(curTarget, new Rectangle(0, 0, Screen.Width, Screen.Height), Color.White); SpriteBatchEnd(ref spriteBatch); }