//--------------------------------------------------------------
        #region Creation & Cleanup
        //--------------------------------------------------------------

        /// <summary>
        /// Initializes a new instance of the <see cref="DepthOfFieldFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public DepthOfFieldFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load <Effect>("DigitalRune/PostProcessing/DepthOfFieldFilter");
            _screenSizeParameter        = _effect.Parameters["ScreenSize"];
            _depthTextureParameter      = _effect.Parameters["DepthTexture"];
            _nearBlurDistanceParameter  = _effect.Parameters["NearBlurDistance"];
            _nearFocusDistanceParameter = _effect.Parameters["NearFocusDistance"];
            _farFocusDistanceParameter  = _effect.Parameters["FarFocusDistance"];
            _farBlurDistanceParameter   = _effect.Parameters["FarBlurDistance"];
            _farParameter                     = _effect.Parameters["Far"];
            _blurTextureParameter             = _effect.Parameters["BlurTexture"];
            _downsampledDepthTextureParameter = _effect.Parameters["DownsampledDepthTexture"];
            _downsampledCocTextureParameter   = _effect.Parameters["DownsampledCocTexture"];
            _offsetsParameter                 = _effect.Parameters["Offsets"];
            _weightsParameter                 = _effect.Parameters["Weights"];
            _sceneTextureParameter            = _effect.Parameters["SceneTexture"];
            _circleOfConfusionPass            = _effect.CurrentTechnique.Passes["CircleOfConfusion"];
            _blurPass         = _effect.CurrentTechnique.Passes["Blur"];
            _depthOfFieldPass = _effect.CurrentTechnique.Passes["DepthOfField"];

            _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

            _cocBlur = new Blur(graphicsService);
            _cocBlur.InitializeBoxBlur(5, false);

            NearBlurDistance  = 2;
            NearFocusDistance = 5;
            FarFocusDistance  = 6;
            FarBlurDistance   = 10;
            _downsampleFactor = 2;
            BlurStrength      = 1;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="UnsharpMaskingFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public UnsharpMaskingFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load<Effect>("DigitalRune/PostProcessing/UnsharpMaskingFilter");
              _viewportSizeParameter = _effect.Parameters["ViewportSize"];
              _sharpnessParameter = _effect.Parameters["Sharpness"];
              _sourceTextureParameter = _effect.Parameters["SourceTexture"];
              _blurredTextureParameter = _effect.Parameters["BlurredTexture"];

              Sharpness = 1.2f;
              Blur = new Blur(graphicsService);
        }
Example #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="UnsharpMaskingFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public UnsharpMaskingFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load <Effect>("DigitalRune/PostProcessing/UnsharpMaskingFilter");
            _viewportSizeParameter   = _effect.Parameters["ViewportSize"];
            _sharpnessParameter      = _effect.Parameters["Sharpness"];
            _sourceTextureParameter  = _effect.Parameters["SourceTexture"];
            _blurredTextureParameter = _effect.Parameters["BlurredTexture"];

            Sharpness = 1.2f;
            Blur      = new Blur(graphicsService);
        }
Example #4
0
        //--------------------------------------------------------------
        #region Creation & Cleanup
        //--------------------------------------------------------------

        /// <summary>
        /// Initializes a new instance of the <see cref="HdrFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public HdrFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load <Effect>("DigitalRune/PostProcessing/HdrFilter");
            _viewportSizeParameter     = _effect.Parameters["ViewportSize"];
            _bloomThresholdParameter   = _effect.Parameters["BloomThreshold"];
            _middleGrayParameter       = _effect.Parameters["MiddleGray"];
            _minExposureParameter      = _effect.Parameters["MinExposure"];
            _maxExposureParameter      = _effect.Parameters["MaxExposure"];
            _blueShiftColorParameter   = _effect.Parameters["BlueShiftColor"];
            _blueShiftParameter        = _effect.Parameters["BlueShift"];
            _bloomIntensityParameter   = _effect.Parameters["BloomIntensity"];
            _sceneTextureParameter     = _effect.Parameters["SceneTexture"];
            _luminanceTextureParameter = _effect.Parameters["LuminanceTexture"];
            _bloomTextureParameter     = _effect.Parameters["BloomTexture"];
            _brightnessPass            = _effect.CurrentTechnique.Passes["Brightness"];
            _combinePass = _effect.CurrentTechnique.Passes["Combine"];
            _combineWithBlueShiftPass = _effect.CurrentTechnique.Passes["CombineWithBlueShift"];

            BloomIntensity   = 1;
            BloomThreshold   = 0.2f;
            DownsampleFactor = 4;
            MiddleGray       = 0.18f;
            MinExposure      = 0.01f;
            MaxExposure      = 2.0f;

            // The physically based blue shift color is in CIE Yxy: x = 0.3 and y = 0.3.
            // As RGB this is (1.05, 0.97, 1.27). This color should be scaled by a user-defined
            // scale. The scotopic luminance computed in the shader is usually in the range [0, 4].
            // Therefore, we apply a scale factor of 0.25 as a default.
            BlueShiftColor  = new Vector3F(1.05f, 0.97f, 1.27f) * 0.25f;
            BlueShiftCenter = 0.04f;
            BlueShiftRange  = 1;

            _blur = new Blur(graphicsService);
            _blur.InitializeGaussianBlur(7, 7.0f / 3.0f, true);
            _luminance       = new LuminanceFilter(graphicsService);
            _luminanceTarget = graphicsService.RenderTargetPool.Obtain2D(_luminance.DefaultTargetFormat);

            _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

            var defaultTargetFormat = DefaultTargetFormat;

            defaultTargetFormat.SurfaceFormat = SurfaceFormat.Color;
            DefaultTargetFormat = defaultTargetFormat;
        }
Example #5
0
        //--------------------------------------------------------------
        /// <summary>
        /// Initializes a new instance of the <see cref="BloomFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public BloomFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load<Effect>("DigitalRune/PostProcessing/BloomFilter");
              _viewportSizeParameter = _effect.Parameters["ViewportSize"];
              _bloomThresholdParameter = _effect.Parameters["BloomThreshold"];
              _bloomIntensityParameter = _effect.Parameters["BloomIntensity"];
              _bloomSaturationParameter = _effect.Parameters["BloomSaturation"];
              _sceneTextureParameter = _effect.Parameters["SceneTexture"];
              _bloomTextureParameter = _effect.Parameters["BloomTexture"];
              _brightnessPass = _effect.CurrentTechnique.Passes["Brightness"];
              _combinePass = _effect.CurrentTechnique.Passes["Combine"];

              _blur = new Blur(graphicsService);
              _blur.InitializeGaussianBlur(7, 7.0f / 3.0f, true);

              _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

              Threshold = 0.7f;
              Intensity = 1.5f;
              Saturation = 0.5f;
              DownsampleFactor = 4;
        }
Example #6
0
        //--------------------------------------------------------------
        #region Creation & Cleanup
        //--------------------------------------------------------------

        /// <summary>
        /// Initializes a new instance of the <see cref="BloomFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public BloomFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load <Effect>("DigitalRune/PostProcessing/BloomFilter");
            _viewportSizeParameter    = _effect.Parameters["ViewportSize"];
            _bloomThresholdParameter  = _effect.Parameters["BloomThreshold"];
            _bloomIntensityParameter  = _effect.Parameters["BloomIntensity"];
            _bloomSaturationParameter = _effect.Parameters["BloomSaturation"];
            _sceneTextureParameter    = _effect.Parameters["SceneTexture"];
            _bloomTextureParameter    = _effect.Parameters["BloomTexture"];
            _brightnessPass           = _effect.CurrentTechnique.Passes["Brightness"];
            _combinePass = _effect.CurrentTechnique.Passes["Combine"];

            _blur = new Blur(graphicsService);
            _blur.InitializeGaussianBlur(7, 7.0f / 3.0f, true);

            _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

            Threshold        = 0.7f;
            Intensity        = 1.5f;
            Saturation       = 0.5f;
            DownsampleFactor = 4;
        }
Example #7
0
        //--------------------------------------------------------------
        /// <summary>
        /// Initializes a new instance of the <see cref="SsaoFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public SsaoFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load<Effect>("DigitalRune/PostProcessing/SsaoFilter");
              _farParameter = _effect.Parameters["Far"];
              _radiusParameter = _effect.Parameters["Radius"];
              _strengthParameter = _effect.Parameters["Strength"];
              _maxDistancesParameter = _effect.Parameters["MaxDistances"];
              _viewportSizeParameter = _effect.Parameters["ViewportSize"];
              _sourceTextureParameter = _effect.Parameters["SourceTexture"];
              _gBuffer0Parameter = _effect.Parameters["GBuffer0"];
              _occlusionTextureParameter = _effect.Parameters["OcclusionTexture"];
              _createLinesAPass = _effect.CurrentTechnique.Passes["CreateLinesA"];
              _createLinesBPass = _effect.CurrentTechnique.Passes["CreateLinesB"];
              _blurHorizontalPass = _effect.CurrentTechnique.Passes["BlurHorizontal"];
              _blurVerticalPass = _effect.CurrentTechnique.Passes["BlurVertical"];
              _combinePass = _effect.CurrentTechnique.Passes["Combine"];
              _copyPass = _effect.CurrentTechnique.Passes["Copy"];

              Radii = new Vector2F(0.01f, 0.02f);
              MaxDistances = new Vector2F(0.5f, 1.0f);
              Strength = 1f;
              NumberOfBlurPasses = 1;
              DownsampleFactor = 2;
              Quality = 2;
              Scale = new Vector2F(0.5f, 2f);
              CombineWithSource = true;

              _blur = new Blur(graphicsService);
              _blur.InitializeGaussianBlur(7, 7 / 3, true);

              _copyFilter = PostProcessHelper.GetCopyFilter(graphicsService);
              _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

              Random random = new Random(123456);
              Vector3[] vectors = new Vector3[9];

              // 16 random vectors for Crytek-style point samples.
              //for (int i = 0; i < vectors.Length; i++)
              //  vectors[i] = (Vector3)random.NextQuaternionF().Rotate(Vector3F.One).Normalized;
              //    //* random.NextFloat(0.5f, 1) // Note: StarCraft 2 uses varying length to vary the sample offset length.

              // We create rotated random vectors with uniform distribution in 360°. Each random vector
              // is further rotated with small random angle.
              float jitterAngle = ConstantsF.TwoPi / vectors.Length / 4;
              for (int i = 0; i < vectors.Length; i++)
            vectors[i] = (Vector3)(Matrix33F.CreateRotationZ(ConstantsF.TwoPi * i / vectors.Length + random.NextFloat(-jitterAngle, jitterAngle)) * new Vector3F(1, 0, 0)).Normalized;

              // Permute randomVectors.
              for (int i = 0; i < vectors.Length; i++)
            MathHelper.Swap(ref vectors[i], ref vectors[random.Next(i, vectors.Length - 1)]);

              // Scale random vectors.
              for (int i = 0; i < vectors.Length; i++)
            vectors[i].Z = random.NextFloat(Scale.X, Scale.Y);

              _effect.Parameters["RandomVectors"].SetValue(vectors);
        }
