Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
1,332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.33 KB | None | 0 0
  1. Shader "Effects/Bubble Shield"
  2. {
  3.     Properties
  4.     {
  5.         _Color("Color", Color) = (1,1,1,1)
  6.         _RimPower("Rim Power", Float) = 1
  7.         _Thickness("Thickness", Float) = 0.01
  8.         _DistortionStrength("DistortionStrength", Float) = 0.1
  9.     }
  10.     SubShader
  11.     {
  12.         Tags
  13.         {
  14.             "Queue" = "Transparent-1"
  15.         }
  16.  
  17.         GrabPass
  18.         {
  19.             "_BackgroundTexture"
  20.         }
  21.  
  22.         Pass
  23.         {
  24.             CGPROGRAM
  25.             #pragma vertex vert
  26.             #pragma fragment frag
  27.            
  28.             #include "UnityCG.cginc"
  29.  
  30.             struct appdata
  31.             {
  32.                 float4 vertex : POSITION;
  33.             };
  34.  
  35.             struct v2f
  36.             {
  37.                 float4 vertex : SV_POSITION;
  38.                 float4 localVertex : TEXCOORD1;
  39.                 float4 grabPos : TEXCOORD0;
  40.             };
  41.            
  42.             v2f vert (appdata v)
  43.             {
  44.                 v2f o;
  45.                 o.localVertex = v.vertex;
  46.                 o.vertex = UnityObjectToClipPos(v.vertex);
  47.                 o.grabPos = ComputeGrabScreenPos(o.vertex);
  48.                 return o;
  49.             }
  50.            
  51.             float4 _Color; 
  52.             float _Thickness;
  53.  
  54.             float4 _Ripples[10];
  55.             float _MaxRippleSize;
  56.  
  57.             float _DistortionStrength;
  58.             float _RimPower;
  59.  
  60.             sampler2D _BackgroundTexture;
  61.  
  62.             fixed4 frag (v2f input) : SV_Target
  63.             {
  64.                 float pi = 3.1415;
  65.  
  66.                 float3 sphereNormal = normalize(input.localVertex.xyz);
  67.                 float3 tangent = cross(sphereNormal, float3(0,1,0));
  68.                 float3 bitangent = cross(sphereNormal, tangent);
  69.  
  70.                 float3 normal = float3(0, 0, 1);
  71.  
  72.                 for (int i = 0; i < 10; i++)
  73.                 {
  74.                     float angle = acos(dot(sphereNormal, normalize(_Ripples[i].xyz)));
  75.  
  76.                     float radius = _Ripples[i].w;
  77.  
  78.                     float t = saturate((angle - (radius - _Thickness)) / (_Thickness * 2));
  79.  
  80.                     float offset = sin(t * pi * 2);
  81.  
  82.                     float rippleStrength = 1 - (radius / _MaxRippleSize);
  83.  
  84.                     normal.y += offset * rippleStrength;
  85.                 }
  86.  
  87.                 normal = normalize(normal);
  88.                 float3x3 m = transpose(float3x3(tangent, bitangent, sphereNormal));
  89.                 normal = mul(m, normal);
  90.  
  91.                 float3 viewNormal = mul(UNITY_MATRIX_MV, normal);
  92.  
  93.                 float4 uv = input.grabPos;
  94.                 uv.xy += viewNormal.xy * _DistortionStrength;
  95.  
  96.                 float4 bgcolor = tex2Dproj(_BackgroundTexture, uv);
  97.  
  98.                 float3 viewDir = ObjSpaceViewDir(input.localVertex);
  99.                 float NdotV = 1 - saturate(dot(normal, viewDir));
  100.                 float rimIntensity = pow(NdotV, _RimPower);
  101.                 float4 rim = _Color * rimIntensity;
  102.  
  103.                 return bgcolor + rim;
  104.  
  105.                 // return float4((normal * 0.5) + 0.5, 1);
  106.             }
  107.             ENDCG
  108.         }
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement