Frost.shader 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "Custom/Frost"
  3. {
  4. Properties
  5. {
  6. _Color("Color", Color) = (1, 1, 1, 1)
  7. _MainTex("Diffuse", 2D) = "white" {}
  8. _Noise("Noise", 2D) = "black" {}
  9. _Range("Range", Float) = 0.025
  10. _Blur("Blur", Float) = 0.005
  11. }
  12. SubShader
  13. {
  14. Cull Back
  15. GrabPass{ "_Frost" }
  16. CGINCLUDE
  17. #include "UnityCG.cginc"
  18. half4 _Color;
  19. sampler2D _MainTex;
  20. float4 _MainTex_ST;
  21. sampler2D _Frost;
  22. sampler2D _Noise;
  23. float4 _Noise_ST;
  24. half _Range;
  25. half _Blur;
  26. ENDCG
  27. Pass
  28. {
  29. CGPROGRAM
  30. #pragma target 3.0
  31. #pragma vertex vert
  32. #pragma fragment frag
  33. struct v2f
  34. {
  35. float4 pos : SV_POSITION;
  36. float3 uv : TEXCOORD;
  37. float4 screenPos : TEXCOORD1;
  38. float3 ray : TEXCOORD2;
  39. };
  40. v2f vert(appdata_full v)
  41. {
  42. v2f o;
  43. o.pos = UnityObjectToClipPos(v.vertex);
  44. o.uv = v.texcoord;
  45. o.screenPos = ComputeScreenPos(o.pos);
  46. o.ray = mul(UNITY_MATRIX_MV, v.vertex).xyz * float3(-1, -1, 1);
  47. return o;
  48. }
  49. half4 frag(v2f i) : SV_Target
  50. {
  51. i.ray = i.ray * (_ProjectionParams.z / i.ray.z);
  52. float2 uv = i.screenPos.xy / i.screenPos.w;
  53. float2 frostUV = tex2D(_Noise, i.uv * _Noise_ST.xy + _Noise_ST.zw).xy;
  54. frostUV -= 0.5;
  55. frostUV *= _Range;
  56. frostUV += uv;
  57. half4 frost = tex2D(_Frost, frostUV);
  58. frost += tex2D(_Frost, frostUV + float2(_Blur, _Blur));
  59. frost += tex2D(_Frost, frostUV + float2(_Blur, -_Blur));
  60. frost += tex2D(_Frost, frostUV + float2(-_Blur, _Blur));
  61. frost += tex2D(_Frost, frostUV + float2(-_Blur, -_Blur));
  62. frost *= 0.2;
  63. half4 diffuse = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw);
  64. half alpha = _Color.a * diffuse.a;
  65. return half4(frost.xyz + (diffuse.rgb * _Color.rgb * alpha), 1);
  66. }
  67. ENDCG
  68. }
  69. }
  70. Fallback Off
  71. }