Example #8
0
    //--------------------------------------------------------------
    #region Creation & Cleanup
    //--------------------------------------------------------------

    public DeferredGraphicsScreen(IServiceLocator services)
      : base(services.GetInstance<IGraphicsService>())
    {
      _sampleFramework = services.GetInstance<SampleFramework>();
      var contentManager = services.GetInstance<ContentManager>();

      SpriteBatch = GraphicsService.GetSpriteBatch();

      // Let's create the necessary scene node renderers:
#if !XBOX360
      TerrainRenderer = new TerrainRenderer(GraphicsService);
#endif
      MeshRenderer = new MeshRenderer();

      // The _opaqueMeshSceneRenderer combines all renderers for opaque
      // (= not alpha blended) meshes.
      _opaqueMeshSceneRenderer = new SceneRenderer();
#if !XBOX360
      _opaqueMeshSceneRenderer.Renderers.Add(TerrainRenderer);
#endif
      _opaqueMeshSceneRenderer.Renderers.Add(MeshRenderer);

      _decalRenderer = new DecalRenderer(GraphicsService);
      _billboardRenderer = new BillboardRenderer(GraphicsService, 2048)
      {
        EnableSoftParticles = true,

        // If you have an extreme amount of particles that cover the entire screen,
        // you can turn on offscreen rendering to improve performance.
        //EnableOffscreenRendering = true,
      };

      // The AlphaBlendSceneRenderer combines all renderers for transparent
      // (= alpha blended) objects.
      AlphaBlendSceneRenderer = new SceneRenderer();
      AlphaBlendSceneRenderer.Renderers.Add(MeshRenderer);
      AlphaBlendSceneRenderer.Renderers.Add(_billboardRenderer);
      AlphaBlendSceneRenderer.Renderers.Add(new WaterRenderer(GraphicsService));
      AlphaBlendSceneRenderer.Renderers.Add(new FogSphereRenderer(GraphicsService));
      AlphaBlendSceneRenderer.Renderers.Add(new VolumetricLightRenderer(GraphicsService));

#if !XBOX360
      // Update terrain clipmaps. (Only necessary if TerrainNodes are used.)
      _terrainClipmapRenderer = new TerrainClipmapRenderer(GraphicsService);
#endif

      // Renderer for cloud maps. (Only necessary if LayeredCloudMaps are used.)
      _cloudMapRenderer = new CloudMapRenderer(GraphicsService);

      // Renderer for SceneCaptureNodes. See also SceneCapture2DSample.
      // In the constructor we specify a method which is called in SceneCaptureRenderer.Render() 
      // when the scene must be rendered for the SceneCaptureNodes.
      SceneCaptureRenderer = new SceneCaptureRenderer(context =>
      {
        // Get scene nodes which are visible by the current camera.
        CustomSceneQuery sceneQuery = Scene.Query<CustomSceneQuery>(context.CameraNode, context);
        // Render scene (with post-processing, with lens flares, no debug rendering, no reticle).
        RenderScene(sceneQuery, context, true, true, false, false);
      });

      // Renderer for PlanarReflectionNodes. See also PlanarReflectionSample.
      // In the constructor we specify a method which is called in PlanarReflectionRenderer.Render() 
      // to create the reflection images.
      _planarReflectionRenderer = new PlanarReflectionRenderer(context =>
      {
        // Get scene nodes which are visible by the current camera.
        CustomSceneQuery sceneQuery = Scene.Query<CustomSceneQuery>(context.CameraNode, context);

        var planarReflectionNode = (PlanarReflectionNode)context.ReferenceNode;

        // Planar reflections are often for WaterNodes. These nodes should not be rendered 
        // into their own reflection map because when the water surface is displaced by waves, 
        // some waves could be visible in the reflection. 
        // --> Remove the water node from the renderable nodes. (In our samples, the water
        // node is the parent of the reflection node.)
        if (planarReflectionNode.Parent is WaterNode)
        {
          var index = sceneQuery.RenderableNodes.IndexOf(planarReflectionNode.Parent);
          if (index >= 0)
            sceneQuery.RenderableNodes[index] = null;
        }

        // Render scene (no post-processing, no lens flares, no debug rendering, no reticle).
        RenderScene(sceneQuery, context, false, false, false, false);
      });

      _waterWavesRenderer = new WaterWavesRenderer(GraphicsService);

      // The shadow map renderer renders a depth image from the viewpoint of the light and
      // stores it in LightNode.Shadow.ShadowMap.
      ShadowMapRenderer = new ShadowMapRenderer(context =>
      {
        var query = context.Scene.Query<ShadowCasterQuery>(context.CameraNode, context);
        if (query.ShadowCasters.Count == 0)
          return false;

        _opaqueMeshSceneRenderer.Render(query.ShadowCasters, context);
        return true;
      });

      // The shadow mask renderer evaluates the shadow maps, does shadow filtering 
      // and stores the resulting shadow factor in a screen space image 
      //(see LightNode.Shadow.ShadowMask/ShadowMaskChannel).
      ShadowMaskRenderer = new ShadowMaskRenderer(GraphicsService, 2);

      // Optionally, we can blur the shadow mask to make the shadows smoother.
      var blur = new Blur(GraphicsService)
      {
        IsAnisotropic = false,
        IsBilateral = true,
        EdgeSoftness = 0.05f,
        Scale = 1f,
        Enabled = false,  // Disable blur by default.
      };
      blur.InitializeGaussianBlur(11, 3, true);
      ShadowMaskRenderer.Filter = blur;

      // Renderers which create the intermediate render targets:
      // Those 2 renderers are implemented in this sample. Those functions could
      // be implemented directly in this class but we have created separate classes
      // to make the code more readable.
      _gBufferRenderer = new GBufferRenderer(GraphicsService, _opaqueMeshSceneRenderer, _decalRenderer);
      LightBufferRenderer = new LightBufferRenderer(GraphicsService);

      // Other specialized renderers:
      _lensFlareRenderer = new LensFlareRenderer(GraphicsService);
      _skyRenderer = new SkyRenderer(GraphicsService);
      _fogRenderer = new FogRenderer(GraphicsService);
      _internalDebugRenderer = new DebugRenderer(GraphicsService, null);
      _rebuildZBufferRenderer = new RebuildZBufferRenderer(GraphicsService);

      Scene = new Scene();

      // This screen needs a HDR filter to map high dynamic range values back to
      // low dynamic range (LDR).
      PostProcessors = new PostProcessorChain(GraphicsService);
      PostProcessors.Add(new HdrFilter(GraphicsService)
      {
        EnableBlueShift = true,
        BlueShiftCenter = 0.0004f,
        BlueShiftRange = 0.5f,
        //BlueShiftColor = new Vector3F(1.05f / 4f, 0.97f / 4f, 1.27f / 4f),  // Default physically-based blue-shift
        BlueShiftColor = new Vector3F(0.25f, 0.25f, 0.7f),  // More dramatic blue-shift
        MinExposure = 0,
        MaxExposure = 10,
        BloomIntensity = 1,
        BloomThreshold = 0.6f,
      });
      _underwaterPostProcessor = new UnderwaterPostProcessor(GraphicsService, contentManager);
      PostProcessors.Add(_underwaterPostProcessor);

      // Use 2D texture for reticle.
      _reticle = contentManager.Load<Texture2D>("Reticle");

      // Use the sprite font of the GUI.
      var uiContentManager = services.GetInstance<ContentManager>("UIContent");
      var spriteFont = uiContentManager.Load<SpriteFont>("UI Themes/BlendBlue/Default");
      DebugRenderer = new DebugRenderer(GraphicsService, spriteFont)
      {
        DefaultColor = new Color(0, 0, 0),
        DefaultTextPosition = new Vector2F(10),
      };

      EnableLod = true;
    }
