#ifndef BEAUTIFY_PPSEA_FX #define BEAUTIFY_PPSEA_FX // Copyright 2020-2021 Kronnect - All Rights Reserved. #include "BeautifyCommon.hlsl" TEXTURE2D_X(_MainTex); TEXTURE2D_X(_EALumSrc); TEXTURE2D_X(_EAHist); TEXTURE2D(_EAMask); float4 _MainTex_TexelSize; float4 _MainTex_ST; float4 _EyeAdaptation; float4 _EyeAdaptation2; // x: center weight, y: min camera distance, z: middle gray, w: unused struct VaryingsCross { float4 positionCS : SV_POSITION; float2 uv: TEXCOORD0; BEAUTIFY_VERTEX_CROSS_UV_DATA UNITY_VERTEX_OUTPUT_STEREO }; VaryingsCross VertCross(AttributesSimple v) { VaryingsCross o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.positionCS = v.positionOS; o.positionCS.y *= _ProjectionParams.x * _FlipY; o.uv = v.uv; BEAUTIFY_VERTEX_OUTPUT_CROSS_UV(o) return o; } float4 FragScreenLum (VaryingsSimple i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); float2 uv = UnityStereoTransformScreenSpaceTex(i.uv); #if BEAUTIFY_EA_USE_DEPTH float eyeDepth = BEAUTIFY_GET_SCENE_DEPTH_EYE(uv); if (eyeDepth < _EyeAdaptation2.y) { return 0; } #endif float4 c = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv); #if UNITY_COLORSPACE_GAMMA c.rgb = GAMMA_TO_LINEAR(c.rgb); #endif float weight = 1.0; #if !BEAUTIFY_EA_LEGACY_MODE #if BEAUTIFY_EA_USE_MASK float mask = SAMPLE_TEXTURE2D(_EAMask, sampler_LinearClamp, i.uv).a; weight = mask; #endif float2 dc = uv - 0.5; float r2 = length(dc) * 2.0; weight *= exp(-r2 * _EyeAdaptation2.x); #endif float weightClamped = saturate(weight); float luma = getLuma(c.rgb); float lumaLogRaw = log(1.0 + luma); return float4(lumaLogRaw, lumaLogRaw, weightClamped, 0); } float4 FragReduceScreenLum (VaryingsCross i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); i.uv = UnityStereoTransformScreenSpaceTex(i.uv); BEAUTIFY_FRAG_SETUP_CROSS_UV(i); float4 c1 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv1); float4 c2 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv2); float4 c3 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv3); float4 c4 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv4); float maxLum = max( c1.g, max( c2.g, max( c3.g, c4.g )) ); // used by purkinje #if BEAUTIFY_EA_LEGACY_MODE c1.r = (c1.r + c2.r + c3.r + c4.r) * 0.25; c1.g = maxLum; #else float w1 = c1.b; float w2 = c2.b; float w3 = c3.b; float w4 = c4.b; float weightSum = w1 + w2 + w3 + w4; float weightedSum = c1.r * w1 + c2.r * w2 + c3.r * w3 + c4.r * w4; if (weightSum > 0) { weightedSum /= weightSum; } c1.r = weightedSum; c1.g = maxLum; c1.b = weightSum * 0.25; #endif return c1; } float4 FragBlendScreenLum (VaryingsSimple i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); float2 uv = UnityStereoTransformScreenSpaceTex(float2(0.5, 0.5)); float4 c = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv); float4 p = SAMPLE_TEXTURE2D_X(_EAHist, sampler_LinearClamp, uv); float speed = c.r < p.r ? _EyeAdaptation.z: _EyeAdaptation.w; c.a = speed * unity_DeltaTime.x; return c; } float4 FragBlend (VaryingsSimple i) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); i.uv = UnityStereoTransformScreenSpaceTex(i.uv); float4 c = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, 0.5.xx); c.a = 1.0; return c; } #endif