#include "blur.glsllib" varying float range; // Range of possible values that we care about. void vert () { } void frag() // Luminosity pass with exponential color channel decay based on the threshold above. { gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); } // Range of possible values that we care about. void vert () { } void frag() // Luminosity pass with exponential color channel decay based on the threshold above. { gl_FragColor = texture2D_0(TexCoord); } // No op void vert () { } void frag() // Luminosity pass with exponential color channel decay based on the threshold above. { vec4 color = texture2D_0(TexCoord); float luminosity = dot(color.rgb, vec3(0.299, 0.587, 0.114)); float decay = min( 1.0, max( 0.0, (luminosity - Threshold) / range ) ); decay = decay * decay; gl_FragColor = vec4( color.rgb * decay, color.a ); } vec2 ToRotatedPoissonTexCoord( vec3 poisson, vec2 inputTex, vec2 inc, mat2 rotation ) { vec2 rotatedPoisson = rotation * vec2( poisson.xy ); return vec2( inputTex.x + rotatedPoisson.x * inc.x, inputTex.y + rotatedPoisson.y * inc.y ); } void SetupPoissonBlurCoordsRotation(float inBlurAmount, vec2 inTexInfo, float inRotationRadians ) { float incX = inBlurAmount / inTexInfo.x; float incY = inBlurAmount / inTexInfo.y; float rotCos = cos( inRotationRadians ); float rotSin = sin( inRotationRadians ); mat2 rotMatrix = mat2( rotCos, rotSin, -rotSin, rotCos ); vec2 incVec = vec2( incX, incY ); TexCoord0 = ToRotatedPoissonTexCoord( poisson0, TexCoord, incVec, rotMatrix ); TexCoord1 = ToRotatedPoissonTexCoord( poisson1, TexCoord, incVec, rotMatrix ); TexCoord2 = ToRotatedPoissonTexCoord( poisson2, TexCoord, incVec, rotMatrix ); TexCoord3 = ToRotatedPoissonTexCoord( poisson3, TexCoord, incVec, rotMatrix ); TexCoord4 = ToRotatedPoissonTexCoord( poisson4, TexCoord, incVec, rotMatrix ); TexCoord5 = ToRotatedPoissonTexCoord( poisson5, TexCoord, incVec, rotMatrix ); TexCoord6 = ToRotatedPoissonTexCoord( poisson6, TexCoord, incVec, rotMatrix ); TexCoord7 = ToRotatedPoissonTexCoord( poisson7, TexCoord, incVec, rotMatrix ); } void vert () { SetupPoissonBlurCoordsRotation( PoissonDistance, Texture0Info.xy, PoissonRotation); } vec4 PoissonBlur(sampler2D inSampler ) { float mult0 = (1.0 - poisson0.z); float mult1 = (1.0 - poisson1.z); float mult2 = (1.0 - poisson2.z); float mult3 = (1.0 - poisson3.z); float mult4 = (1.0 - poisson4.z); float mult5 = (1.0 - poisson5.z); float mult6 = (1.0 - poisson6.z); float mult7 = (1.0 - poisson7.z); float multTotal = mult0 + mult1 + mult2 + mult3 + mult4 + mult5 + mult6 + mult7; float multMultiplier = ( multTotal > 0.0 ? 1.0 / multTotal : 0.0 ); vec4 outColor = GetTextureValue( inSampler, TexCoord0, 1.0 ) * (mult0 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord1, 1.0 ) * (mult1 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord2, 1.0 ) * (mult2 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord3, 1.0 ) * (mult3 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord4, 1.0 ) * (mult4 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord5, 1.0 ) * (mult5 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord6, 1.0 ) * (mult6 * multMultiplier); outColor += GetTextureValue( inSampler, TexCoord7, 1.0 ) * (mult7 * multMultiplier); return outColor; } void frag() { //Passing in 1.0 means the value will not get alpha-multiplied again gl_FragColor = PoissonBlur( Texture0 ); } void frag() { vec4 sourceColor = texture2D_0(TexCoord); vec3 summation = texture2D_Downsample2(TexCoord).xyz + texture2D_Downsample4(TexCoord).xyz + texture2D_Downsample8(TexCoord).xyz + texture2D_Downsample16(TexCoord).xyz; gl_FragColor = vec4( clamp( sourceColor.x + summation.x, 0.0, sourceColor.a ) , clamp( sourceColor.y + summation.y, 0.0, sourceColor.a ) , clamp( sourceColor.z + summation.z, 0.0, sourceColor.a ) , sourceColor.a ); /* gl_FragColor = vec4( texture2D_Downsample2(TexCoord).xyz , sourceColor.a ); */ }