Example #9
0
        //--------------------------------------------------------------
        /// <summary>
        /// Initializes a new instance of the <see cref="DepthOfFieldFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public DepthOfFieldFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load<Effect>("DigitalRune/PostProcessing/DepthOfFieldFilter");
              _screenSizeParameter = _effect.Parameters["ScreenSize"];
              _depthTextureParameter = _effect.Parameters["DepthTexture"];
              _nearBlurDistanceParameter = _effect.Parameters["NearBlurDistance"];
              _nearFocusDistanceParameter = _effect.Parameters["NearFocusDistance"];
              _farFocusDistanceParameter = _effect.Parameters["FarFocusDistance"];
              _farBlurDistanceParameter = _effect.Parameters["FarBlurDistance"];
              _farParameter = _effect.Parameters["Far"];
              _blurTextureParameter = _effect.Parameters["BlurTexture"];
              _downsampledDepthTextureParameter = _effect.Parameters["DownsampledDepthTexture"];
              _downsampledCocTextureParameter = _effect.Parameters["DownsampledCocTexture"];
              _offsetsParameter = _effect.Parameters["Offsets"];
              _weightsParameter = _effect.Parameters["Weights"];
              _sceneTextureParameter = _effect.Parameters["SceneTexture"];
              _circleOfConfusionPass = _effect.CurrentTechnique.Passes["CircleOfConfusion"];
              _blurPass = _effect.CurrentTechnique.Passes["Blur"];
              _depthOfFieldPass = _effect.CurrentTechnique.Passes["DepthOfField"];

              _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

              _cocBlur = new Blur(graphicsService);
              _cocBlur.InitializeBoxBlur(5, false);

              NearBlurDistance = 2;
              NearFocusDistance = 5;
              FarFocusDistance = 6;
              FarBlurDistance = 10;
              _downsampleFactor = 2;
              BlurStrength = 1;
        }
