126 lines
4.0 KiB
HLSL
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 |