Advertisement
Guest User

Untitled

a guest
Dec 24th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Sprites/Filters"
  2. {
  3.     Properties
  4.     {
  5.         [NoScaleOffset]_MainTex ("Main texture", 2D) = "white" {}
  6.         [KeywordEnum(Edges_Transparency, Edges)] _Mode("Mode", Float) = 0
  7.         _Intensity ("", Range(1,20)) = 0
  8.     }
  9.     SubShader
  10.     {
  11.  
  12.         Pass
  13.         {
  14.             Blend One OneMinusSrcAlpha
  15.  
  16.             CGPROGRAM
  17.             #pragma vertex vert
  18.             #pragma fragment frag
  19.            
  20.             #include "UnityCG.cginc"
  21.             #pragma multi_compile _MODE_EDGES_TRANSPARENCY _MODE_EDGES
  22.  
  23.  
  24.             #define MAX_INTENSITY 20
  25.             #define PIXELATED_MULTIPLIER 20
  26.  
  27.             struct appdata
  28.             {
  29.                 float4 vertex : POSITION;
  30.                 float2 uv : TEXCOORD0;
  31.                 float4 color : COLOR;
  32.             };
  33.  
  34.             struct v2f
  35.             {
  36.                 float2 uv : TEXCOORD0;
  37.                 float4 vertex : SV_POSITION;
  38.                 float4 color : COLOR;
  39.             };
  40.  
  41.             sampler2D _MainTex;
  42.             float4 _MainTex_TexelSize;
  43.  
  44.             float _Intensity;
  45.  
  46.             v2f vert (appdata v)
  47.             {
  48.                 v2f o;
  49.                 o.vertex = UnityObjectToClipPos(v.vertex);
  50.                 o.uv = v.uv;
  51.                 o.color = v.color;
  52.                 return o;
  53.             }
  54.  
  55.             //filters
  56.            
  57.             float4 edgeDetectionTransparent(v2f i)
  58.             {
  59.                 float4 col = tex2D(_MainTex, i.uv);
  60.                 float4 col2 = tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x,i.uv.y - _MainTex_TexelSize.y));
  61.                
  62.                 float4 finalCol = float4((col - col2).rgb * _Intensity, col.a);
  63.                 finalCol.a = (finalCol.r + finalCol.g + finalCol.b)/3.0f * col.a;
  64.                 return finalCol;
  65.             }
  66.  
  67.             float4 edgeDetection(v2f i)
  68.             {
  69.                 float4 col = tex2D(_MainTex, i.uv);
  70.                 float4 col2 = tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x,i.uv.y - _MainTex_TexelSize.y));
  71.                
  72.                 float4 finalCol = float4((col - col2).rgb * _Intensity, col.a);
  73.                 return finalCol;
  74.             }
  75.  
  76.             float4 inverseEdgeDetection(v2f i)
  77.             {
  78.                 float4 col = tex2D(_MainTex, i.uv);
  79.                 float4 col2 = tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x,i.uv.y - _MainTex_TexelSize.y));
  80.                 float4 finalCol = float4((col - col2).rgb * _Intensity, col.a);
  81.  
  82.                 float par = 1 - finalCol.r;
  83.                 col.rgb *= par;
  84.                 //finalCol = float4(col.rgb - finalCol.rgb, col.a);
  85.                 //finalCol.a = (finalCol.r + finalCol.g + finalCol.b)/3.0f * col.a;
  86.                 return col;
  87.             }
  88.  
  89.             float4 emboss(v2f i)
  90.             {
  91.                 float4 col = tex2D(_MainTex, i.uv);
  92.                 float4 finalCol = tex2D(_MainTex, i.uv) + tex2D(_MainTex, float2(i.uv.x + _MainTex_TexelSize.x, i.uv.y + _MainTex_TexelSize.y)) +
  93.                     tex2D(_MainTex, float2(i.uv.x + _MainTex_TexelSize.x, i.uv.y)) + tex2D(_MainTex, float2(i.uv.x, i.uv.y + _MainTex_TexelSize.y))
  94.                     - tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x, i.uv.y)) - tex2D(_MainTex, float2(i.uv.x, i.uv.y - _MainTex_TexelSize.y))
  95.                     - tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x, i.uv.y - _MainTex_TexelSize.y));
  96.  
  97.                 finalCol = float4(finalCol.rgb * _Intensity, col.a);
  98.  
  99.                 return finalCol;
  100.             }
  101.             /*
  102.             fixed4 laplacianFilter(v2f i)
  103.             {
  104.                 fixed4 col = tex2D(_MainTex, i.uv) * 8;
  105.                 fixed4 substract = -(tex2D(_MainTex, float2(i.uv.x + _MainTex_TexelSize.x, i.uv.y)) + tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x, i.uv.y))
  106.                     + tex2D(_MainTex, float2(i.uv.x + _MainTex_TexelSize.x, i.uv.y - _MainTex_TexelSize.y)) + tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x, i.uv.y - _MainTex_TexelSize.y))
  107.                     + tex2D(_MainTex, float2(i.uv.x + _MainTex_TexelSize.x, i.uv.y + _MainTex_TexelSize.y)) + tex2D(_MainTex, float2(i.uv.x - _MainTex_TexelSize.x, i.uv.y + _MainTex_TexelSize.y))
  108.                     + tex2D(_MainTex, float2(i.uv.x, i.uv.y + _MainTex_TexelSize.y)) + tex2D(_MainTex, float2(i.uv.x, i.uv.y - _MainTex_TexelSize.y)));
  109.  
  110.                 col = col + substract;
  111.                 col *= _Intensity;
  112.                 col.a = 1;
  113.                 return col;
  114.  
  115.             }*/
  116.  
  117.             float4 blur(v2f i)
  118.             {
  119.                 return float4(0,0,0,0);
  120.             }
  121.  
  122.             float4 luminance(float4 color)
  123.             {
  124.                 float lum = 0.299*color.r + 0.587*color.g + 0.114*color.b;
  125.                 return float4(lum,lum,lum, color.a);
  126.             }
  127.  
  128.             // filters
  129.            
  130.             // additional
  131.             float4 colorLerp(float4 col1, float4 col2, float val)
  132.             {
  133.                 return col1 * (1 - val) + col2 * val;
  134.             }
  135.  
  136.             float lerp(float min, float max, float cur) // cur = [0,1]
  137.             {
  138.                 return min  + (max-min) * cur;
  139.             }
  140.             // additional
  141.  
  142.             float4 frag (v2f i) : SV_Target
  143.             {
  144.                 // sample the texture
  145.                 float4 spriteColor = tex2D(_MainTex, i.uv);
  146.                 float4 col = spriteColor;
  147.  
  148.                 #if EDGES_TRANSPARENCY
  149.                     col = edgeDetectionTransparent(i);             
  150.                     float maxChannel = max(col.r, max(col.g, col.b));
  151.                     col.rgb = float3(maxChannel,maxChannel, maxChannel);
  152.                 #endif
  153.  
  154.                 #if EDGES
  155.                     col = edgeDetection(i);
  156.                     float maxChannel = max(col.r, max(col.g, col.b));
  157.                     col.rgb = float3(maxChannel,maxChannel, maxChannel);
  158.                 #endif
  159.  
  160.                 /*else if(_Filter == 2) // EDGES
  161.                 {
  162.                    
  163.                 }
  164.                 else if(_Filter == 3)
  165.                 {
  166.                     col = emboss(i);
  167.                     //col.rgb *= spriteColor.a;
  168.                 }
  169.                 else if(_Filter == 4)
  170.                 {
  171.                     col = inverseEdgeDetection(i);
  172.                     //col.rgb *= spriteColor.a;
  173.                 }
  174.                 else if(_Filter == 5) // BLACK_WHITE
  175.                 {
  176.                     col = colorLerp(col, luminance(col), _Intensity/ MAX_INTENSITY);
  177.                 }
  178.                 else if(_Filter == 6) // PIXELATED
  179.                 {
  180.                     float pixelU = lerp(_MainTex_TexelSize.x,_MainTex_TexelSize.x * PIXELATED_MULTIPLIER,
  181.                         _Intensity/MAX_INTENSITY);
  182.                     float pixelV = lerp(_MainTex_TexelSize.y,_MainTex_TexelSize.y * PIXELATED_MULTIPLIER,
  183.                         _Intensity/MAX_INTENSITY);
  184.  
  185.                     float2 uv = float2((int)(i.uv.x / pixelU) * pixelU,
  186.                         (int)(i.uv.y / pixelV) * pixelV);
  187.  
  188.                     col = tex2D(_MainTex, uv);
  189.                 }
  190.                 else if(_Filter == 7)
  191.                 {
  192.                
  193.                 }
  194.                     */
  195.  
  196.                 col *= i.color;
  197.                 col.rgb *= col.a;  
  198.  
  199.                 return col;
  200.             }
  201.             ENDCG
  202.         }
  203.     }
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement