FiE-Game/Assets/AmplifyBloom/Resources/BloomLib.cginc
2023-07-19 18:11:02 +01:00

557 lines
18 KiB
HLSL

// Amplify Bloom - Advanced Bloom Post-Effect for Unity
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
#ifndef AMPLIFY_BLOOMLIB_INCLUDED
#define AMPLIFY_BLOOMLIB_INCLUDED
#include "UnityCG.cginc"
uniform half4 _AnamorphicGlareWeights0;
uniform half4 _AnamorphicGlareWeights1;
uniform half4 _AnamorphicGlareWeights2;
uniform half4 _AnamorphicGlareWeights3;
uniform half4 _AnamorphicGlareWeights4;
uniform half4 _AnamorphicGlareWeights5;
uniform half4 _AnamorphicGlareWeights6;
uniform half4 _AnamorphicGlareWeights7;
uniform half4x4 _AnamorphicGlareOffsetsMat0;
uniform half4x4 _AnamorphicGlareOffsetsMat1;
uniform half4x4 _AnamorphicGlareOffsetsMat2;
uniform half4x4 _AnamorphicGlareOffsetsMat3;
uniform half4x4 _AnamorphicGlareWeightsMat0;
uniform half4x4 _AnamorphicGlareWeightsMat1;
uniform half4x4 _AnamorphicGlareWeightsMat2;
uniform half4x4 _AnamorphicGlareWeightsMat3;
uniform sampler2D _AnamorphicRTS0;
uniform sampler2D _AnamorphicRTS1;
uniform sampler2D _AnamorphicRTS2;
uniform sampler2D _AnamorphicRTS3;
uniform sampler2D _AnamorphicRTS4;
uniform sampler2D _AnamorphicRTS5;
uniform sampler2D _AnamorphicRTS6;
uniform sampler2D _AnamorphicRTS7;
uniform float4 _LensFlareGhostsParams;
uniform float4 _LensFlareHaloParams;
uniform float _LensFlareGhostChrDistortion;
uniform float _LensFlareHaloChrDistortion;
uniform sampler2D _LensFlareLUT;
half4 _MainTex_ST;
// Enabling Stereo adjustment in versions prior to 4.5
#ifndef UnityStereoScreenSpaceUVAdjust
#ifdef UNITY_SINGLE_PASS_STEREO
inline float2 UnityStereoScreenSpaceUVAdjustInternal ( float2 uv, float4 scaleAndOffset )
{
return saturate ( uv.xy ) * scaleAndOffset.xy + scaleAndOffset.zw;
}
inline float4 UnityStereoScreenSpaceUVAdjustInternal ( float4 uv, float4 scaleAndOffset )
{
return float4( UnityStereoScreenSpaceUVAdjustInternal ( uv.xy, scaleAndOffset ), UnityStereoScreenSpaceUVAdjustInternal ( uv.zw, scaleAndOffset ) );
}
#define UnityStereoScreenSpaceUVAdjust(x, y) UnityStereoScreenSpaceUVAdjustInternal(x, y)
#else
#define UnityStereoScreenSpaceUVAdjust(x, y) x
#endif
#endif
// TONEMAP
inline half rcp ( half x ) { return 1.0 / x; }
inline half3 TonemapForward ( half3 c ) { return c * rcp ( 1.0 + Luminance ( c ) ); }
inline half3 TonemapInverse ( half3 c ) { return c * rcp ( 1.0 - Luminance ( saturate ( c ) ) ); }
// ENCODE / DECODE
uniform half4 _BloomRange; // x - bloom range y - 1 / bloom range
inline half4 EncodeColor ( half3 color )
{
#ifdef AB_HIGH_PRECISION
return half4( color, 0 );
#else
half4 enc = half4( 0, 0, 0, 0 );
color *= _BloomRange.y;
enc.a = saturate ( max ( max ( color.r, color.g ), max ( color.b, 1e-6 ) ) );
enc.a = ceil ( enc.a * 255.0 ) / 255.0;
enc.rgb = color / enc.a;
return enc;
#endif
}
inline half3 DecodeColor ( half4 enc )
{
#ifdef AB_HIGH_PRECISION
return enc.rgb;
#else
return _BloomRange.x * enc.rgb * enc.a;
#endif
}
// THRESHOLD
inline half4 CalcThreshold ( half threshold, float2 uv, sampler2D diffuseMap )
{
half4 color = tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) );
#ifdef AB_HIGH_PRECISION
return max ( color - threshold, 0 );
#else
return EncodeColor ( clamp ( color.rgb - threshold.xxx, ( 0 ).xxx, _BloomRange.xxx ) );
#endif
}
inline half4 CalcThresholdWithMask ( half threshold, float2 uv, sampler2D diffuseMap, sampler2D maskMap )
{
half4 color = tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) )*tex2D ( maskMap, uv );
#ifdef AB_HIGH_PRECISION
return max ( color - threshold, 0 );
#else
return EncodeColor ( clamp ( color.rgb - threshold.xxx, ( 0 ).xxx, _BloomRange.xxx ) );
#endif
}
// BOKEH FILTER
inline half CalculateBokehWeight ( half depth, half aperture, half focalLength, half focalDistance, half FarPlane, half MaxCoCDiameter )
{
half S2 = depth * FarPlane;
half c = aperture *( abs ( S2 - focalDistance ) / S2 )*( focalLength / ( focalDistance - focalLength ) );
half invSensorHeight = 41.667;
half percentOfSensor = c * invSensorHeight;
return clamp ( percentOfSensor, 0.0, MaxCoCDiameter );
}
// CHROMATIC ABERRATION
inline half3 CalcChromaticAberration ( sampler2D texMap, float2 uv, float2 dir, float3 distortion )
{
return half3( DecodeColor ( tex2D ( texMap, UnityStereoScreenSpaceUVAdjust ( uv + dir * distortion.r, _MainTex_ST ) ) ).r,
DecodeColor ( tex2D ( texMap, UnityStereoScreenSpaceUVAdjust ( uv + dir * distortion.g, _MainTex_ST ) ) ).g,
DecodeColor ( tex2D ( texMap, UnityStereoScreenSpaceUVAdjust ( uv + dir * distortion.b, _MainTex_ST ) ) ).b );
}
// PSEUDO - LENS FLARE
// Halo Params - x - strength y - width z - factor w - falloff
// Ghost Params - x - strength y - dispersal z - factor w - falloff
inline half4 CalcLensFlare ( const int ghostsAmount, float2 texelSize, float2 uv, sampler2D thresholdMap )
{
half3 result = half3( 0, 0, 0 );
float2 flippedUV = float2( 1, 1 ) - uv;
//GHOST VECTOR TO IMAGE CENTER
float2 imageCenter = float2( 0.5, 0.5 );
const float imageCenterLength = 0.7071;
const float invImageCenterLength = 1.4142;
float2 ghostVec = ( imageCenter - uv )*_LensFlareGhostsParams.y;
float uvLen = length ( imageCenter - uv ) * invImageCenterLength;
float2 lutUV = float2( frac ( uvLen ), 0 );
half3 lutColor = tex2D ( _LensFlareLUT, lutUV );
float2 chromaticDir = normalize ( ghostVec );
float3 chromaticDistVec = float3( -texelSize.x*_LensFlareGhostChrDistortion, 0.0, texelSize.x*_LensFlareGhostChrDistortion );
// GHOSTS
UNITY_UNROLL
for ( int i = 0; i < ghostsAmount; i++ )
{
float2 ghostUV = frac ( uv + ghostVec*( float ) i );
float weight = length ( imageCenter - ghostUV ) *invImageCenterLength;
weight = pow ( ( 1 - weight )*_LensFlareGhostsParams.z, _LensFlareGhostsParams.w );
weight = weight*weight;
result += CalcChromaticAberration ( thresholdMap, ghostUV, chromaticDir, chromaticDistVec ).rgb*weight*lutColor*_LensFlareGhostsParams.x;
}
chromaticDistVec = float3( -texelSize.x*_LensFlareHaloChrDistortion, 0.0, texelSize.x*_LensFlareHaloChrDistortion );
// HALO
float2 haloVec = chromaticDir * _LensFlareHaloParams.y;
float haloWeight = length ( imageCenter - frac ( uv + haloVec ) )*invImageCenterLength;
haloWeight = pow ( ( 1 - haloWeight )*_LensFlareHaloParams.z, _LensFlareHaloParams.w );
result += CalcChromaticAberration ( thresholdMap, frac ( uv + haloVec ), chromaticDir, chromaticDistVec ).rgb*haloWeight*_LensFlareHaloParams.x*lutColor;
return EncodeColor ( result );
}
// ANAMORPHIC GLARE
//inline half4 AnamorphicGlareMat ( float2 uv, sampler2D diffuseMap )
//{
// half3 finalColor = half3( 0, 0, 0 );
// UNITY_UNROLL
// for ( uint matIdx = 0; matIdx < 4; matIdx++ )
// {
// UNITY_UNROLL
// for ( int vecIdx = 0; vecIdx < 4; vecIdx++ )
// {
// float2 uvOffset = uv + _AnamorphicGlareOffsetsMat[ matIdx ][ vecIdx ].xy;
// half3 mainColor = DecodeColor ( tex2D ( diffuseMap, uvOffset ) );
// finalColor.rgb += _AnamorphicGlareWeightsMat[ matIdx ][ vecIdx ].rgb*mainColor.rgb;
// }
// }
// return EncodeColor ( finalColor );
//}
inline half4 AnamorphicGlareMat ( float2 uv, sampler2D diffuseMap )
{
half3 finalColor = half3( 0, 0, 0 );
float2 uvOffset = float2( 0, 0 );
half3 mainColor = half3( 0, 0, 0 );
//MatIdx 0
{
//vecIdx 0
uvOffset = uv + _AnamorphicGlareOffsetsMat0[ 0 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat0[ 0 ].rgb*mainColor.rgb;
//vecIdx 1
uvOffset = uv + _AnamorphicGlareOffsetsMat0[ 1 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat0[ 1 ].rgb*mainColor.rgb;
//vecIdx 2
uvOffset = uv + _AnamorphicGlareOffsetsMat0[ 2 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat0[ 2 ].rgb*mainColor.rgb;
//vecIdx 3
uvOffset = uv + _AnamorphicGlareOffsetsMat0[ 3 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat0[ 3 ].rgb*mainColor.rgb;
}
//MatIdx 1
{
//vecIdx 0
uvOffset = uv + _AnamorphicGlareOffsetsMat1[ 0 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat1[ 0 ].rgb*mainColor.rgb;
//vecIdx 1
uvOffset = uv + _AnamorphicGlareOffsetsMat1[ 1 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat1[ 1 ].rgb*mainColor.rgb;
//vecIdx 2
uvOffset = uv + _AnamorphicGlareOffsetsMat1[ 2 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat1[ 2 ].rgb*mainColor.rgb;
//vecIdx 3
uvOffset = uv + _AnamorphicGlareOffsetsMat1[ 3 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat1[ 3 ].rgb*mainColor.rgb;
}
//MatIdx 2
{
//vecIdx 0
uvOffset = uv + _AnamorphicGlareOffsetsMat2[ 0 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat2[ 0 ].rgb*mainColor.rgb;
//vecIdx 1
uvOffset = uv + _AnamorphicGlareOffsetsMat2[ 1 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat2[ 1 ].rgb*mainColor.rgb;
//vecIdx 2
uvOffset = uv + _AnamorphicGlareOffsetsMat2[ 2 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat2[ 2 ].rgb*mainColor.rgb;
//vecIdx 3
uvOffset = uv + _AnamorphicGlareOffsetsMat2[ 3 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat2[ 3 ].rgb*mainColor.rgb;
}
//MatIdx 3
{
//vecIdx 0
uvOffset = uv + _AnamorphicGlareOffsetsMat3[ 0 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat3[ 0 ].rgb*mainColor.rgb;
//vecIdx 1
uvOffset = uv + _AnamorphicGlareOffsetsMat3[ 1 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat3[ 1 ].rgb*mainColor.rgb;
//vecIdx 2
uvOffset = uv + _AnamorphicGlareOffsetsMat3[ 2 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat3[ 2 ].rgb*mainColor.rgb;
//vecIdx 3
uvOffset = uv + _AnamorphicGlareOffsetsMat3[ 3 ].xy;
mainColor = DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uvOffset, _MainTex_ST ) ) );
finalColor.rgb += _AnamorphicGlareWeightsMat3[ 3 ].rgb*mainColor.rgb;
}
return EncodeColor ( finalColor );
}
// GAUSSIAN FUNCTION
inline half4 NineTapGaussian ( float2 uv, sampler2D diffuseMap, float2 stride )
{
half4 color = half4( 0, 0, 0, 0 );
color.rgb += DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) ) ) * 0.227027027;
float2 d1 = stride * 1.3846153846;
color.rgb += DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv + d1, _MainTex_ST ) ) ) * 0.3162162162;
color.rgb += DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv - d1, _MainTex_ST ) ) ) * 0.3162162162;
float2 d2 = stride * 3.2307692308;
color.rgb += DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv + d2, _MainTex_ST ) ) ) * 0.0702702703;
color.rgb += DecodeColor ( tex2D ( diffuseMap, UnityStereoScreenSpaceUVAdjust ( uv - d2, _MainTex_ST ) ) ) * 0.0702702703;
return EncodeColor ( color );
}
// UPSCALE FUNCTIONS
inline half4 FirstPassUpscaleBlurTent ( sampler2D currentMipRT, float2 uvCoords, float2 oneOverTexSize, float BlurRadius )
{
float2 TexelOffsets[ 9 ] =
{
float2( -1, -1 ),
float2( 0, -1 ),
float2( 1, -1 ),
float2( -1, 0 ),
float2( 0, 0 ),
float2( 1, 0 ),
float2( -1, 1 ),
float2( 0, 1 ),
float2( 1, 1 )
};
half Weights[ 9 ] =
{
0.0625,
0.125,
0.0625,
0.125,
0.25,
0.125,
0.0625,
0.125,
0.0625
};
half4 color = half4( 0.0, 0.0, 0.0, 0.0 );
UNITY_UNROLL
for ( int i = 0; i < 9; i++ )
{
float2 uv = uvCoords + TexelOffsets[ i ] * oneOverTexSize * BlurRadius;
color.rgb += DecodeColor ( tex2D ( currentMipRT, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) ) ) * Weights[ i ];
}
return EncodeColor ( color );
}
inline half4 UpscaleBlurTent ( sampler2D currentMipRT, sampler2D previousUpscale, float2 uvCoords, float2 oneOverTexSize, float BlurRadius )
{
float2 TexelOffsets[ 9 ] =
{
float2( -1, -1 ),
float2( 0, -1 ),
float2( 1, -1 ),
float2( -1, 0 ),
float2( 0, 0 ),
float2( 1, 0 ),
float2( -1, 1 ),
float2( 0, 1 ),
float2( 1, 1 )
};
half Weights[ 9 ] =
{
0.0625,
0.125,
0.0625,
0.125,
0.25,
0.125,
0.0625,
0.125,
0.0625
};
half4 color = half4( 0.0, 0.0, 0.0, 0.0 );
UNITY_UNROLL
for ( int i = 0; i < 9; i++ )
{
float2 uv = uvCoords + TexelOffsets[ i ] * oneOverTexSize * BlurRadius;
color.rgb += DecodeColor ( tex2D ( currentMipRT, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) ) ) * Weights[ i ];
}
color.rgb += DecodeColor ( tex2D ( previousUpscale, UnityStereoScreenSpaceUVAdjust ( uvCoords, _MainTex_ST ) ) );
return EncodeColor ( color );
}
// DOWNSAMPLING FUNCTIONS
inline half4 DownsampleWithKaris ( float2 texcoord, float2 oneOverTextureSize, sampler2D DiffuseMap )
{
const int NUM_SAMPLES = 13;
float2 TexelOffsets[ NUM_SAMPLES ] =
{
float2( -1.0,-1.0 ),
float2( 1.0,-1.0 ),
float2( 1.0,1.0 ),
float2( -1.0,1.0 ),
float2( -2.0,-2.0 ),
float2( 0.0,-2.0 ),
float2( 2.0,-2.0 ),
float2( -2.0,0.0 ),
float2( 0.0,0.0 ),
float2( 2.0,0.0 ),
float2( -2.0,2.0 ),
float2( 0.0,2.0 ),
float2( 2.0,2.0 )
};
half4 redSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 yellowSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 greenSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 blueSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 purpleSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 texels[ NUM_SAMPLES ];
half4 sum = half4( 1.0, 1.0, 1.0, 1.0 );
UNITY_UNROLL
for ( int i = 0; i < NUM_SAMPLES; ++i )
{
float2 uv = texcoord + ( TexelOffsets[ i ] * oneOverTextureSize );
texels[ i ].rgb = DecodeColor ( tex2D ( DiffuseMap, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) ) );
}
redSum = ( texels[ 0 ] + texels[ 1 ] + texels[ 2 ] + texels[ 3 ] ) * 0.25;
yellowSum = ( texels[ 7 ] + texels[ 8 ] + texels[ 10 ] + texels[ 11 ] ) * 0.25;
greenSum = ( texels[ 8 ] + texels[ 9 ] + texels[ 11 ] + texels[ 12 ] ) * 0.25;
blueSum = ( texels[ 5 ] + texels[ 6 ] + texels[ 8 ] + texels[ 9 ] ) * 0.25;
purpleSum = ( texels[ 4 ] + texels[ 5 ] + texels[ 7 ] + texels[ 8 ] ) * 0.25;
redSum.rgb = TonemapForward ( redSum.rgb );
yellowSum.rgb = TonemapForward ( yellowSum.rgb );
greenSum.rgb = TonemapForward ( greenSum.rgb );
blueSum.rgb = TonemapForward ( blueSum.rgb );
purpleSum.rgb = TonemapForward ( purpleSum.rgb );
sum = ( redSum * 0.5 ) + ( ( yellowSum + greenSum + blueSum + purpleSum ) * 0.125 );
return EncodeColor ( sum.rgb );
}
inline half4 DownsampleWithoutKaris ( float2 texcoord, float2 oneOverTextureSize, sampler2D DiffuseMap )
{
const int NUM_SAMPLES = 13;
float2 TexelOffsets[ NUM_SAMPLES ] =
{
float2( -1.0,-1.0 ),
float2( 1.0,-1.0 ),
float2( 1.0,1.0 ),
float2( -1.0,1.0 ),
float2( -2.0,-2.0 ),
float2( 0.0,-2.0 ),
float2( 2.0,-2.0 ),
float2( -2.0,0.0 ),
float2( 0.0,0.0 ),
float2( 2.0,0.0 ),
float2( -2.0,2.0 ),
float2( 0.0,2.0 ),
float2( 2.0,2.0 )
};
half4 redSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 yellowSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 greenSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 blueSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 purpleSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 texels[ NUM_SAMPLES ];
half4 sum = half4( 1.0, 1.0, 1.0, 1.0 );
UNITY_UNROLL
for ( int i = 0; i < NUM_SAMPLES; ++i )
{
float2 uv = texcoord + ( TexelOffsets[ i ] * oneOverTextureSize );
texels[ i ].rgb = DecodeColor ( tex2D ( DiffuseMap, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) ) );
}
redSum = ( texels[ 0 ] + texels[ 1 ] + texels[ 2 ] + texels[ 3 ] ) * 0.25;
yellowSum = ( texels[ 7 ] + texels[ 8 ] + texels[ 10 ] + texels[ 11 ] ) * 0.25;
greenSum = ( texels[ 8 ] + texels[ 9 ] + texels[ 11 ] + texels[ 12 ] ) * 0.25;
blueSum = ( texels[ 5 ] + texels[ 6 ] + texels[ 8 ] + texels[ 9 ] ) * 0.25;
purpleSum = ( texels[ 4 ] + texels[ 5 ] + texels[ 7 ] + texels[ 8 ] ) * 0.25;
sum = ( redSum * 0.5 ) + ( ( yellowSum + greenSum + blueSum + purpleSum ) * 0.125 );
return EncodeColor ( sum.rgb );
}
inline half4 DownsampleNoWeightedAvg ( float2 texcoord, float2 oneOverTextureSize, sampler2D DiffuseMap )
{
const int NUM_SAMPLES = 13;
float2 TexelOffsets[ NUM_SAMPLES ] =
{
float2( -1.0, -1.0 ),
float2( 1.0, -1.0 ),
float2( 1.0, 1.0 ),
float2( -1.0, 1.0 ),
float2( -2.0, -2.0 ),
float2( 0.0, -2.0 ),
float2( 2.0, -2.0 ),
float2( -2.0, 0.0 ),
float2( 0.0, 0.0 ),
float2( 2.0, 0.0 ),
float2( -2.0, 2.0 ),
float2( 0.0, 2.0 ),
float2( 2.0, 2.0 )
};
half4 redSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 yellowSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 greenSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 blueSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 purpleSum = half4( 1.0, 1.0, 1.0, 1.0 );
half4 texels[ NUM_SAMPLES ];
half4 sum = half4( 1.0, 1.0, 1.0, 1.0 );
UNITY_UNROLL
for ( int i = 0; i < NUM_SAMPLES; ++i )
{
float2 uv = texcoord + ( TexelOffsets[ i ] * oneOverTextureSize );
texels[ i ].rgb = DecodeColor ( tex2D ( DiffuseMap, UnityStereoScreenSpaceUVAdjust ( uv, _MainTex_ST ) ) );
}
redSum = ( texels[ 0 ] + texels[ 1 ] + texels[ 2 ] + texels[ 3 ] ) * 0.25;
yellowSum = ( texels[ 7 ] + texels[ 8 ] + texels[ 10 ] + texels[ 11 ] ) * 0.25;
greenSum = ( texels[ 8 ] + texels[ 9 ] + texels[ 11 ] + texels[ 12 ] ) * 0.25;
blueSum = ( texels[ 5 ] + texels[ 6 ] + texels[ 8 ] + texels[ 9 ] ) * 0.25;
purpleSum = ( texels[ 4 ] + texels[ 5 ] + texels[ 7 ] + texels[ 8 ] ) * 0.25;
sum = ( redSum * 0.5 ) + ( ( yellowSum + greenSum + blueSum + purpleSum ) * 0.125 );
return EncodeColor ( sum.rgb );
}
#endif