126 lines
4.0 KiB
HLSL

#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