SSR_Blur.hlsl 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef SSR_BLUR
  2. #define SSR_BLUR
  3. // Copyright 2021 Kronnect - All Rights Reserved.
  4. TEXTURE2D_X(_MainTex);
  5. float4 _MainTex_TexelSize;
  6. TEXTURE2D_X(_RayCastRT);
  7. float4 _SSRSettings2;
  8. #define BLUR_MULTIPLIER _SSRSettings2.y
  9. float4 _SSRSettings4;
  10. #define DENOISE_POWER _SSRSettings4.w
  11. float2 _SSRBlurStrength;
  12. #define BLUR_STRENGTH_HORIZ _SSRBlurStrength.x
  13. #define BLUR_STRENGTH_VERT _SSRBlurStrength.y
  14. #if defined(UNITY_SINGLE_PASS_STEREO)
  15. #define SSR_VERTEX_CROSS_DATA
  16. #define SSR_VERTEX_OUTPUT_GAUSSIAN_UV(o)
  17. #if defined(SSR_BLUR_HORIZ)
  18. #define SSR_FRAG_SETUP_GAUSSIAN_UV(i) float2 offset1 = float2(_MainTex_TexelSize.x * 1.3846153846 * BLUR_STRENGTH_HORIZ, 0); float2 offset2 = float2(_MainTex_TexelSize.x * 3.2307692308 * BLUR_STRENGTH_HORIZ, 0);
  19. #else
  20. #define SSR_FRAG_SETUP_GAUSSIAN_UV(i) float2 offset1 = float2(0, _MainTex_TexelSize.y * 1.3846153846 * BLUR_STRENGTH_VERT); float2 offset2 = float2(0, _MainTex_TexelSize.y * 3.2307692308 * BLUR_STRENGTH_VERT);
  21. #endif
  22. #else
  23. #define SSR_VERTEX_CROSS_DATA float2 offset1 : TEXCOORD1; float2 offset2 : TEXCOORD2;
  24. #if defined(SSR_BLUR_HORIZ)
  25. #define SSR_VERTEX_OUTPUT_GAUSSIAN_UV(o) o.offset1 = float2(_MainTex_TexelSize.x * 1.3846153846 * BLUR_STRENGTH_HORIZ, 0); o.offset2 = float2(_MainTex_TexelSize.x * 3.2307692308 * BLUR_STRENGTH_HORIZ, 0);
  26. #else
  27. #define SSR_VERTEX_OUTPUT_GAUSSIAN_UV(o) o.offset1 = float2(0, _MainTex_TexelSize.y * 1.3846153846 * BLUR_STRENGTH_VERT); o.offset2 = float2(0, _MainTex_TexelSize.y * 3.2307692308 * BLUR_STRENGTH_VERT);
  28. #endif
  29. #define SSR_FRAG_SETUP_GAUSSIAN_UV(i) float2 offset1 = i.offset1; float2 offset2 = i.offset2;
  30. #endif
  31. struct AttributesFS {
  32. float4 positionHCS : POSITION;
  33. float2 uv : TEXCOORD0;
  34. UNITY_VERTEX_INPUT_INSTANCE_ID
  35. };
  36. struct VaryingsCross {
  37. float4 positionCS : SV_POSITION;
  38. float2 uv : TEXCOORD0;
  39. SSR_VERTEX_CROSS_DATA
  40. UNITY_VERTEX_INPUT_INSTANCE_ID
  41. UNITY_VERTEX_OUTPUT_STEREO
  42. };
  43. VaryingsCross VertBlur(AttributesFS input) {
  44. VaryingsCross output;
  45. UNITY_SETUP_INSTANCE_ID(v);
  46. UNITY_TRANSFER_INSTANCE_ID(input, output);
  47. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  48. output.positionCS = float4(input.positionHCS.xyz, 1.0);
  49. #if UNITY_UV_STARTS_AT_TOP
  50. output.positionCS.y *= -1;
  51. #endif
  52. output.uv = input.uv;
  53. SSR_VERTEX_OUTPUT_GAUSSIAN_UV(output)
  54. return output;
  55. }
  56. half4 FragBlur (VaryingsCross input): SV_Target {
  57. UNITY_SETUP_INSTANCE_ID(input);
  58. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  59. input.uv = SSRStereoTransformScreenSpaceTex(input.uv);
  60. SSR_FRAG_SETUP_GAUSSIAN_UV(input)
  61. float2 uv = input.uv;
  62. half4 c0 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv);
  63. half4 c1 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv + offset1);
  64. half4 c2 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv - offset1);
  65. half4 c3 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv + offset2);
  66. half4 c4 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv - offset2);
  67. #if SSR_DENOISE
  68. half l0 = abs(getLuma(c0.rgb));
  69. half l1 = abs(getLuma(c1.rgb));
  70. half l2 = abs(getLuma(c2.rgb));
  71. half l3 = abs(getLuma(c3.rgb));
  72. half l4 = abs(getLuma(c4.rgb));
  73. half ml = (l0+l1+l2+l3+l4) * 0.2;
  74. c0.rgb *= pow( (1.0 + min(ml, l0)) / (1.0 + l0) , DENOISE_POWER);
  75. c1.rgb *= pow( (1.0 + min(ml, l1)) / (1.0 + l1) , DENOISE_POWER);
  76. c2.rgb *= pow( (1.0 + min(ml, l2)) / (1.0 + l2) , DENOISE_POWER);
  77. c3.rgb *= pow( (1.0 + min(ml, l3)) / (1.0 + l3) , DENOISE_POWER);
  78. c4.rgb *= pow( (1.0 + min(ml, l4)) / (1.0 + l4) , DENOISE_POWER);
  79. #endif
  80. half4 blurred = c0 * 0.2270270270 + (c1 + c2) * 0.3162162162 + (c3 + c4) * 0.0702702703;
  81. return blurred;
  82. }
  83. #endif // SSR_BLUR