411 lines
13 KiB
HLSL
411 lines
13 KiB
HLSL
#ifndef BEAUTIFY_PPSLUM_FX
|
|
#define BEAUTIFY_PPSLUM_FX
|
|
|
|
// Copyright 2020-2021 Kronnect - All Rights Reserved.
|
|
#include "BeautifyCommon.hlsl"
|
|
|
|
TEXTURE2D_X(_MainTex);
|
|
TEXTURE2D_X(_BloomTex);
|
|
float4 _BloomTex_TexelSize;
|
|
TEXTURE2D_X(_CombineTex);
|
|
TEXTURE2D_X(_BloomTex1);
|
|
TEXTURE2D_X(_BloomTex2);
|
|
TEXTURE2D_X(_BloomTex3);
|
|
TEXTURE2D_X(_BloomTex4);
|
|
float4 _MainTex_TexelSize;
|
|
float4 _MainTex_ST;
|
|
float4 _Bloom;
|
|
float4 _BloomWeights;
|
|
float4 _BloomWeights2;
|
|
float4 _BloomTint;
|
|
float3 _BloomTint0, _BloomTint1, _BloomTint2, _BloomTint3, _BloomTint4, _BloomTint5;
|
|
float _BloomSpread;
|
|
float4 _AFTint;
|
|
float _BlurScale;
|
|
float4 _AFData;
|
|
|
|
#if defined(USE_AF_THRESHOLD)
|
|
#define MAX_BRIGHTNESS _AFData.w
|
|
#else
|
|
#define MAX_BRIGHTNESS _BloomWeights2.z
|
|
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_ANAMORPHIC_FLARES_USE_DEPTH
|
|
float _BloomDepthThreshold;
|
|
float _BloomNearThreshold;
|
|
float _AFDepthThreshold;
|
|
float _AFNearThreshold;
|
|
#endif
|
|
|
|
TEXTURE2D_X(_BloomSourceDepth);
|
|
TEXTURE2D_X(_AFSourceDepth);
|
|
|
|
struct VaryingsCross {
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv: TEXCOORD0;
|
|
BEAUTIFY_VERTEX_CROSS_UV_DATA
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
struct VaryingsLum {
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv: TEXCOORD0;
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
struct VaryingsCrossLum {
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv: TEXCOORD0;
|
|
BEAUTIFY_VERTEX_CROSS_UV_DATA
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
|
|
VaryingsLum VertLum(AttributesSimple input) {
|
|
|
|
VaryingsLum output;
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
output.positionCS = input.positionOS;
|
|
output.positionCS.y *= _ProjectionParams.x * _FlipY;
|
|
output.uv = input.uv;
|
|
|
|
return output;
|
|
}
|
|
|
|
half Brightness(half3 c) {
|
|
return max(c.r, max(c.g, c.b));
|
|
}
|
|
|
|
half Included(half4 c) {
|
|
#if BEAUTIFY_BLOOM_USE_LAYER_INCLUSION || BEAUTIFY_ANAMORPHIC_FLARES_USE_LAYER_INCLUSION
|
|
return Brightness(c.rgb) >= 0.01;
|
|
#else
|
|
return Brightness(c.rgb) < 0.01;
|
|
#endif
|
|
}
|
|
|
|
half3 ColorAboveThreshold(half3 c, half brightness) {
|
|
#if defined(USE_AF_THRESHOLD)
|
|
half threshold = _AFData.y;
|
|
#else
|
|
half threshold = _Bloom.w;
|
|
#endif
|
|
|
|
#if BEAUTIFY_ANAMORPHIC_PROP_THRESHOLDING || BEAUTIFY_BLOOM_PROP_THRESHOLDING
|
|
half cs = clamp(brightness - 0.5 * threshold, 0.0, threshold);
|
|
cs = 0.5 * cs * cs / (threshold + 0.0001);
|
|
c *= max(brightness - threshold, cs) / max(brightness, 0.0001);
|
|
#else
|
|
c = max(c - threshold, 0);
|
|
#endif
|
|
|
|
return c;
|
|
}
|
|
|
|
half4 FragLum (VaryingsLum i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
|
|
half4 c = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv);
|
|
c = clamp(c, 0.0.xxxx, MAX_BRIGHTNESS.xxxx);
|
|
|
|
#if UNITY_COLORSPACE_GAMMA
|
|
c.rgb = GAMMA_TO_LINEAR(c.rgb);
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_ANAMORPHIC_FLARES_USE_DEPTH
|
|
float depth01 = BEAUTIFY_GET_SCENE_DEPTH_01(i.uv);
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH
|
|
c.rgb *= max(0, 1.0 - depth01 * _BloomDepthThreshold);
|
|
c.rgb *= min(1.0, depth01 / _BloomNearThreshold);
|
|
#endif
|
|
|
|
#if BEAUTIFY_ANAMORPHIC_FLARES_USE_DEPTH
|
|
c.rgb *= max(0, 1.0 - depth01 * _AFDepthThreshold);
|
|
c.rgb *= min(1.0, depth01 / _AFNearThreshold);
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_LAYER || BEAUTIFY_BLOOM_USE_LAYER_INCLUSION
|
|
half included = Included(SAMPLE_TEXTURE2D_X(_BloomSourceDepth, sampler_LinearClamp, i.uv));
|
|
c.rgb *= included;
|
|
#endif
|
|
|
|
#if BEAUTIFY_ANAMORPHIC_FLARES_USE_LAYER || BEAUTIFY_ANAMORPHIC_FLARES_USE_LAYER_INCLUSION
|
|
half included = Included(SAMPLE_TEXTURE2D_X(_AFSourceDepth, sampler_LinearClamp, i.uv));
|
|
c.rgb *= included;
|
|
#endif
|
|
|
|
c.a = Brightness(c.rgb);
|
|
#if !defined(USE_AF_THRESHOLD)
|
|
c.rgb = lerp(c.rgb, c.a * _BloomTint.rgb, _BloomTint.a);
|
|
#endif
|
|
c.rgb = ColorAboveThreshold(c.rgb, c.a);
|
|
return c;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
VaryingsCrossLum VertCrossLum(AttributesSimple v) {
|
|
VaryingsCrossLum 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;
|
|
}
|
|
|
|
half4 FragLumAntiflicker(VaryingsCrossLum i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
BEAUTIFY_FRAG_SETUP_CROSS_UV(i)
|
|
|
|
half4 c1 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv1);
|
|
half4 c2 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv2);
|
|
half4 c3 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv3);
|
|
half4 c4 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv4);
|
|
|
|
c1 = clamp(c1, 0.0.xxxx, MAX_BRIGHTNESS.xxxx);
|
|
c2 = clamp(c2, 0.0.xxxx, MAX_BRIGHTNESS.xxxx);
|
|
c3 = clamp(c3, 0.0.xxxx, MAX_BRIGHTNESS.xxxx);
|
|
c4 = clamp(c4, 0.0.xxxx, MAX_BRIGHTNESS.xxxx);
|
|
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_ANAMORPHIC_FLARES_USE_DEPTH
|
|
float depth01 = BEAUTIFY_GET_SCENE_DEPTH_01(i.uv);
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH
|
|
float depthAtten = max(0, 1.0 - depth01 * _BloomDepthThreshold);
|
|
c1.rgb *= depthAtten;
|
|
c2.rgb *= depthAtten;
|
|
c3.rgb *= depthAtten;
|
|
c4.rgb *= depthAtten;
|
|
float nearAtten = min(1.0, depth01 / _BloomNearThreshold);
|
|
c1.rgb *= nearAtten;
|
|
c2.rgb *= nearAtten;
|
|
c3.rgb *= nearAtten;
|
|
c4.rgb *= nearAtten;
|
|
#endif
|
|
|
|
#if BEAUTIFY_ANAMORPHIC_FLARES_USE_DEPTH
|
|
float depthAtten = max(0, 1.0 - depth01 * _AFDepthThreshold);
|
|
c1.rgb *= depthAtten;
|
|
c2.rgb *= depthAtten;
|
|
c3.rgb *= depthAtten;
|
|
c4.rgb *= depthAtten;
|
|
float nearAtten = min(1.0, depth01 / _AFNearThreshold);
|
|
c1.rgb *= nearAtten;
|
|
c2.rgb *= nearAtten;
|
|
c3.rgb *= nearAtten;
|
|
c4.rgb *= nearAtten;
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_LAYER || BEAUTIFY_BLOOM_USE_LAYER_INCLUSION
|
|
half included = Included(SAMPLE_TEXTURE2D_X(_BloomSourceDepth, sampler_LinearClamp, i.uv));
|
|
c1.rgb *= included;
|
|
c2.rgb *= included;
|
|
c3.rgb *= included;
|
|
c4.rgb *= included;
|
|
#endif
|
|
|
|
#if BEAUTIFY_ANAMORPHIC_FLARES_USE_LAYER || BEAUTIFY_ANAMORPHIC_FLARES_USE_LAYER_INCLUSION
|
|
half included = Included(SAMPLE_TEXTURE2D_X(_AFSourceDepth, sampler_LinearClamp, i.uv));
|
|
c1.rgb *= included;
|
|
c2.rgb *= included;
|
|
c3.rgb *= included;
|
|
c4.rgb *= included;
|
|
#endif
|
|
|
|
c1.a = Brightness(c1.rgb);
|
|
c2.a = Brightness(c2.rgb);
|
|
c3.a = Brightness(c3.rgb);
|
|
c4.a = Brightness(c4.rgb);
|
|
|
|
half w1 = 1.0 / (c1.a + 1.0);
|
|
half w2 = 1.0 / (c2.a + 1.0);
|
|
half w3 = 1.0 / (c3.a + 1.0);
|
|
half w4 = 1.0 / (c4.a + 1.0);
|
|
|
|
half dd = 1.0 / (w1 + w2 + w3 + w4);
|
|
c1 = (c1 * w1 + c2 * w2 + c3 * w3 + c4 * w4) * dd;
|
|
|
|
#if UNITY_COLORSPACE_GAMMA
|
|
c1.rgb = GAMMA_TO_LINEAR(c1.rgb);
|
|
#endif
|
|
|
|
#if !defined(USE_AF_THRESHOLD)
|
|
c1.rgb = lerp(c1.rgb, c1.a * _BloomTint.rgb, _BloomTint.a);
|
|
#endif
|
|
c1.rgb = ColorAboveThreshold(c1.rgb, c1.a);
|
|
|
|
return c1;
|
|
}
|
|
|
|
float4 FragBloomCompose (VaryingsSimple i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
|
|
float4 b0 = SAMPLE_TEXTURE2D_X( _BloomTex , sampler_LinearClamp, i.uv );
|
|
float4 b1 = SAMPLE_TEXTURE2D_X( _BloomTex1 , sampler_LinearClamp, i.uv );
|
|
float4 b2 = SAMPLE_TEXTURE2D_X( _BloomTex2 , sampler_LinearClamp, i.uv );
|
|
float4 b3 = SAMPLE_TEXTURE2D_X( _BloomTex3 , sampler_LinearClamp, i.uv );
|
|
float4 b4 = SAMPLE_TEXTURE2D_X( _BloomTex4 , sampler_LinearClamp, i.uv );
|
|
float4 b5 = SAMPLE_TEXTURE2D_X( _MainTex , sampler_LinearClamp, i.uv );
|
|
b0.rgb *= _BloomTint0;
|
|
b1.rgb *= _BloomTint1;
|
|
b2.rgb *= _BloomTint2;
|
|
b3.rgb *= _BloomTint3;
|
|
b4.rgb *= _BloomTint4;
|
|
b5.rgb *= _BloomTint5;
|
|
float4 pixel = b0 * _BloomWeights.x + b1 * _BloomWeights.y + b2 * _BloomWeights.z + b3 * _BloomWeights.w + b4 * _BloomWeights2.x + b5 * _BloomWeights2.y;
|
|
//pixel.rgb = lerp(pixel.rgb, Brightness(pixel.rgb) * _BloomTint.rgb, _BloomTint.a);
|
|
return pixel;
|
|
}
|
|
|
|
inline float4 Lerp3(float4 a, float4 b, float4 c, float t) {
|
|
if (t <= 0.5) {
|
|
return lerp(a, b, t * 2.0);
|
|
} else {
|
|
return lerp(b, c, t * 2.0 - 1.0);
|
|
}
|
|
}
|
|
|
|
float4 FragResample(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 w1 = 1.0 / (c1.a + 1.0);
|
|
float w2 = 1.0 / (c2.a + 1.0);
|
|
float w3 = 1.0 / (c3.a + 1.0);
|
|
float w4 = 1.0 / (c4.a + 1.0);
|
|
|
|
float dd = 1.0 / (w1 + w2 + w3 + w4);
|
|
float4 v = (c1 * w1 + c2 * w2 + c3 * w3 + c4 * w4) * dd;
|
|
#if defined(COMBINE_BLOOM)
|
|
float4 o = SAMPLE_TEXTURE2D_X(_BloomTex, sampler_LinearClamp, i.uv);
|
|
v = Lerp3(o, o+v, v, _BloomSpread);
|
|
#endif
|
|
return v;
|
|
}
|
|
|
|
float4 FragResampleAF(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 w1 = 1.0 / (c1.a + 1.0);
|
|
float w2 = 1.0 / (c2.a + 1.0);
|
|
float w3 = 1.0 / (c3.a + 1.0);
|
|
float w4 = 1.0 / (c4.a + 1.0);
|
|
|
|
float dd = 1.0 / (w1 + w2 + w3 + w4);
|
|
float4 v = (c1 * w1 + c2 * w2 + c3 * w3 + c4 * w4) * dd;
|
|
v.rgb = lerp(v.rgb, Brightness(c1.rgb) * _AFTint.rgb, _AFTint.a);
|
|
v.rgb *= _AFData.xxx;
|
|
|
|
#if defined(COMBINE_BLOOM)
|
|
float4 o = SAMPLE_TEXTURE2D_X(_BloomTex, sampler_LinearClamp, i.uv);
|
|
v += o;
|
|
#endif
|
|
|
|
return v;
|
|
}
|
|
|
|
|
|
float4 FragCombine(VaryingsSimple i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
|
|
float4 c1 = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv);
|
|
float4 c2 = SAMPLE_TEXTURE2D_X(_CombineTex, sampler_LinearClamp, i.uv);
|
|
return c1 + c2;
|
|
}
|
|
|
|
|
|
float4 FragDebugBloom (VaryingsSimple i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
|
|
return SAMPLE_TEXTURE2D_X(_BloomTex, sampler_LinearClamp, i.uv) * _Bloom.xxxx;
|
|
}
|
|
|
|
|
|
float4 FragDebugBloomExclusionLayer (VaryingsSimple i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
|
|
float depth = BEAUTIFY_GET_CUSTOM_DEPTH_01(_BloomSourceDepth, i.uv);
|
|
return float4(depth.xxx, 1.0);
|
|
}
|
|
|
|
float4 FragDebugAnamorphicFlaresExclusionLayer (VaryingsSimple i) : SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
|
|
float depth = BEAUTIFY_GET_CUSTOM_DEPTH_01(_AFSourceDepth, i.uv);
|
|
return float4(depth.xxx, 1.0);
|
|
}
|
|
|
|
float4 FragResampleFastAF(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, i.uv);
|
|
c.rgb = lerp(c.rgb, Brightness(c.rgb) * _AFTint.rgb, _AFTint.a);
|
|
c.rgb *= _AFData.xxx;
|
|
return c;
|
|
}
|
|
|
|
VaryingsCross VertBlur(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_GAUSSIAN_UV(o)
|
|
|
|
return o;
|
|
}
|
|
|
|
float4 FragBlur (VaryingsCross i): SV_Target {
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
i.uv = UnityStereoTransformScreenSpaceTex(i.uv);
|
|
BEAUTIFY_FRAG_SETUP_GAUSSIAN_UV(i)
|
|
|
|
float4 pixel = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv) * 0.2270270270
|
|
+ (SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv1) + SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv2)) * 0.3162162162
|
|
+ (SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv3) + SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, uv4)) * 0.0702702703;
|
|
return pixel;
|
|
}
|
|
|
|
#endif |