/// <summary> /// Performs the Canny edge detection algorithm given a color image. /// The output is a texture that stores edge gradients in Red-Green /// and edge strengths in Blue. /// Note that edge strength is equal to the length of the edge gradient. /// </summary> public static void FullCannyEdgeFilter( Texture inputTex, RenderTexture outputTex, GaussianBlurQuality blurQuality, GreyscaleTypes greyscaleMode, EdgeFilters edgeFilter, float weakEdgeThreshold, float strongEdgeThreshold, TextureWrapMode samplingWrapMode = TextureWrapMode.Clamp) { RenderTexture out_gaussian = RenderTexture.GetTemporary( inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear), out_greyscale = RenderTexture.GetTemporary( outputTex.width, outputTex.height, 0, RenderTextureFormat.RInt, RenderTextureReadWrite.Linear), out_edgeDetect = RenderTexture.GetTemporary( outputTex.width, outputTex.height, 0, RenderTextureFormat.RGFloat, RenderTextureReadWrite.Linear); out_gaussian.filterMode = FilterMode.Point; out_gaussian.wrapMode = samplingWrapMode; out_greyscale.filterMode = FilterMode.Point; out_greyscale.wrapMode = samplingWrapMode; out_edgeDetect.filterMode = FilterMode.Point; out_edgeDetect.wrapMode = samplingWrapMode; Blur(blurQuality, inputTex, out_gaussian, samplingWrapMode); Greyscale(greyscaleMode, out_gaussian, out_greyscale); EdgeFilter(edgeFilter, out_greyscale, out_edgeDetect, samplingWrapMode); CannyEdgeFilter(out_edgeDetect, outputTex, weakEdgeThreshold, strongEdgeThreshold, samplingWrapMode); RenderTexture.ReleaseTemporary(out_edgeDetect); RenderTexture.ReleaseTemporary(out_greyscale); RenderTexture.ReleaseTemporary(out_gaussian); }
public static RenderTexture Blur(GaussianBlurQuality quality, Texture inputTex, RenderTextureFormat outFormat = RenderTextureFormat.ARGB32, TextureWrapMode wrapMode = TextureWrapMode.Clamp) { var outTex = new RenderTexture(inputTex.width, inputTex.height, 0, outFormat, RenderTextureReadWrite.Linear); outTex.filterMode = FilterMode.Bilinear; outTex.wrapMode = wrapMode; Blur(quality, inputTex, outTex, wrapMode); return(outTex); }
/// <summary> /// Performs the Canny edge detection algorithm given a color image. /// </summary> public static RenderTexture FullCannyEdgeFilter( Texture inputTex, GaussianBlurQuality blurQuality, GreyscaleTypes greyscaleMode, EdgeFilters edgeFilter, float weakEdgeThreshold, float strongEdgeThreshold, TextureWrapMode samplingWrapMode = TextureWrapMode.Clamp, RenderTextureFormat outFormat = RenderTextureFormat.ARGBFloat) { var outTex = new RenderTexture(inputTex.width, inputTex.height, 0, outFormat, RenderTextureReadWrite.Linear); outTex.filterMode = FilterMode.Point; outTex.wrapMode = samplingWrapMode; FullCannyEdgeFilter(inputTex, outTex, blurQuality, greyscaleMode, edgeFilter, weakEdgeThreshold, strongEdgeThreshold, samplingWrapMode); return(outTex); }
public static void Blur(GaussianBlurQuality quality, Texture input, RenderTexture output, TextureWrapMode wrapMode = TextureWrapMode.Clamp) { //Allocate an intermediate texture for the two-pass blur. var tempTex = RenderTexture.GetTemporary(output.width, output.height, 0, output.format, RenderTextureReadWrite.Linear); tempTex.filterMode = FilterMode.Bilinear; tempTex.wrapMode = wrapMode; //Do the blur. Passes pass1, pass2; switch (quality) { case GaussianBlurQuality.Low: pass1 = Passes.Gaussian5_P1; pass2 = Passes.Gaussian5_P2; break; case GaussianBlurQuality.High: pass1 = Passes.Gaussian9_P1; pass2 = Passes.Gaussian9_P2; break; default: throw new NotImplementedException(quality.ToString()); } var mat = UberFilterMat; Graphics.Blit(input, tempTex, mat, (int)pass1); Graphics.Blit(tempTex, output, mat, (int)pass2); //Clean up. RenderTexture.ReleaseTemporary(tempTex); }