SSR_Solve.hlsl 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef SSR_SOLVE
  2. #define SSR_SOLVE
  3. // Copyright 2021 Kronnect - All Rights Reserved.
  4. TEXTURE2D_X(_MainTex);
  5. float4 _MainTex_TexelSize;
  6. TEXTURE2D_X(_RayCastRT);
  7. float4 _SSRSettings2;
  8. #define ENERGY_CONSERVATION _SSRSettings2.y
  9. #define REFLECTIONS_MULTIPLIER _SSRSettings2.z
  10. float4 _SSRSettings4;
  11. #define REFLECTIONS_MIN_INTENSITY _SSRSettings4.y
  12. #define REFLECTIONS_MAX_INTENSITY _SSRSettings4.z
  13. #define VIGNETTE_SIZE _SSRSettings2.w
  14. struct AttributesFS {
  15. float4 positionHCS : POSITION;
  16. float2 uv : TEXCOORD0;
  17. UNITY_VERTEX_INPUT_INSTANCE_ID
  18. };
  19. struct VaryingsSSR {
  20. float4 positionCS : SV_POSITION;
  21. float2 uv : TEXCOORD0;
  22. UNITY_VERTEX_INPUT_INSTANCE_ID
  23. UNITY_VERTEX_OUTPUT_STEREO
  24. };
  25. VaryingsSSR VertSSR(AttributesFS input) {
  26. VaryingsSSR output;
  27. UNITY_SETUP_INSTANCE_ID(input);
  28. UNITY_TRANSFER_INSTANCE_ID(input, output);
  29. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  30. output.positionCS = float4(input.positionHCS.xyz, 1.0);
  31. #if UNITY_UV_STARTS_AT_TOP
  32. output.positionCS.y *= -1;
  33. #endif
  34. output.uv = input.uv;
  35. return output;
  36. }
  37. half4 FragResolve (VaryingsSSR i) : SV_Target {
  38. UNITY_SETUP_INSTANCE_ID(i);
  39. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  40. i.uv = SSRStereoTransformScreenSpaceTex(i.uv);
  41. half4 reflData = SAMPLE_TEXTURE2D_X(_RayCastRT, sampler_PointClamp, i.uv);
  42. half4 reflection = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, reflData.xy);
  43. reflection.rgb = min(reflection.rgb, 1.0); // stop NAN pixels
  44. half vd = dot2( (reflData.xy - 0.5) * 2.0 );
  45. half vignette = saturate( VIGNETTE_SIZE - vd * vd );
  46. half reflectionIntensity = clamp(reflData.a * REFLECTIONS_MULTIPLIER, REFLECTIONS_MIN_INTENSITY, REFLECTIONS_MAX_INTENSITY) * vignette;
  47. reflection.rgb *= reflectionIntensity;
  48. reflection.rgb = min(reflection.rgb, 1.2); // clamp max brightness
  49. // conserve energy
  50. half4 pixel = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv);
  51. reflection.rgb -= pixel.rgb * reflectionIntensity;
  52. // keep blur factor in alpha channel
  53. reflection.a = reflData.z;
  54. return reflection;
  55. }
  56. #endif // SSR_SOLVE