diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-04-09 16:51:08 +0200 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-04-09 16:51:08 +0200 |
| commit | 969bebbd06d3f9ac20910b70bb3310ec91931e74 (patch) | |
| tree | 4890e37f12c85fcc43c679d23567a29af7eabec8 /src/render/Shaders.hpp | |
| parent | b7094200f6f4b24026cd1e0458ed0d75a34d50ef (diff) | |
Added blurring 🎉
Diffstat (limited to 'src/render/Shaders.hpp')
| -rw-r--r-- | src/render/Shaders.hpp | 103 |
1 files changed, 102 insertions, 1 deletions
diff --git a/src/render/Shaders.hpp b/src/render/Shaders.hpp index b8239c57..09d4d504 100644 --- a/src/render/Shaders.hpp +++ b/src/render/Shaders.hpp @@ -138,6 +138,107 @@ void main() { gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0) * alpha; })#"; +// thanks to Loadus +// https://www.shadertoy.com/view/Mtl3Rj +// for this pseudo-gaussian blur! +inline const std::string FRAGBLUR1 = R"#( +precision mediump float; +varying vec2 v_texcoord; // is in 0-1 +uniform sampler2D tex; + +uniform float radius; +uniform vec2 resolution; +uniform float alpha; + +float SCurve (float x) { + x = x * 2.0 - 1.0; + return -x * abs(x) * 0.5 + x + 0.5; +} + +vec4 BlurH (vec2 size, vec2 uv) { + if (radius >= 1.0) { + vec4 A = vec4(0.0); + vec4 C = vec4(0.0); + + float width = 1.0 / size.x; + + float divisor = 0.0; + float weight = 0.0; + + float radiusMultiplier = 1.0 / radius; + + for (float x = -radius; x <= radius; x++) { + A = texture2D(tex, uv + vec2(x * width, 0.0)); + + weight = SCurve(1.0 - (abs(x) * radiusMultiplier)); + + C += A * weight; + + divisor += weight; + } + + return vec4(C.r / divisor, C.g / divisor, C.b / divisor, 1.0); + } + + return texture2D(tex, uv); +} + + +void main() { + gl_FragColor = BlurH(resolution, v_texcoord) * alpha; +} + +)#"; + +inline const std::string FRAGBLUR2 = R"#( +precision mediump float; +varying vec2 v_texcoord; // is in 0-1 +uniform sampler2D tex; + +uniform float radius; +uniform vec2 resolution; +uniform float alpha; + +float SCurve (float x) { + x = x * 2.0 - 1.0; + return -x * abs(x) * 0.5 + x + 0.5; +} + +vec4 BlurV (vec2 size, vec2 uv) { + if (radius >= 1.0) { + vec4 A = vec4(0.0); + vec4 C = vec4(0.0); + + float height = 1.0 / size.y; + + float divisor = 0.0; + float weight = 0.0; + + float radiusMultiplier = 1.0 / radius; + + for (float y = -radius; y <= radius; y++) { + A = texture2D(tex, uv + vec2(0.0, y * height)); + + weight = SCurve(1.0 - (abs(y) * radiusMultiplier)); + + C += A * weight; + + divisor += weight; + } + + return vec4(C.r / divisor, C.g / divisor, C.b / divisor, 1.0); + } + + return texture2D(tex, uv); +} + + +void main() { + gl_FragColor = BlurV(resolution, v_texcoord) * alpha; +} + +)#"; + inline const std::string TEXFRAGSRCEXT = R"#( #extension GL_OES_EGL_image_external : require @@ -189,4 +290,4 @@ void main() { } gl_FragColor = texture2D(texture0, v_texcoord) * alpha; -})#";
\ No newline at end of file +})#"; |
