ToriaAssets/Sources/Shaders/BeautifyBasic.cginc
2026-05-19 15:33:18 +02:00

119 lines
3.9 KiB
HLSL

// Copyright 2016-2019 Kronnect - All Rights Reserved.
#include "UnityCG.cginc"
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CompareTex);
uniform float4 _MainTex_TexelSize;
uniform float4 _MainTex_ST;
uniform fixed4 _ColorBoost; // x = Brightness, y = Contrast, z = Saturate, w = Daltonize;
uniform fixed4 _Sharpen;
uniform float4 _CompareParams;
struct appdata {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv: TEXCOORD0;
float2 uvN: TEXCOORD1;
float2 uvS: TEXCOORD2;
float2 uvW: TEXCOORD3;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
struct v2fCompare {
float4 pos : SV_POSITION;
float2 uv: TEXCOORD0;
float2 uvNonStereo: TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2fCompare vertCompare(appdata v) {
v2fCompare o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
o.uvNonStereo = v.texcoord;
return o;
}
v2f vert(appdata v) {
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
float3 uvInc = float3(_MainTex_TexelSize.x, _MainTex_TexelSize.y, 0);
o.uvN = o.uv + uvInc.zy;
o.uvS = o.uv - uvInc.zy;
o.uvW = o.uv - uvInc.xz;
return o;
}
inline fixed getLuma(fixed3 rgb) {
const fixed3 lum = fixed3(0.299, 0.587, 0.114);
return dot(rgb, lum);
}
void beautifyPassFast(v2f i, inout fixed3 rgbM) {
fixed3 rgbN = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uvN).rgb;
fixed3 rgbS = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uvS).rgb;
fixed3 rgbW = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uvW).rgb;
fixed lumaM = getLuma(rgbM);
fixed lumaN = getLuma(rgbN);
fixed lumaW = getLuma(rgbW);
fixed lumaS = getLuma(rgbS);
fixed maxLuma = max(lumaN,lumaS);
maxLuma = max(maxLuma, lumaW);
fixed minLuma = min(lumaN,lumaS);
minLuma = min(minLuma, lumaW) - 0.000001;
fixed lumaPower = 2 * lumaM - minLuma - maxLuma;
fixed lumaAtten = saturate(_Sharpen.w / (maxLuma - minLuma));
rgbM *= 1.0 + clamp(lumaPower * lumaAtten * _Sharpen.x, -_Sharpen.z, _Sharpen.z);
fixed3 maxComponent = max(rgbM.r, max(rgbM.g, rgbM.b));
fixed3 minComponent = min(rgbM.r, min(rgbM.g, rgbM.b));
fixed sat = saturate(maxComponent - minComponent);
rgbM *= 1.0 + _ColorBoost.z * (1.0 - sat) * (rgbM - getLuma(rgbM));
rgbM = (rgbM - 0.5.xxx) * _ColorBoost.y + 0.5.xxx;
rgbM *= _ColorBoost.x;
}
fixed4 fragBeautifyFast (v2f i) : SV_Target {
UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
fixed4 pixel = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
beautifyPassFast(i, pixel.rgb);
return pixel;
}
fixed4 fragCompareFast (v2fCompare i) : SV_Target {
UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
// separator line + antialias
float2 dd = i.uvNonStereo - 0.5.xx;
float co = dot(_CompareParams.xy, dd);
float dist = distance( _CompareParams.xy * co, dd );
float4 aa = saturate( (_CompareParams.w - dist) / abs(_MainTex_TexelSize.y) );
fixed4 pixel = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
fixed4 pixelNice = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CompareTex, i.uv);
// are we on the beautified side?
fixed t = dot(dd, _CompareParams.yz) > 0;
pixel = lerp(pixel, pixelNice, t);
return pixel + aa;
}