1// Implementation based on the article "Efficient Gaussian blur with linear sampling" 2// http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/ 3/* A version for MasterEffect Reborn, a standalone version, and a custom shader version for SweetFX can be 4 found at http://reshade.me/forum/shader-presentation/27-gaussian-blur-bloom-unsharpmask */ 5 /*-----------------------------------------------------------. 6/ Gaussian Blur settings / 7'-----------------------------------------------------------*/ 8 9#define VW 1.00 10 11#if defined(VERTEX) 12 13#if __VERSION__ >= 130 14#define COMPAT_VARYING out 15#define COMPAT_ATTRIBUTE in 16#define COMPAT_TEXTURE texture 17#else 18#define COMPAT_VARYING varying 19#define COMPAT_ATTRIBUTE attribute 20#define COMPAT_TEXTURE texture2D 21#endif 22 23#ifdef GL_ES 24#define COMPAT_PRECISION mediump 25#else 26#define COMPAT_PRECISION 27#endif 28 29COMPAT_ATTRIBUTE vec4 VertexCoord; 30COMPAT_ATTRIBUTE vec4 COLOR; 31COMPAT_ATTRIBUTE vec4 TexCoord; 32COMPAT_VARYING vec4 COL0; 33COMPAT_VARYING vec4 TEX0; 34// out variables go here as COMPAT_VARYING whatever 35 36vec4 _oPosition1; 37uniform mat4 MVPMatrix; 38uniform COMPAT_PRECISION int FrameDirection; 39uniform COMPAT_PRECISION int FrameCount; 40uniform COMPAT_PRECISION vec2 OutputSize; 41uniform COMPAT_PRECISION vec2 TextureSize; 42uniform COMPAT_PRECISION vec2 InputSize; 43 44void main() 45{ 46 gl_Position = MVPMatrix * VertexCoord; 47 COL0 = COLOR; 48 TEX0.xy = TexCoord.xy; 49} 50 51#elif defined(FRAGMENT) 52 53#if __VERSION__ >= 130 54#define COMPAT_VARYING in 55#define COMPAT_TEXTURE texture 56out vec4 FragColor; 57#else 58#define COMPAT_VARYING varying 59#define FragColor gl_FragColor 60#define COMPAT_TEXTURE texture2D 61#endif 62 63#ifdef GL_ES 64#ifdef GL_FRAGMENT_PRECISION_HIGH 65precision highp float; 66#else 67precision mediump float; 68#endif 69#define COMPAT_PRECISION mediump 70#else 71#define COMPAT_PRECISION 72#endif 73 74uniform COMPAT_PRECISION int FrameDirection; 75uniform COMPAT_PRECISION int FrameCount; 76uniform COMPAT_PRECISION vec2 OutputSize; 77uniform COMPAT_PRECISION vec2 TextureSize; 78uniform COMPAT_PRECISION vec2 InputSize; 79uniform sampler2D Texture; 80COMPAT_VARYING vec4 TEX0; 81 82// compatibility #defines 83#define Source Texture 84#define vTexCoord TEX0.xy 85 86#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 87#define outsize vec4(OutputSize, 1.0 / OutputSize) 88 89void main() 90{ 91 vec2 texcoord = vTexCoord; 92 vec2 PIXEL_SIZE = SourceSize.zw; 93#if __VERSION__ < 130 94 float sampleOffsets1 = 0.0; 95 float sampleOffsets2 = 1.4347826; 96 float sampleOffsets3 = 3.3478260; 97 float sampleOffsets4 = 5.2608695; 98 float sampleOffsets5 = 7.1739130; 99 100 float sampleWeights1 = 0.16818994; 101 float sampleWeights2 = 0.27276957; 102 float sampleWeights3 = 0.11690125; 103 float sampleWeights4 = 0.024067905; 104 float sampleWeights5 = 0.0021112196; 105 106 vec4 color = COMPAT_TEXTURE(Source, texcoord) * sampleWeights1; 107 108// unroll the loop 109 color += COMPAT_TEXTURE(Source, texcoord + vec2(0.0, sampleOffsets2* VW * PIXEL_SIZE.y)) * sampleWeights2; 110 color += COMPAT_TEXTURE(Source, texcoord - vec2(0.0, sampleOffsets2* VW * PIXEL_SIZE.y)) * sampleWeights2; 111 112 color += COMPAT_TEXTURE(Source, texcoord + vec2(0.0, sampleOffsets3* VW * PIXEL_SIZE.y)) * sampleWeights3; 113 color += COMPAT_TEXTURE(Source, texcoord - vec2(0.0, sampleOffsets3* VW * PIXEL_SIZE.y)) * sampleWeights3; 114 115 color += COMPAT_TEXTURE(Source, texcoord + vec2(0.0, sampleOffsets4* VW * PIXEL_SIZE.y)) * sampleWeights4; 116 color += COMPAT_TEXTURE(Source, texcoord - vec2(0.0, sampleOffsets4* VW * PIXEL_SIZE.y)) * sampleWeights4; 117 118 color += COMPAT_TEXTURE(Source, texcoord + vec2(0.0, sampleOffsets5* VW * PIXEL_SIZE.y)) * sampleWeights5; 119 color += COMPAT_TEXTURE(Source, texcoord - vec2(0.0, sampleOffsets5* VW * PIXEL_SIZE.y)) * sampleWeights5; 120#else 121 122 float sampleOffsets[5] = { 0.0, 1.4347826, 3.3478260, 5.2608695, 7.1739130 }; 123 float sampleWeights[5] = { 0.16818994, 0.27276957, 0.11690125, 0.024067905, 0.0021112196 }; 124 125 vec4 color = COMPAT_TEXTURE(Source, texcoord) * sampleWeights[0]; 126 for(int i = 1; i < 5; ++i) { 127 color += COMPAT_TEXTURE(Source, texcoord + vec2(0.0, sampleOffsets[i]*VW * PIXEL_SIZE.y)) * sampleWeights[i]; 128 color += COMPAT_TEXTURE(Source, texcoord - vec2(0.0, sampleOffsets[i]*VW * PIXEL_SIZE.y)) * sampleWeights[i]; 129 } 130#endif 131 132 FragColor = vec4(color); 133} 134#endif 135