| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #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
|