diff options
Diffstat (limited to 'render/fx_renderer/gles2')
-rw-r--r-- | render/fx_renderer/gles2/shaders/blur1.frag | 18 | ||||
-rw-r--r-- | render/fx_renderer/gles2/shaders/blur2.frag | 22 | ||||
-rw-r--r-- | render/fx_renderer/gles2/shaders/blur_effects.frag | 60 | ||||
-rw-r--r-- | render/fx_renderer/gles2/shaders/meson.build | 3 | ||||
-rw-r--r-- | render/fx_renderer/gles2/shaders/stencil_mask.frag | 14 | ||||
-rw-r--r-- | render/fx_renderer/gles2/shaders/tex.frag | 5 |
6 files changed, 115 insertions, 7 deletions
diff --git a/render/fx_renderer/gles2/shaders/blur1.frag b/render/fx_renderer/gles2/shaders/blur1.frag new file mode 100644 index 0000000..e7cb1be --- /dev/null +++ b/render/fx_renderer/gles2/shaders/blur1.frag @@ -0,0 +1,18 @@ +precision mediump float; +varying mediump vec2 v_texcoord; +uniform sampler2D tex; + +uniform float radius; +uniform vec2 halfpixel; + +void main() { + vec2 uv = v_texcoord * 2.0; + + vec4 sum = texture2D(tex, uv) * 4.0; + sum += texture2D(tex, uv - halfpixel.xy * radius); + sum += texture2D(tex, uv + halfpixel.xy * radius); + sum += texture2D(tex, uv + vec2(halfpixel.x, -halfpixel.y) * radius); + sum += texture2D(tex, uv - vec2(halfpixel.x, -halfpixel.y) * radius); + + gl_FragColor = sum / 8.0; +} diff --git a/render/fx_renderer/gles2/shaders/blur2.frag b/render/fx_renderer/gles2/shaders/blur2.frag new file mode 100644 index 0000000..3755a29 --- /dev/null +++ b/render/fx_renderer/gles2/shaders/blur2.frag @@ -0,0 +1,22 @@ +precision mediump float; +varying mediump vec2 v_texcoord; +uniform sampler2D tex; + +uniform float radius; +uniform vec2 halfpixel; + +void main() { + vec2 uv = v_texcoord / 2.0; + + vec4 sum = texture2D(tex, uv + vec2(-halfpixel.x * 2.0, 0.0) * radius); + + sum += texture2D(tex, uv + vec2(-halfpixel.x, halfpixel.y) * radius) * 2.0; + sum += texture2D(tex, uv + vec2(0.0, halfpixel.y * 2.0) * radius); + sum += texture2D(tex, uv + vec2(halfpixel.x, halfpixel.y) * radius) * 2.0; + sum += texture2D(tex, uv + vec2(halfpixel.x * 2.0, 0.0) * radius); + sum += texture2D(tex, uv + vec2(halfpixel.x, -halfpixel.y) * radius) * 2.0; + sum += texture2D(tex, uv + vec2(0.0, -halfpixel.y * 2.0) * radius); + sum += texture2D(tex, uv + vec2(-halfpixel.x, -halfpixel.y) * radius) * 2.0; + + gl_FragColor = sum / 12.0; +} diff --git a/render/fx_renderer/gles2/shaders/blur_effects.frag b/render/fx_renderer/gles2/shaders/blur_effects.frag new file mode 100644 index 0000000..fcead5d --- /dev/null +++ b/render/fx_renderer/gles2/shaders/blur_effects.frag @@ -0,0 +1,60 @@ +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif + +varying vec2 v_texcoord; + +uniform sampler2D tex; + +uniform float noise; +uniform float brightness; +uniform float contrast; +uniform float saturation; + +mat4 brightnessMatrix() { + float b = brightness - 1.0; + return mat4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + b, b, b, 1); +} + +mat4 contrastMatrix() { + float t = (1.0 - contrast) / 2.0; + return mat4(contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1); +} + +mat4 saturationMatrix() { + vec3 luminance = vec3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + vec3 red = vec3(luminance.x * oneMinusSat); + red+= vec3(saturation, 0, 0); + vec3 green = vec3(luminance.y * oneMinusSat); + green += vec3(0, saturation, 0); + vec3 blue = vec3(luminance.z * oneMinusSat); + blue += vec3(0, 0, saturation); + return mat4(red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1); +} + +// Fast generative noise function +float hash(vec2 p) { + return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453); +} + +void main() { + vec4 color = texture2D(tex, v_texcoord); + color *= brightnessMatrix() * contrastMatrix() * saturationMatrix(); + float noiseHash = hash(v_texcoord); + float noiseAmount = (mod(noiseHash, 1.0) - 0.5); + color.rgb += noiseAmount * noise; + + gl_FragColor = color; +} diff --git a/render/fx_renderer/gles2/shaders/meson.build b/render/fx_renderer/gles2/shaders/meson.build index 42f066e..a751e1a 100644 --- a/render/fx_renderer/gles2/shaders/meson.build +++ b/render/fx_renderer/gles2/shaders/meson.build @@ -6,6 +6,9 @@ shaders = [ 'tex.frag', 'box_shadow.frag', 'stencil_mask.frag', + 'blur1.frag', + 'blur2.frag', + 'blur_effects.frag', ] foreach name : shaders diff --git a/render/fx_renderer/gles2/shaders/stencil_mask.frag b/render/fx_renderer/gles2/shaders/stencil_mask.frag index 523adc8..e1fd76a 100644 --- a/render/fx_renderer/gles2/shaders/stencil_mask.frag +++ b/render/fx_renderer/gles2/shaders/stencil_mask.frag @@ -11,12 +11,12 @@ uniform vec2 position; uniform float radius; void main() { - vec2 q = abs(gl_FragCoord.xy - position - half_size) - half_size + radius; - float dist = min(max(q.x,q.y), 0.0) + length(max(q, 0.0)) - radius; - float smoothedAlpha = 1.0 - smoothstep(-1.0, 0.5, dist); - gl_FragColor = mix(vec4(0.0), vec4(1.0), smoothedAlpha); + vec2 q = abs(gl_FragCoord.xy - position - half_size) - half_size + radius; + float dist = min(max(q.x,q.y), 0.0) + length(max(q, 0.0)) - radius; + float smoothedAlpha = 1.0 - smoothstep(-1.0, 0.5, dist); + gl_FragColor = mix(vec4(0.0), vec4(1.0), smoothedAlpha); - if (gl_FragColor.a < 1.0) { - discard; - } + if (gl_FragColor.a < 1.0) { + discard; + } } diff --git a/render/fx_renderer/gles2/shaders/tex.frag b/render/fx_renderer/gles2/shaders/tex.frag index 8c14373..b7ba3fc 100644 --- a/render/fx_renderer/gles2/shaders/tex.frag +++ b/render/fx_renderer/gles2/shaders/tex.frag @@ -29,6 +29,7 @@ uniform float alpha; uniform vec2 size; uniform vec2 position; uniform float radius; +uniform bool discard_transparent; vec4 sample_texture() { #if SOURCE == SOURCE_TEXTURE_RGBA || SOURCE == SOURCE_TEXTURE_EXTERNAL @@ -46,4 +47,8 @@ void main() { float smooth = smoothstep(-1.0, 0.5, d); gl_FragColor = mix(vec4(0), gl_FragColor, smooth); } + + if (discard_transparent && gl_FragColor.a == 0.0) { + discard; + } } |