summaryrefslogtreecommitdiff
path: root/src/render/Shaders.hpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-09 16:51:08 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-09 16:51:08 +0200
commit969bebbd06d3f9ac20910b70bb3310ec91931e74 (patch)
tree4890e37f12c85fcc43c679d23567a29af7eabec8 /src/render/Shaders.hpp
parentb7094200f6f4b24026cd1e0458ed0d75a34d50ef (diff)
Added blurring 🎉
Diffstat (limited to 'src/render/Shaders.hpp')
-rw-r--r--src/render/Shaders.hpp103
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
+})#";