protected override void DrawCore() { // Input texture var inputTexture = GetSafeInput(0); // 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 outputTextureH = NewScopedRenderTarget2D(inputTexture.Description); if (offsetsWeights == null) { // TODO: cache if necessary offsetsWeights = GaussianUtil.Calculate1D(Radius, SigmaRatio); } // Update shared parameters Parameters.Set(GaussianBlurKeys.Count, offsetsWeights.Length); Parameters.Set(GaussianBlurShaderKeys.OffsetsWeights, offsetsWeights); // Horizontal pass blurH.SetInput(inputTexture); blurH.SetOutput(outputTextureH); var size = Radius * 2 + 1; blurH.Draw("GaussianBlurH{0}x{0}", size); // Vertical pass blurV.SetInput(outputTextureH); blurV.SetOutput(GetSafeOutput(0)); blurV.Draw("GaussianBlurV{0}x{0}", size); }
protected override void DrawCore() { var input = GetSafeInput(0); var output = GetSafeOutput(0); var blurTextureSize = output.Size.Down2(UpscaleCount); var outputTextureDown = NewScopedRenderTarget2D(blurTextureSize.Width, blurTextureSize.Height, luminanceFormat, 1); var luminanceMap = NewScopedRenderTarget2D(input.ViewWidth, input.ViewHeight, luminanceFormat, 1); // Calculate the first luminance map luminanceLogEffect.SetInput(input); luminanceLogEffect.SetOutput(luminanceMap); luminanceLogEffect.Draw(); // Downscales luminance up to BlurTexture (optional) and 1x1 multiScaler.SetInput(luminanceMap); multiScaler.SetOutput(outputTextureDown, luminance1x1); multiScaler.Draw(); // If we have an output texture if (outputTextureDown != null) { // Blur x2 the intermediate output texture blur.SetInput(outputTextureDown); blur.SetOutput(outputTextureDown); blur.Draw(); blur.Draw(); // Upscale from intermediate to output multiScaler.SetInput(outputTextureDown); multiScaler.SetOutput(output); multiScaler.Draw(); } // Calculate average luminance only if needed if (EnableAverageLuminanceReadback) { readback.Draw(); var rawLogValue = readback.Result[0]; AverageLuminance = (float)Math.Pow(2.0, rawLogValue); } }