X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=deconvolution_sharpen_effect.frag;fp=deconvolution_sharpen_effect.frag;h=7b90ac7fddc34d989e01c15f6b777d2514015a7d;hp=0000000000000000000000000000000000000000;hb=42c35394ef92bb5179fc4879cb55b866fd422d28;hpb=c36321a4c199c24a98cf3acef49e986ea65ae3f1 diff --git a/deconvolution_sharpen_effect.frag b/deconvolution_sharpen_effect.frag new file mode 100644 index 0000000..7b90ac7 --- /dev/null +++ b/deconvolution_sharpen_effect.frag @@ -0,0 +1,66 @@ +uniform vec4 PREFIX(samples)[(R + 1) * (R + 1)]; + +vec4 FUNCNAME(vec2 tc) { + // The full matrix has five different symmetry cases, that look like this: + // + // D * * C * * D + // * D * C * D * + // * * D C D * * + // B B B A B B B + // * * D C D * * + // * D * C * D * + // D * * C * * D + // + // We only store the lower-right part of the matrix: + // + // A B B + // C D * + // C * D + + // Case A: Top-left sample has no symmetry. + vec4 sum = PREFIX(samples)[0].z * INPUT(tc); + + // Case B: Uppermost samples have left/right symmetry. + for (int x = 1; x <= R; ++x) { + vec4 sample = PREFIX(samples)[x]; + sum += sample.z * (INPUT(tc - sample.xy) + INPUT(tc + sample.xy)); + } + + // Case C: Leftmost samples have top/bottom symmetry. + for (int y = 1; y <= R; ++y) { + vec4 sample = PREFIX(samples)[y * (R + 1)]; + sum += sample.z * (INPUT(tc - sample.xy) + INPUT(tc + sample.xy)); + } + + // Case D: Diagonal samples have four-way symmetry. + for (int xy = 1; xy <= R; ++xy) { + vec4 sample = PREFIX(samples)[xy * (R + 1) + xy]; + + vec4 local_sum = INPUT(tc - sample.xy) + INPUT(tc + sample.xy); + sample.y = -sample.y; + local_sum += INPUT(tc - sample.xy) + INPUT(tc + sample.xy); + + sum += sample.z * local_sum; + } + + // Case *: All other samples have eight-way symmetry. + for (int y = 1; y <= R; ++y) { + for (int x = y + 1; x <= R; ++x) { + vec4 sample = PREFIX(samples)[y * (R + 1) + x]; + vec2 mirror_sample = vec2(sample.x, -sample.y); + + vec4 local_sum = INPUT(tc - sample.xy) + INPUT(tc + sample.xy); + local_sum += INPUT(tc - mirror_sample.xy) + INPUT(tc + mirror_sample.xy); + + sample.xy = sample.yx; + mirror_sample.xy = mirror_sample.yx; + + local_sum += INPUT(tc - sample.xy) + INPUT(tc + sample.xy); + local_sum += INPUT(tc - mirror_sample.xy) + INPUT(tc + mirror_sample.xy); + + sum += sample.z * local_sum; + } + } + + return sum; +}