Пример #1
0
        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);
        }
Пример #2
0
 public void OnBeforeBlur()
 {
     if (BlurredScreen == null || !BlurredScreen.IsCreated() ||
         Downsample != lastDownsample ||
         !BlurRegion.Approximately(lastBlurRegion))
     {
         CreateNewBlurredScreen();
         lastDownsample = Downsample;
         lastBlurRegion = BlurRegion;
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }