SSR_Blends.hlsl 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #ifndef SSR_BLENDS
  2. #define SSR_BLENDS
  3. // Copyright 2021 Kronnect - All Rights Reserved.
  4. TEXTURE2D_X(_MainTex);
  5. float4 _MainTex_TexelSize;
  6. float4 _SSRSettings4;
  7. #define SEPARATION_POS _SSRSettings4.x
  8. float _MinimumBlur;
  9. TEXTURE2D_X(_RayCastRT);
  10. TEXTURE2D_X(_ReflectionsRT);
  11. TEXTURE2D_X(_BlurRTMip0);
  12. TEXTURE2D_X(_BlurRTMip1);
  13. TEXTURE2D_X(_BlurRTMip2);
  14. TEXTURE2D_X(_BlurRTMip3);
  15. TEXTURE2D_X(_BlurRTMip4);
  16. struct AttributesFS {
  17. float4 positionHCS : POSITION;
  18. float2 uv : TEXCOORD0;
  19. UNITY_VERTEX_INPUT_INSTANCE_ID
  20. };
  21. struct VaryingsSSR {
  22. float4 positionCS : SV_POSITION;
  23. float2 uv : TEXCOORD0;
  24. UNITY_VERTEX_INPUT_INSTANCE_ID
  25. UNITY_VERTEX_OUTPUT_STEREO
  26. };
  27. VaryingsSSR VertSSR(AttributesFS input) {
  28. VaryingsSSR output;
  29. UNITY_SETUP_INSTANCE_ID(input);
  30. UNITY_TRANSFER_INSTANCE_ID(input, output);
  31. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  32. output.positionCS = float4(input.positionHCS.xyz, 1.0);
  33. #if UNITY_UV_STARTS_AT_TOP
  34. output.positionCS.y *= -1;
  35. #endif
  36. output.uv = input.uv;
  37. return output;
  38. }
  39. half4 FragCopy (VaryingsSSR i) : SV_Target {
  40. UNITY_SETUP_INSTANCE_ID(i);
  41. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  42. i.uv = SSRStereoTransformScreenSpaceTex(i.uv);
  43. half4 pixel = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv);
  44. return pixel;
  45. }
  46. half4 FragCopyExact (VaryingsSSR i) : SV_Target {
  47. UNITY_SETUP_INSTANCE_ID(i);
  48. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  49. i.uv = SSRStereoTransformScreenSpaceTex(i.uv);
  50. half4 pixel = SAMPLE_TEXTURE2D_X(_MainTex, sampler_PointClamp, i.uv);
  51. pixel = max(pixel, 0.0);
  52. return pixel;
  53. }
  54. half4 Combine(VaryingsSSR i) {
  55. // exclude skybox from blur bleed
  56. float depth = SAMPLE_TEXTURE2D_X(_CameraDepthTexture, sampler_PointClamp, i.uv).r;
  57. #if UNITY_REVERSED_Z
  58. depth = 1.0 - depth;
  59. #endif
  60. if (depth >= 1.0) return float4(0,0,0,0);
  61. half4 mip0 = SAMPLE_TEXTURE2D_X(_ReflectionsRT, sampler_LinearClamp, i.uv);
  62. half4 mip1 = SAMPLE_TEXTURE2D_X(_BlurRTMip0, sampler_LinearClamp, i.uv);
  63. half4 mip2 = SAMPLE_TEXTURE2D_X(_BlurRTMip1, sampler_LinearClamp, i.uv);
  64. half4 mip3 = SAMPLE_TEXTURE2D_X(_BlurRTMip2, sampler_LinearClamp, i.uv);
  65. half4 mip4 = SAMPLE_TEXTURE2D_X(_BlurRTMip3, sampler_LinearClamp, i.uv);
  66. half4 mip5 = SAMPLE_TEXTURE2D_X(_BlurRTMip4, sampler_LinearClamp, i.uv);
  67. half r = mip5.a;
  68. half4 reflData = SAMPLE_TEXTURE2D_X(_RayCastRT, sampler_PointClamp, i.uv);
  69. if (reflData.z > 0) {
  70. r = min(reflData.z, r);
  71. }
  72. half roughness = clamp(r + _MinimumBlur, 0, 5);
  73. half w0 = max(0, 1.0 - roughness);
  74. half w1 = max(0, 1.0 - abs(roughness - 1.0));
  75. half w2 = max(0, 1.0 - abs(roughness - 2.0));
  76. half w3 = max(0, 1.0 - abs(roughness - 3.0));
  77. half w4 = max(0, 1.0 - abs(roughness - 4.0));
  78. half w5 = max(0, 1.0 - abs(roughness - 5.0));
  79. half4 refl = mip0 * w0 + mip1 * w1 + mip2 * w2 + mip3 * w3 + mip4 * w4 + mip5 * w5;
  80. return refl;
  81. }
  82. half4 FragCombine (VaryingsSSR i) : SV_Target {
  83. UNITY_SETUP_INSTANCE_ID(i);
  84. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  85. i.uv = SSRStereoTransformScreenSpaceTex(i.uv);
  86. return Combine(i);
  87. }
  88. half4 FragCombineWithCompare (VaryingsSSR i) : SV_Target {
  89. UNITY_SETUP_INSTANCE_ID(i);
  90. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  91. i.uv = SSRStereoTransformScreenSpaceTex(i.uv);
  92. if (i.uv.x < SEPARATION_POS - _MainTex_TexelSize.x * 3) {
  93. return 0;
  94. } else if (i.uv.x < SEPARATION_POS + _MainTex_TexelSize.x * 3) {
  95. return 1.0;
  96. } else {
  97. return Combine(i);
  98. }
  99. }
  100. #endif // SSR_BLENDS