Beispiel #1
0
            public void Draw(RenderDrawContext context, float sigmaRatio, Texture inputTexture, Texture outputTexture)
            {
                // Check if we need to regenerate offsetsWeights
                if (offsetsWeights == null || this.sigmaRatio != sigmaRatio)
                {
                    offsetsWeights = GaussianUtil.Calculate1D(Radius, sigmaRatio);

                    // Update parameters
                    blurH.Parameters.Set(GaussianBlurShaderKeys.OffsetsWeights, offsetsWeights);
                    blurV.Parameters.Set(GaussianBlurShaderKeys.OffsetsWeights, offsetsWeights);

                    this.sigmaRatio = sigmaRatio;
                }

                // Get a temporary texture for the intermediate pass
                // This texture will be allocated only in the scope of this draw and returned to the pool at the exit of this method
                var desc = inputTexture.Description;

                desc.MultisampleCount = MultisampleCount.None; // TODO we should have a method to get a non-multisampled RT
                var outputTextureH = gaussianBlur.NewScopedRenderTarget2D(desc);

                // Horizontal pass
                blurH.SetInput(inputTexture);
                blurH.SetOutput(outputTextureH);
                blurH.Draw(context, nameGaussianBlurH);

                // Vertical pass
                blurV.SetInput(outputTextureH);
                blurV.SetOutput(outputTexture);
                blurV.Draw(context, nameGaussianBlurV);
            }
Beispiel #2
0
            public GaussianBlurShader(GaussianBlur gaussianBlur, int radius)
            {
                Radius            = radius;
                this.gaussianBlur = gaussianBlur;

                // Craete ImageEffectShader
                blurH = gaussianBlur.ToLoadAndUnload(new ImageEffectShader("GaussianBlurEffect", true));
                blurV = gaussianBlur.ToLoadAndUnload(new ImageEffectShader("GaussianBlurEffect", true));
                blurH.Initialize(gaussianBlur.Context);
                blurV.Initialize(gaussianBlur.Context);

                // Setup Horizontal parameters
                blurH.Parameters.Set(GaussianBlurKeys.VerticalBlur, false);
                blurV.Parameters.Set(GaussianBlurKeys.VerticalBlur, true);

                var size = radius * 2 + 1;

                nameGaussianBlurH = string.Format("GaussianBlurH{0}x{0}", size);
                nameGaussianBlurV = string.Format("GaussianBlurV{0}x{0}", size);

                // TODO: cache if necessary
                offsetsWeights = GaussianUtil.Calculate1D(this.Radius, gaussianBlur.SigmaRatio);

                // Update permutation parameters
                blurH.Parameters.Set(GaussianBlurKeys.Count, offsetsWeights.Length);
                blurV.Parameters.Set(GaussianBlurKeys.Count, offsetsWeights.Length);
                blurH.EffectInstance.UpdateEffect(gaussianBlur.Context.GraphicsDevice);
                blurV.EffectInstance.UpdateEffect(gaussianBlur.Context.GraphicsDevice);

                // Update parameters
                blurH.Parameters.Set(GaussianBlurShaderKeys.OffsetsWeights, offsetsWeights);
                blurV.Parameters.Set(GaussianBlurShaderKeys.OffsetsWeights, offsetsWeights);
            }