Example #10
0
        //--------------------------------------------------------------
        /// <summary>
        /// Initializes a new instance of the <see cref="HdrFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public HdrFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect = GraphicsService.Content.Load<Effect>("DigitalRune/PostProcessing/HdrFilter");
              _viewportSizeParameter = _effect.Parameters["ViewportSize"];
              _bloomThresholdParameter = _effect.Parameters["BloomThreshold"];
              _middleGrayParameter = _effect.Parameters["MiddleGray"];
              _minExposureParameter = _effect.Parameters["MinExposure"];
              _maxExposureParameter = _effect.Parameters["MaxExposure"];
              _blueShiftColorParameter = _effect.Parameters["BlueShiftColor"];
              _blueShiftParameter = _effect.Parameters["BlueShift"];
              _bloomIntensityParameter = _effect.Parameters["BloomIntensity"];
              _sceneTextureParameter = _effect.Parameters["SceneTexture"];
              _luminanceTextureParameter = _effect.Parameters["LuminanceTexture"];
              _bloomTextureParameter = _effect.Parameters["BloomTexture"];
              _brightnessPass = _effect.CurrentTechnique.Passes["Brightness"];
              _combinePass = _effect.CurrentTechnique.Passes["Combine"];
              _combineWithBlueShiftPass = _effect.CurrentTechnique.Passes["CombineWithBlueShift"];

              BloomIntensity = 1;
              BloomThreshold = 0.2f;
              DownsampleFactor = 4;
              MiddleGray = 0.18f;
              MinExposure = 0.01f;
              MaxExposure = 2.0f;

              // The physically based blue shift color is in CIE Yxy: x = 0.3 and y = 0.3.
              // As RGB this is (1.05, 0.97, 1.27). This color should be scaled by a user-defined
              // scale. The scotopic luminance computed in the shader is usually in the range [0, 4].
              // Therefore, we apply a scale factor of 0.25 as a default.
              BlueShiftColor = new Vector3F(1.05f, 0.97f, 1.27f) * 0.25f;
              BlueShiftCenter = 0.04f;
              BlueShiftRange = 1;

              _blur = new Blur(graphicsService);
              _blur.InitializeGaussianBlur(7, 7.0f / 3.0f, true);
              _luminance = new LuminanceFilter(graphicsService);
              _luminanceTarget = graphicsService.RenderTargetPool.Obtain2D(_luminance.DefaultTargetFormat);

              _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

              var defaultTargetFormat = DefaultTargetFormat;
              defaultTargetFormat.SurfaceFormat = SurfaceFormat.Color;
              DefaultTargetFormat = defaultTargetFormat;
        }
