#ifndef SSR_BLENDS #define SSR_BLENDS // Copyright 2021 Kronnect - All Rights Reserved. TEXTURE2D_X(_MainTex); float4 _MainTex_TexelSize; float4 _SSRSettings4; #define SEPARATION_POS _SSRSettings4.x float _MinimumBlur; TEXTURE2D_X(_RayCastRT); TEXTURE2D_X(_ReflectionsRT); TEXTURE2D_X(_BlurRTMip0); TEXTURE2D_X(_BlurRTMip1); TEXTURE2D_X(_BlurRTMip2); TEXTURE2D_X(_BlurRTMip3); TEXTURE2D_X(_BlurRTMip4); struct AttributesFS { float4 positionHCS : POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct VaryingsSSR { float4 positionCS : SV_POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; VaryingsSSR VertSSR(AttributesFS input) { VaryingsSSR output; UNITY_SETUP_INSTANCE_ID(input); UNITY_TRANSFER_INSTANCE_ID(input, output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); output.positionCS = float4(input.positionHCS.xyz, 1.0); #if UNITY_UV_STARTS_AT_TOP output.positionCS.y *= -1; #endif output.uv = input.uv; return output; } half4 FragCopy (VaryingsSSR i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); i.uv = SSRStereoTransformScreenSpaceTex(i.uv); half4 pixel = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv); return pixel; } half4 FragCopyExact (VaryingsSSR i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); i.uv = SSRStereoTransformScreenSpaceTex(i.uv); half4 pixel = SAMPLE_TEXTURE2D_X(_MainTex, sampler_PointClamp, i.uv); pixel = max(pixel, 0.0); return pixel; } half4 Combine(VaryingsSSR i) { // exclude skybox from blur bleed float depth = SAMPLE_TEXTURE2D_X(_CameraDepthTexture, sampler_PointClamp, i.uv).r; #if UNITY_REVERSED_Z depth = 1.0 - depth; #endif if (depth >= 1.0) return float4(0,0,0,0); half4 mip0 = SAMPLE_TEXTURE2D_X(_ReflectionsRT, sampler_LinearClamp, i.uv); half4 mip1 = SAMPLE_TEXTURE2D_X(_BlurRTMip0, sampler_LinearClamp, i.uv); half4 mip2 = SAMPLE_TEXTURE2D_X(_BlurRTMip1, sampler_LinearClamp, i.uv); half4 mip3 = SAMPLE_TEXTURE2D_X(_BlurRTMip2, sampler_LinearClamp, i.uv); half4 mip4 = SAMPLE_TEXTURE2D_X(_BlurRTMip3, sampler_LinearClamp, i.uv); half4 mip5 = SAMPLE_TEXTURE2D_X(_BlurRTMip4, sampler_LinearClamp, i.uv); half r = mip5.a; half4 reflData = SAMPLE_TEXTURE2D_X(_RayCastRT, sampler_PointClamp, i.uv); if (reflData.z > 0) { r = min(reflData.z, r); } half roughness = clamp(r + _MinimumBlur, 0, 5); half w0 = max(0, 1.0 - roughness); half w1 = max(0, 1.0 - abs(roughness - 1.0)); half w2 = max(0, 1.0 - abs(roughness - 2.0)); half w3 = max(0, 1.0 - abs(roughness - 3.0)); half w4 = max(0, 1.0 - abs(roughness - 4.0)); half w5 = max(0, 1.0 - abs(roughness - 5.0)); half4 refl = mip0 * w0 + mip1 * w1 + mip2 * w2 + mip3 * w3 + mip4 * w4 + mip5 * w5; return refl; } half4 FragCombine (VaryingsSSR i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); i.uv = SSRStereoTransformScreenSpaceTex(i.uv); return Combine(i); } half4 FragCombineWithCompare (VaryingsSSR i) : SV_Target { UNITY_SETUP_INSTANCE_ID(i); UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); i.uv = SSRStereoTransformScreenSpaceTex(i.uv); if (i.uv.x < SEPARATION_POS - _MainTex_TexelSize.x * 3) { return 0; } else if (i.uv.x < SEPARATION_POS + _MainTex_TexelSize.x * 3) { return 1.0; } else { return Combine(i); } } #endif // SSR_BLENDS