463 lines
16 KiB
HLSL
463 lines
16 KiB
HLSL
// Copyright 2016-2019 Kronnect - All Rights Reserved.
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "BeautifyAdvancedParams.cginc"
|
|
#include "BeautifyOrtho.cginc"
|
|
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_BloomTex);
|
|
half4 _BloomTex_TexelSize;
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_BloomTex1);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_BloomTex2);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_BloomTex3);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_BloomTex4);
|
|
half4 _MainTex_TexelSize;
|
|
half4 _MainTex_ST;
|
|
half4 _Bloom;
|
|
half4 _BloomWeights;
|
|
half4 _BloomWeights2;
|
|
half4 _AFTint;
|
|
half _BlurScale;
|
|
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
|
|
uniform half _BloomDepthTreshold;
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_LAYER
|
|
uniform sampler2D _BloomSourceTex;
|
|
uniform sampler2D_float _BloomSourceDepth;
|
|
uniform sampler2D _BloomSourceTexRightEye;
|
|
uniform sampler2D_float _BloomSourceDepthRightEye;
|
|
uniform half _BloomLayerZBias;
|
|
#endif
|
|
|
|
|
|
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 uv: TEXCOORD0;
|
|
half2 uv1: TEXCOORD1;
|
|
half2 uv2: TEXCOORD2;
|
|
half2 uv3: TEXCOORD3;
|
|
half2 uv4: TEXCOORD4;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
struct v2fLum {
|
|
float4 pos : SV_POSITION;
|
|
half2 uv: TEXCOORD0;
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
half2 depthUV: TEXCOORD1;
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_LAYER && UNITY_SINGLE_PASS_STEREO
|
|
half2 depthUVNonStereo: TEXCOORD2;
|
|
#endif
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
struct v2fCrossLum {
|
|
float4 pos : SV_POSITION;
|
|
half2 uv: TEXCOORD0;
|
|
half2 uv1: TEXCOORD1;
|
|
half2 uv2: TEXCOORD2;
|
|
half2 uv3: TEXCOORD3;
|
|
half2 uv4: TEXCOORD4;
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
half2 depthUV: TEXCOORD5;
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_LAYER && UNITY_SINGLE_PASS_STEREO
|
|
half2 depthUVNonStereo: TEXCOORD6;
|
|
#endif
|
|
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);
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Depth texture is inverted WRT the main texture
|
|
o.uv.y = 1.0 - o.uv.y;
|
|
}
|
|
#endif
|
|
return o;
|
|
}
|
|
|
|
v2fLum vertLum(appdata v) {
|
|
v2fLum o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|
|
|
#if BEAUTIFY_BLOOM_USE_LAYER && UNITY_SINGLE_PASS_STEREO
|
|
o.uv = v.texcoord;
|
|
o.depthUVNonStereo = v.texcoord;
|
|
o.depthUV = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
#else
|
|
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
o.depthUV = o.uv;
|
|
#endif
|
|
#endif
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Depth texture is inverted WRT the main texture
|
|
o.uv.y = 1.0 - o.uv.y;
|
|
}
|
|
#endif
|
|
return o;
|
|
}
|
|
|
|
inline half Brightness(half3 c) {
|
|
return max(c.r, max(c.g, c.b));
|
|
}
|
|
|
|
half4 fragLum (v2fLum i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
#if BEAUTIFY_BLOOM_USE_LAYER
|
|
half4 c;
|
|
if (unity_StereoEyeIndex == 0) {
|
|
c = tex2D(_BloomSourceTex, i.uv);
|
|
} else {
|
|
c = tex2D(_BloomSourceTexRightEye, i.uv);
|
|
}
|
|
#else
|
|
half4 c = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
|
|
#endif
|
|
c = clamp(c, 0.0.xxxx, _BloomWeights2.zzzz);
|
|
#if UNITY_COLORSPACE_GAMMA
|
|
c.rgb = GammaToLinearSpace(c.rgb);
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
//half depth01 = BEAUTIFY_GET_DEPTH_01(UNITY_SAMPLE_DEPTH(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthTexture, i.depthUV)));
|
|
half depth01 = Linear01Depth(BEAUTIFY_DEPTH(_CameraDepthTexture, i.depthUV));
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH
|
|
c.rgb *= (1.0 - depth01 * _BloomDepthTreshold);
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_LAYER
|
|
half depth02;
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|
if (unity_StereoEyeIndex == 0) {
|
|
depth02 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepth, i.depthUVNonStereo)));
|
|
} else {
|
|
depth02 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepthRightEye, i.depthUVNonStereo)));
|
|
}
|
|
#else
|
|
if (unity_StereoEyeIndex == 0) {
|
|
depth02 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepth, i.depthUV)));
|
|
} else {
|
|
depth02 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepthRightEye, i.depthUV)));
|
|
}
|
|
#endif
|
|
half isTransparent = (depth02 >= 1) && any(c.rgb>0);
|
|
half nonEclipsed = isTransparent || (depth01 > depth02 - _BloomLayerZBias);
|
|
c.rgb *= nonEclipsed;
|
|
#endif
|
|
c.a = Brightness(c.rgb);
|
|
c.rgb = max(c.rgb - _Bloom.www, 0);
|
|
return c;
|
|
}
|
|
|
|
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);
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Texture is inverted WRT the main texture
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
|
}
|
|
#endif
|
|
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
half3 offsets = _MainTex_TexelSize.xyx * half3(1,1,-1);
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|
offsets.xz *= 2.0;
|
|
#endif
|
|
o.uv1 = UnityStereoScreenSpaceUVAdjust(v.texcoord - offsets.xy, _MainTex_ST);
|
|
o.uv2 = UnityStereoScreenSpaceUVAdjust(v.texcoord - offsets.zy, _MainTex_ST);
|
|
o.uv3 = UnityStereoScreenSpaceUVAdjust(v.texcoord + offsets.zy, _MainTex_ST);
|
|
o.uv4 = UnityStereoScreenSpaceUVAdjust(v.texcoord + offsets.xy, _MainTex_ST);
|
|
return o;
|
|
}
|
|
|
|
v2fCrossLum vertCrossLum(appdata v) {
|
|
v2fCrossLum o;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|
#if BEAUTIFY_BLOOM_USE_LAYER && UNITY_SINGLE_PASS_STEREO
|
|
o.depthUVNonStereo = v.texcoord;
|
|
o.depthUV = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Texture is inverted WRT the main texture
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
|
}
|
|
#endif
|
|
o.uv = v.texcoord;
|
|
half3 offsets = _MainTex_TexelSize.xyx * half3(1, 1, -1);
|
|
o.uv1 = v.texcoord - offsets.xy;
|
|
o.uv2 = v.texcoord - offsets.zy;
|
|
o.uv3 = v.texcoord + offsets.zy;
|
|
o.uv4 = v.texcoord + offsets.xy;
|
|
#else
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
o.depthUV = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
#endif
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Texture is inverted WRT the main texture
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
|
}
|
|
#endif
|
|
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
half3 offsets = _MainTex_TexelSize.xyx * half3(1, 1, -1);
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|
offsets.xz *= 2.0;
|
|
#endif
|
|
o.uv1 = UnityStereoScreenSpaceUVAdjust(v.texcoord - offsets.xy, _MainTex_ST);
|
|
o.uv2 = UnityStereoScreenSpaceUVAdjust(v.texcoord - offsets.zy, _MainTex_ST);
|
|
o.uv3 = UnityStereoScreenSpaceUVAdjust(v.texcoord + offsets.zy, _MainTex_ST);
|
|
o.uv4 = UnityStereoScreenSpaceUVAdjust(v.texcoord + offsets.xy, _MainTex_ST);
|
|
#endif
|
|
return o;
|
|
|
|
}
|
|
|
|
half4 fragLumAntiflicker(v2fCrossLum i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
#if BEAUTIFY_BLOOM_USE_LAYER
|
|
half4 c1, c2, c3, c4;
|
|
if (unity_StereoEyeIndex == 0) {
|
|
c1 = tex2D(_BloomSourceTex, i.uv1);
|
|
c2 = tex2D(_BloomSourceTex, i.uv2);
|
|
c3 = tex2D(_BloomSourceTex, i.uv3);
|
|
c4 = tex2D(_BloomSourceTex, i.uv4);
|
|
} else {
|
|
c1 = tex2D(_BloomSourceTexRightEye, i.uv1);
|
|
c2 = tex2D(_BloomSourceTexRightEye, i.uv2);
|
|
c3 = tex2D(_BloomSourceTexRightEye, i.uv3);
|
|
c4 = tex2D(_BloomSourceTexRightEye, i.uv4);
|
|
}
|
|
#else
|
|
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);
|
|
#endif
|
|
|
|
c1 = clamp(c1, 0.0.xxxx, _BloomWeights2.zzzz);
|
|
c2 = clamp(c2, 0.0.xxxx, _BloomWeights2.zzzz);
|
|
c3 = clamp(c3, 0.0.xxxx, _BloomWeights2.zzzz);
|
|
c4 = clamp(c4, 0.0.xxxx, _BloomWeights2.zzzz);
|
|
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH || BEAUTIFY_BLOOM_USE_LAYER
|
|
//half depth01 = BEAUTIFY_GET_DEPTH_01(UNITY_SAMPLE_DEPTH(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthTexture, i.depthUV)));
|
|
half depth01 = Linear01Depth(BEAUTIFY_DEPTH(_CameraDepthTexture, i.depthUV));
|
|
half depthAtten = 1.0 - depth01 * _BloomDepthTreshold;
|
|
#endif
|
|
#if BEAUTIFY_BLOOM_USE_DEPTH
|
|
c1.rgb *= depthAtten;
|
|
c2.rgb *= depthAtten;
|
|
c3.rgb *= depthAtten;
|
|
c4.rgb *= depthAtten;
|
|
#endif
|
|
|
|
#if BEAUTIFY_BLOOM_USE_LAYER
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|
//half depth02 = BEAUTIFY_GET_DEPTH_01(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepth, i.depthUVNonStereo)));
|
|
half depth02 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepth, i.depthUVNonStereo)));
|
|
#else
|
|
//half depth02 = BEAUTIFY_GET_DEPTH_01(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepth, i.depthUV)));
|
|
half depth02 = Linear01Depth(UNITY_SAMPLE_DEPTH(tex2D(_BloomSourceDepth, i.depthUV)));
|
|
#endif
|
|
half isTransparent = (depth02 >= 1) && any(c1.rgb>0);
|
|
half nonEclipsed = isTransparent || (depth01 > depth02 - _BloomLayerZBias );
|
|
c1.rgb *= nonEclipsed;
|
|
c2.rgb *= nonEclipsed;
|
|
c3.rgb *= nonEclipsed;
|
|
c4.rgb *= nonEclipsed;
|
|
#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 = GammaToLinearSpace(c1.rgb);
|
|
#endif
|
|
|
|
c1.rgb = max(c1.rgb - _Bloom.www, 0);
|
|
return c1;
|
|
}
|
|
|
|
|
|
half4 fragBloomCompose (v2f i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
half4 b0 = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _BloomTex , i.uv );
|
|
half4 b1 = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _BloomTex1 , i.uv );
|
|
half4 b2 = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _BloomTex2 , i.uv );
|
|
half4 b3 = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _BloomTex3 , i.uv );
|
|
half4 b4 = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _BloomTex4 , i.uv );
|
|
half4 b5 = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _MainTex , i.uv );
|
|
half4 pixel = b0 * _BloomWeights.x + b1 * _BloomWeights.y + b2 * _BloomWeights.z + b3 * _BloomWeights.w + b4 * _BloomWeights2.x + b5 * _BloomWeights2.y;
|
|
return pixel;
|
|
}
|
|
|
|
|
|
half4 fragResample(v2fCross i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(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);
|
|
|
|
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);
|
|
return (c1 * w1 + c2 * w2 + c3 * w3 + c4 * w4) * dd;
|
|
}
|
|
|
|
|
|
half4 fragResampleAF(v2fCross i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(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);
|
|
|
|
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;
|
|
c1.rgb = lerp(c1.rgb, Brightness(c1.rgb) * _AFTint.rgb, _AFTint.a);
|
|
c1.rgb *= _Bloom.xxx;
|
|
return c1;
|
|
}
|
|
|
|
half4 fragCopy(v2f i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
|
|
}
|
|
|
|
half4 fragDebugBloom (v2f i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_BloomTex, i.uv) * _Bloom.xxxx;
|
|
}
|
|
|
|
half4 fragResampleFastAF(v2f i) : SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
half4 c = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
|
|
c.rgb = lerp(c.rgb, Brightness(c.rgb) * _AFTint.rgb, _AFTint.a);
|
|
c.rgb *= _Bloom.xxx;
|
|
return c;
|
|
}
|
|
|
|
v2fCross vertBlurH(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);
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Texture is inverted WRT the main texture
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
|
}
|
|
#endif
|
|
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
half2 inc = half2(_MainTex_TexelSize.x * 1.3846153846 * _BlurScale, 0);
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|
inc.x *= 2.0;
|
|
#endif
|
|
o.uv1 = UnityStereoScreenSpaceUVAdjust(v.texcoord - inc, _MainTex_ST);
|
|
o.uv2 = UnityStereoScreenSpaceUVAdjust(v.texcoord + inc, _MainTex_ST);
|
|
half2 inc2 = half2(_MainTex_TexelSize.x * 3.2307692308 * _BlurScale, 0);
|
|
#if UNITY_SINGLE_PASS_STEREO
|
|
inc2.x *= 2.0;
|
|
#endif
|
|
o.uv3 = UnityStereoScreenSpaceUVAdjust(v.texcoord - inc2, _MainTex_ST);
|
|
o.uv4 = UnityStereoScreenSpaceUVAdjust(v.texcoord + inc2, _MainTex_ST);
|
|
return o;
|
|
}
|
|
|
|
v2fCross vertBlurV(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);
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
if (_MainTex_TexelSize.y < 0) {
|
|
// Texture is inverted WRT the main texture
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
|
}
|
|
#endif
|
|
o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
|
|
half2 inc = half2(0, _MainTex_TexelSize.y * 1.3846153846 * _BlurScale);
|
|
o.uv1 = UnityStereoScreenSpaceUVAdjust(v.texcoord - inc, _MainTex_ST);
|
|
o.uv2 = UnityStereoScreenSpaceUVAdjust(v.texcoord + inc, _MainTex_ST);
|
|
half2 inc2 = half2(0, _MainTex_TexelSize.y * 3.2307692308 * _BlurScale);
|
|
o.uv3 = UnityStereoScreenSpaceUVAdjust(v.texcoord - inc2, _MainTex_ST);
|
|
o.uv4 = UnityStereoScreenSpaceUVAdjust(v.texcoord + inc2, _MainTex_ST);
|
|
return o;
|
|
}
|
|
|
|
half4 fragBlur (v2fCross i): SV_Target {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
half4 pixel = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv) * 0.2270270270
|
|
+ (UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv1) + UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv2)) * 0.3162162162
|
|
+ (UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv3) + UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv4)) * 0.0702702703;
|
|
return pixel;
|
|
}
|