Example #11
0
        //--------------------------------------------------------------
        #region Creation & Cleanup
        //--------------------------------------------------------------

        /// <summary>
        /// Initializes a new instance of the <see cref="SsaoFilter"/> class.
        /// </summary>
        /// <param name="graphicsService">The graphics service.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="graphicsService"/> is <see langword="null"/>.
        /// </exception>
        public SsaoFilter(IGraphicsService graphicsService)
            : base(graphicsService)
        {
            _effect                    = GraphicsService.Content.Load <Effect>("DigitalRune/PostProcessing/SsaoFilter");
            _farParameter              = _effect.Parameters["Far"];
            _radiusParameter           = _effect.Parameters["Radius"];
            _strengthParameter         = _effect.Parameters["Strength"];
            _maxDistancesParameter     = _effect.Parameters["MaxDistances"];
            _viewportSizeParameter     = _effect.Parameters["ViewportSize"];
            _sourceTextureParameter    = _effect.Parameters["SourceTexture"];
            _gBuffer0Parameter         = _effect.Parameters["GBuffer0"];
            _occlusionTextureParameter = _effect.Parameters["OcclusionTexture"];
            _createLinesAPass          = _effect.CurrentTechnique.Passes["CreateLinesA"];
            _createLinesBPass          = _effect.CurrentTechnique.Passes["CreateLinesB"];
            _blurHorizontalPass        = _effect.CurrentTechnique.Passes["BlurHorizontal"];
            _blurVerticalPass          = _effect.CurrentTechnique.Passes["BlurVertical"];
            _combinePass               = _effect.CurrentTechnique.Passes["Combine"];
            _copyPass                  = _effect.CurrentTechnique.Passes["Copy"];

            Radii              = new Vector2F(0.01f, 0.02f);
            MaxDistances       = new Vector2F(0.5f, 1.0f);
            Strength           = 1f;
            NumberOfBlurPasses = 1;
            DownsampleFactor   = 2;
            Quality            = 2;
            Scale              = new Vector2F(0.5f, 2f);
            CombineWithSource  = true;

            _blur = new Blur(graphicsService);
            _blur.InitializeGaussianBlur(7, 7 / 3, true);

            _copyFilter       = PostProcessHelper.GetCopyFilter(graphicsService);
            _downsampleFilter = PostProcessHelper.GetDownsampleFilter(graphicsService);

            Random random = new Random(123456);

            Vector3[] vectors = new Vector3[9];

            // 16 random vectors for Crytek-style point samples.
            //for (int i = 0; i < vectors.Length; i++)
            //  vectors[i] = (Vector3)random.NextQuaternionF().Rotate(Vector3F.One).Normalized;
            //    //* random.NextFloat(0.5f, 1) // Note: StarCraft 2 uses varying length to vary the sample offset length.

            // We create rotated random vectors with uniform distribution in 360°. Each random vector
            // is further rotated with small random angle.
            float jitterAngle = ConstantsF.TwoPi / vectors.Length / 4;

            for (int i = 0; i < vectors.Length; i++)
            {
                vectors[i] = (Vector3)(Matrix33F.CreateRotationZ(ConstantsF.TwoPi * i / vectors.Length + random.NextFloat(-jitterAngle, jitterAngle)) * new Vector3F(1, 0, 0)).Normalized;
            }

            // Permute randomVectors.
            for (int i = 0; i < vectors.Length; i++)
            {
                MathHelper.Swap(ref vectors[i], ref vectors[random.Next(i, vectors.Length - 1)]);
            }

            // Scale random vectors.
            for (int i = 0; i < vectors.Length; i++)
            {
                vectors[i].Z = random.NextFloat(Scale.X, Scale.Y);
            }

            _effect.Parameters["RandomVectors"].SetValue(vectors);
        }
Example #12
0
 public BlurSample(Microsoft.Xna.Framework.Game game)
   : base(game)
 {
   _blur = new Blur(GraphicsService);
   GraphicsScreen.PostProcessors.Add(_blur);
 }