﻿	
	#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
		half luma = getLuma(c.rgb);
		luma = clamp(luma, 0, 8.0);
		c.r = log(1.0 + luma);
   		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;
   	}  

