diff options
author | wm4 <wm4@nowhere> | 2015-09-23 22:43:27 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-09-23 22:43:27 +0200 |
commit | cb1c0725345d4bf7e0226aceb934f06f40cc0ee1 (patch) | |
tree | 5816d4e8e30f845fe0d3637061f8db2722601de4 /video/out/opengl/video_shaders.c | |
parent | c17ff1703a85679e3129b3755318fe926d85d9a6 (diff) | |
download | mpv-cb1c0725345d4bf7e0226aceb934f06f40cc0ee1.tar.bz2 mpv-cb1c0725345d4bf7e0226aceb934f06f40cc0ee1.tar.xz |
vo_opengl: remove sharpen scalers, add sharpen sub-option
This turns the old scalers (inherited from MPlayer) into a pre-
processing step (after color conversion and before scaling). The code
for the "sharpen5" scaler is reused for this.
The main reason MPlayer implemented this as scalers was perhaps because
FBOs were too expensive, and making it a scaler allowed to implement
this in 1 pass. But unsharp masking is not really a scaler, and I would
guess the result is more like combining bilinear scaling and unsharp
masking.
Diffstat (limited to 'video/out/opengl/video_shaders.c')
-rw-r--r-- | video/out/opengl/video_shaders.c | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/video/out/opengl/video_shaders.c b/video/out/opengl/video_shaders.c index 2ea57b781d..90cfba5166 100644 --- a/video/out/opengl/video_shaders.c +++ b/video/out/opengl/video_shaders.c @@ -200,44 +200,6 @@ void pass_sample_bicubic_fast(struct gl_shader_cache *sc) GLSLF("}\n"); } -void pass_sample_sharpen3(struct gl_shader_cache *sc, struct scaler *scaler) -{ - GLSL(vec4 color;) - GLSLF("{\n"); - GLSL(vec2 st = pt * 0.5;) - GLSL(vec4 p = texture(tex, pos);) - GLSL(vec4 sum = texture(tex, pos + st * vec2(+1, +1)) - + texture(tex, pos + st * vec2(+1, -1)) - + texture(tex, pos + st * vec2(-1, +1)) - + texture(tex, pos + st * vec2(-1, -1));) - float param = scaler->conf.kernel.params[0]; - param = isnan(param) ? 0.5 : param; - GLSLF("color = p + (p - 0.25 * sum) * %f;\n", param); - GLSLF("}\n"); -} - -void pass_sample_sharpen5(struct gl_shader_cache *sc, struct scaler *scaler) -{ - GLSL(vec4 color;) - GLSLF("{\n"); - GLSL(vec2 st1 = pt * 1.2;) - GLSL(vec4 p = texture(tex, pos);) - GLSL(vec4 sum1 = texture(tex, pos + st1 * vec2(+1, +1)) - + texture(tex, pos + st1 * vec2(+1, -1)) - + texture(tex, pos + st1 * vec2(-1, +1)) - + texture(tex, pos + st1 * vec2(-1, -1));) - GLSL(vec2 st2 = pt * 1.5;) - GLSL(vec4 sum2 = texture(tex, pos + st2 * vec2(+1, 0)) - + texture(tex, pos + st2 * vec2( 0, +1)) - + texture(tex, pos + st2 * vec2(-1, 0)) - + texture(tex, pos + st2 * vec2( 0, -1));) - GLSL(vec4 t = p * 0.859375 + sum2 * -0.1171875 + sum1 * -0.09765625;) - float param = scaler->conf.kernel.params[0]; - param = isnan(param) ? 0.5 : param; - GLSLF("color = p + t * %f;\n", param); - GLSLF("}\n"); -} - void pass_sample_oversample(struct gl_shader_cache *sc, struct scaler *scaler, int w, int h) { @@ -435,3 +397,26 @@ void pass_sample_deband(struct gl_shader_cache *sc, struct deband_opts *opts, GLSL(noise.z = rand(h); h = permute(h);) GLSLF("color.xyz += %f * (noise - vec3(0.5));\n", opts->grain/8192.0); } + +void pass_sample_unsharp(struct gl_shader_cache *sc, float param) +{ + GLSLF("// unsharp\n"); + sampler_prelude(sc, 0); + + GLSL(vec4 color;) + GLSLF("{\n"); + GLSL(vec2 st1 = pt * 1.2;) + GLSL(vec4 p = texture(tex, pos);) + GLSL(vec4 sum1 = texture(tex, pos + st1 * vec2(+1, +1)) + + texture(tex, pos + st1 * vec2(+1, -1)) + + texture(tex, pos + st1 * vec2(-1, +1)) + + texture(tex, pos + st1 * vec2(-1, -1));) + GLSL(vec2 st2 = pt * 1.5;) + GLSL(vec4 sum2 = texture(tex, pos + st2 * vec2(+1, 0)) + + texture(tex, pos + st2 * vec2( 0, +1)) + + texture(tex, pos + st2 * vec2(-1, 0)) + + texture(tex, pos + st2 * vec2( 0, -1));) + GLSL(vec4 t = p * 0.859375 + sum2 * -0.1171875 + sum1 * -0.09765625;) + GLSLF("color = p + t * %f;\n", param); + GLSLF("}\n"); +} |