| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- // Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
- // All rights reserved.
- // Code licensed under the BSD License.
- // http://www.anki3d.org/LICENSE
- /// Defines:
- /// - VPASS or HPASS
- /// - COL_RGBA or COL_RGB or COL_R
- /// - SAMPLES is a number of 3 or 5 or 7 or 9
- /// - BLURRING_DIST is optional and it's extra pixels to move the blurring
- #include "shaders/Common.glsl"
- // Preprocessor switches sanity checks
- #if !defined(VPASS) && !defined(HPASS)
- #error See file
- #endif
- #if !(defined(COL_RGBA) || defined(COL_RGB) || defined(COL_R))
- #error See file
- #endif
- #if !defined(IMG_DIMENSION)
- #error See file
- #endif
- #if !defined(SAMPLES)
- #error See file
- #endif
- // Input RT with different binding for less GL API calls
- layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D uTex;
- layout(location = 0) in vec2 in_texCoord;
- #if !defined(BLURRING_DIST)
- #define BLURRING_DIST 0.0
- #endif
- // Determine color type
- #if defined(COL_RGBA)
- #define COL_TYPE vec4
- #elif defined(COL_RGB)
- #define COL_TYPE vec3
- #elif defined(COL_R)
- #define COL_TYPE float
- #endif
- // Determine tex fetch
- #if defined(COL_RGBA)
- #define TEX_FETCH rgba
- #elif defined(COL_RGB)
- #define TEX_FETCH rgb
- #elif defined(COL_R)
- #define TEX_FETCH r
- #endif
- // Calc the kernel. Use offsets of 3 to take advantage of bilinear filtering
- #define BLURRING(val, sign_) ((float(val) * (float(BLURRING_DIST) + 1.0) / float(IMG_DIMENSION)) * float(sign_))
- #if defined(HPASS)
- #define BLURRING_OFFSET_X(val, sign_) BLURRING(val, sign_)
- #define BLURRING_OFFSET_Y(val, sign_) 0.0
- #else
- #define BLURRING_OFFSET_X(val, sign_) 0.0
- #define BLURRING_OFFSET_Y(val, sign_) BLURRING(val, sign_)
- #endif
- #define BLURRING_OFFSET(v, s) vec2(BLURRING_OFFSET_X(v, s), BLURRING_OFFSET_Y(v, s))
- const vec2 KERNEL[SAMPLES - 1] = vec2[](BLURRING_OFFSET(1, -1),
- BLURRING_OFFSET(1, 1)
- #if SAMPLES > 3
- ,
- BLURRING_OFFSET(2, -1),
- BLURRING_OFFSET(2, 1)
- #endif
- #if SAMPLES > 5
- ,
- BLURRING_OFFSET(3, -1),
- BLURRING_OFFSET(3, 1)
- #endif
- #if SAMPLES > 7
- ,
- BLURRING_OFFSET(4, -1),
- BLURRING_OFFSET(4, 1)
- #endif
- #if SAMPLES > 9
- ,
- BLURRING_OFFSET(5, -1),
- BLURRING_OFFSET(5, 1)
- #endif
- #if SAMPLES > 11
- ,
- BLURRING_OFFSET(6, -1),
- BLURRING_OFFSET(6, 1)
- #endif
- #if SAMPLES > 13
- ,
- BLURRING_OFFSET(7, -1),
- BLURRING_OFFSET(7, 1)
- #endif
- #if SAMPLES > 15
- ,
- BLURRING_OFFSET(8, -1),
- BLURRING_OFFSET(8, 1)
- #endif
- #if SAMPLES > 17
- ,
- BLURRING_OFFSET(9, -1),
- BLURRING_OFFSET(9, 1)
- #endif
- );
- layout(location = 0) out COL_TYPE out_fragColor;
- void main()
- {
- // Get the first
- COL_TYPE col = texture(uTex, in_texCoord).TEX_FETCH;
- // Get the rest of the samples
- for(uint i = 0; i < SAMPLES - 1; i++)
- {
- col += texture(uTex, in_texCoord + KERNEL[i]).TEX_FETCH;
- }
- out_fragColor = col / float(SAMPLES);
- }
|