//-------------------------------------------------------------- #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); }
/// <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); }
//-------------------------------------------------------------- #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; }
//-------------------------------------------------------------- /// <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; }
//-------------------------------------------------------------- #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; }
//-------------------------------------------------------------- /// <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); }
//-------------------------------------------------------------- #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; }
//-------------------------------------------------------------- /// <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="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; }
//-------------------------------------------------------------- #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); }
public BlurSample(Microsoft.Xna.Framework.Game game) : base(game) { _blur = new Blur(GraphicsService); GraphicsScreen.PostProcessors.Add(_blur); }