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