105 lines
3.0 KiB
HLSL
105 lines
3.0 KiB
HLSL
|
|
|
|||
|
|
#include "UnityCG.cginc"
|
|||
|
|
|
|||
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
|||
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_EALumSrc);
|
|||
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_EAHist);
|
|||
|
|
|
|||
|
|
uniform half4 _MainTex_TexelSize;
|
|||
|
|
uniform half4 _MainTex_ST;
|
|||
|
|
uniform half4 _EyeAdaptation;
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct appdata {
|
|||
|
|
float4 vertex : POSITION;
|
|||
|
|
half2 texcoord : TEXCOORD0;
|
|||
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
struct v2f {
|
|||
|
|
float4 pos : SV_POSITION;
|
|||
|
|
half2 uv: TEXCOORD0;
|
|||
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|||
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
struct v2fCross {
|
|||
|
|
float4 pos : SV_POSITION;
|
|||
|
|
half2 uv1: TEXCOORD0;
|
|||
|
|
half2 uv2: TEXCOORD1;
|
|||
|
|
half2 uv3: TEXCOORD2;
|
|||
|
|
half2 uv4: TEXCOORD3;
|
|||
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|||
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
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);
|
|||
|
|
return o;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
v2fCross vertCross(appdata v) {
|
|||
|
|
v2fCross o;
|
|||
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|||
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|||
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|||
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|||
|
|
half3 offsets = _MainTex_TexelSize.xyy * half3(0.5, 0.5, 0);
|
|||
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|||
|
|
offsets.xz *= 2.0;
|
|||
|
|
#endif
|
|||
|
|
o.uv1 = UnityStereoScreenSpaceUVAdjust(v.texcoord - offsets.xz, _MainTex_ST);
|
|||
|
|
o.uv2 = UnityStereoScreenSpaceUVAdjust(v.texcoord - offsets.zy, _MainTex_ST);
|
|||
|
|
o.uv3 = UnityStereoScreenSpaceUVAdjust(v.texcoord + offsets.xz, _MainTex_ST);
|
|||
|
|
o.uv4 = UnityStereoScreenSpaceUVAdjust(v.texcoord + offsets.zy, _MainTex_ST);
|
|||
|
|
return o;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
inline half getLuma(half3 rgb) {
|
|||
|
|
const half3 lum = half3(0.299, 0.587, 0.114);
|
|||
|
|
return dot(rgb, lum);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
half4 fragScreenLum (v2f i) : SV_Target {
|
|||
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|||
|
|
half4 c = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
|
|||
|
|
#if UNITY_COLORSPACE_GAMMA
|
|||
|
|
c.rgb = GammaToLinearSpace(c.rgb);
|
|||
|
|
#endif
|
|||
|
|
c.r = log(1.0 + getLuma(c.rgb));
|
|||
|
|
return c.rrrr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
half4 fragReduceScreenLum (v2fCross i) : SV_Target {
|
|||
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|||
|
|
half4 c1 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv1);
|
|||
|
|
half4 c2 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv2);
|
|||
|
|
half4 c3 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv3);
|
|||
|
|
half4 c4 = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv4);
|
|||
|
|
c1.g = max( c1.g, max( c2.g, max( c3.g, c4.g )));
|
|||
|
|
c1.r = (c1.r + c2.r + c3.r + c4.r) * 0.25;
|
|||
|
|
return c1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
half4 fragBlendScreenLum (v2f i) : SV_Target {
|
|||
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|||
|
|
half4 c = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, 0.5.xx);
|
|||
|
|
half4 p = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_EAHist , 0.5.xx);
|
|||
|
|
float speed = c.r < p.r ? _EyeAdaptation.z: _EyeAdaptation.w;
|
|||
|
|
c.a = speed * unity_DeltaTime.x;
|
|||
|
|
return c;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
half4 fragBlend (v2f i) : SV_Target {
|
|||
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|||
|
|
half4 c = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, 0.5.xx);
|
|||
|
|
c.a = 1.0;
|
|||
|
|
return c;
|
|||
|
|
}
|
|||
|
|
|