protected virtual void OnRenderImage(RenderTexture source, RenderTexture destination) { if (blurAlgorithm == null || BlurConfig == null) { goto draw_unmodified; } if (shouldUpdateBlur()) { //Resize final texture if base downsample changed if (Downsample != lastDownsample || !BlurRegion.Approximately(lastBlurRegion)) { CreateNewBlurredScreen(); lastDownsample = Downsample; lastBlurRegion = BlurRegion; } blurAlgorithm.Blur(source, BlurRegion, ref blurredScreen); } if (preview) { previewMaterial.SetVector(ShaderProperties.blurTextureCropRegion, BlurRegion.ToMinMaxVector()); Graphics.Blit(BlurredScreen, destination, previewMaterial); return; } draw_unmodified: Graphics.Blit(source, destination); }
public void OnBeforeBlur() { if (BlurredScreen == null || !BlurredScreen.IsCreated() || Downsample != lastDownsample || !BlurRegion.Approximately(lastBlurRegion)) { CreateNewBlurredScreen(); lastDownsample = Downsample; lastBlurRegion = BlurRegion; } }
protected virtual void ProgressiveBlur(RenderTexture sourceRt) { //Resize final texture if base downsample changed if (Downsample != lastDownsample || !BlurRegion.Equals(lastBlurRegion)) { CreateNewBlurredScreen(); lastDownsample = Downsample; lastBlurRegion = BlurRegion; } if (BlurredScreen.IsCreated()) { BlurredScreen.DiscardContents(); } //Relative blur size to maintain same look across multiple resolution material.SetFloat(_sizePropId, Size * ScreenSize); int firstDownsampleFactor = iteration > 0 ? 1 : 0; int rtW = BlurredScreen.width >> firstDownsampleFactor; //= width / (downsample + 1)^2 int rtH = BlurredScreen.height >> firstDownsampleFactor; RenderTexture tmpRt = RenderTexture.GetTemporary(rtW, rtH, 0, sourceRt.format); tmpRt.filterMode = FilterMode.Bilinear; sourceRt.filterMode = FilterMode.Bilinear; //Initial downsample material.SetVector(_cropRegionPropId, new Vector4(BlurRegion.xMin, BlurRegion.yMin, BlurRegion.xMax, BlurRegion.yMax)); Graphics.Blit(sourceRt, tmpRt, material, 1); //Downsample. (iteration - 1) pass for (int i = 2; i <= iteration; i++) { ProgressiveResampling(i, ref tmpRt); } //Upsample. (iteration - 1) pass for (int i = iteration - 1; i >= 1; i--) { ProgressiveResampling(i, ref tmpRt); } //Final upsample. Blit to blurredRt and release tmp Graphics.Blit(tmpRt, BlurredScreen, material, 0); RenderTexture.ReleaseTemporary(tmpRt); }
protected virtual void OnRenderImage(RenderTexture source, RenderTexture destination) { if (blurAlgorithm == null || BlurConfig == null) { goto draw_unmodified; } if (shouldUpdateBlur()) { OnBeforeBlur(); blurAlgorithm.Blur(source, BlurRegion, ref blurredScreen); } if (preview) { previewMaterial.SetVector(ShaderId.CROP_REGION, BlurRegion.ToMinMaxVector()); Graphics.Blit(BlurredScreen, destination, previewMaterial); return; } draw_unmodified: Graphics.Blit(source, destination); }