NFAA.shader 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "Hidden/NFAA" {
  3. Properties {
  4. _MainTex ("Base (RGB)", 2D) = "white" {}
  5. _BlurTex ("Base (RGB)", 2D) = "white" {}
  6. }
  7. CGINCLUDE
  8. #include "UnityCG.cginc"
  9. uniform sampler2D _MainTex;
  10. uniform float4 _MainTex_TexelSize;
  11. uniform float _OffsetScale;
  12. uniform float _BlurRadius;
  13. struct v2f {
  14. float4 pos : SV_POSITION;
  15. float2 uv[8] : TEXCOORD0;
  16. };
  17. v2f vert( appdata_img v )
  18. {
  19. v2f o;
  20. o.pos = UnityObjectToClipPos (v.vertex);
  21. float2 uv = v.texcoord.xy;
  22. float2 up = float2(0.0, _MainTex_TexelSize.y) * _OffsetScale;
  23. float2 right = float2(_MainTex_TexelSize.x, 0.0) * _OffsetScale;
  24. o.uv[0].xy = uv + up;
  25. o.uv[1].xy = uv - up;
  26. o.uv[2].xy = uv + right;
  27. o.uv[3].xy = uv - right;
  28. o.uv[4].xy = uv - right + up;
  29. o.uv[5].xy = uv - right -up;
  30. o.uv[6].xy = uv + right + up;
  31. o.uv[7].xy = uv + right -up;
  32. return o;
  33. }
  34. half4 frag (v2f i) : SV_Target
  35. {
  36. // get luminance values
  37. // maybe: experiment with different luminance calculations
  38. float topL = Luminance( tex2D(_MainTex, i.uv[0]).rgb );
  39. float bottomL = Luminance( tex2D(_MainTex, i.uv[1]).rgb );
  40. float rightL = Luminance( tex2D(_MainTex, i.uv[2]).rgb );
  41. float leftL = Luminance( tex2D(_MainTex, i.uv[3]).rgb );
  42. float leftTopL = Luminance( tex2D(_MainTex, i.uv[4]).rgb );
  43. float leftBottomL = Luminance( tex2D(_MainTex, i.uv[5]).rgb );
  44. float rightBottomL = Luminance( tex2D(_MainTex, i.uv[6]).rgb );
  45. float rightTopL = Luminance( tex2D(_MainTex, i.uv[7]).rgb );
  46. // 2 triangle subtractions
  47. float sum0 = dot(float3(1,1,1), float3(rightTopL,bottomL,leftTopL));
  48. float sum1 = dot(float3(1,1,1), float3(leftBottomL,topL,rightBottomL));
  49. float sum2 = dot(float3(1,1,1), float3(leftTopL,rightL,leftBottomL));
  50. float sum3 = dot(float3(1,1,1), float3(rightBottomL,leftL,rightTopL));
  51. // figure out "normal"
  52. float2 blurDir = half2((sum0-sum1), (sum3-sum2));
  53. blurDir *= _MainTex_TexelSize.xy * _BlurRadius;
  54. // reconstruct normal uv
  55. float2 uv_ = (i.uv[0] + i.uv[1]) * 0.5;
  56. float4 returnColor = tex2D(_MainTex, uv_);
  57. returnColor += tex2D(_MainTex, uv_+ blurDir.xy);
  58. returnColor += tex2D(_MainTex, uv_ - blurDir.xy);
  59. returnColor += tex2D(_MainTex, uv_ + float2(blurDir.x, -blurDir.y));
  60. returnColor += tex2D(_MainTex, uv_ - float2(blurDir.x, -blurDir.y));
  61. return returnColor * 0.2;
  62. }
  63. half4 fragDebug (v2f i) : SV_Target
  64. {
  65. // get luminance values
  66. // maybe: experiment with different luminance calculations
  67. float topL = Luminance( tex2D(_MainTex, i.uv[0]).rgb );
  68. float bottomL = Luminance( tex2D(_MainTex, i.uv[1]).rgb );
  69. float rightL = Luminance( tex2D(_MainTex, i.uv[2]).rgb );
  70. float leftL = Luminance( tex2D(_MainTex, i.uv[3]).rgb );
  71. float leftTopL = Luminance( tex2D(_MainTex, i.uv[4]).rgb );
  72. float leftBottomL = Luminance( tex2D(_MainTex, i.uv[5]).rgb );
  73. float rightBottomL = Luminance( tex2D(_MainTex, i.uv[6]).rgb );
  74. float rightTopL = Luminance( tex2D(_MainTex, i.uv[7]).rgb );
  75. // 2 triangle subtractions
  76. float sum0 = dot(float3(1,1,1), float3(rightTopL,bottomL,leftTopL));
  77. float sum1 = dot(float3(1,1,1), float3(leftBottomL,topL,rightBottomL));
  78. float sum2 = dot(float3(1,1,1), float3(leftTopL,rightL,leftBottomL));
  79. float sum3 = dot(float3(1,1,1), float3(rightBottomL,leftL,rightTopL));
  80. // figure out "normal"
  81. float2 blurDir = half2((sum0-sum1), (sum3-sum2));
  82. blurDir *= _MainTex_TexelSize.xy * _BlurRadius;
  83. // reconstruct normal uv
  84. float2 uv_ = (i.uv[0] + i.uv[1]) * 0.5;
  85. float4 returnColor = tex2D(_MainTex, uv_);
  86. returnColor += tex2D(_MainTex, uv_+ blurDir.xy);
  87. returnColor += tex2D(_MainTex, uv_ - blurDir.xy);
  88. returnColor += tex2D(_MainTex, uv_ + float2(blurDir.x, -blurDir.y));
  89. returnColor += tex2D(_MainTex, uv_ - float2(blurDir.x, -blurDir.y));
  90. blurDir = half2((sum0-sum1), (sum3-sum2)) * _BlurRadius;
  91. return half4(normalize( half3(blurDir,1) * 0.5 + 0.5), 1);
  92. return returnColor * 0.2;
  93. }
  94. ENDCG
  95. SubShader {
  96. Pass {
  97. ZTest Always Cull Off ZWrite Off
  98. CGPROGRAM
  99. #pragma vertex vert
  100. #pragma fragment frag
  101. #pragma target 3.0
  102. #pragma exclude_renderers d3d11_9x
  103. ENDCG
  104. }
  105. Pass {
  106. ZTest Always Cull Off ZWrite Off
  107. CGPROGRAM
  108. #pragma vertex vert
  109. #pragma fragment fragDebug
  110. #pragma target 3.0
  111. #pragma exclude_renderers d3d11_9x
  112. ENDCG
  113. }
  114. }
  115. Fallback off
  116. }