X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=resample_effect.frag;fp=resample_effect.frag;h=6aac29d72674cc93ce6f605c14c9a59d518d6182;hp=0000000000000000000000000000000000000000;hb=fb92a4e217a92ecf83b7812cc6933f6f3048b752;hpb=9e62fbe2ac764479c449472d8bda52ac4df0de91 diff --git a/resample_effect.frag b/resample_effect.frag new file mode 100644 index 0000000..6aac29d --- /dev/null +++ b/resample_effect.frag @@ -0,0 +1,38 @@ +// DIRECTION_VERTICAL will be #defined to 1 if we are scaling vertically, +// and 0 otherwise. + +uniform sampler2D PREFIX(sample_tex); +uniform int PREFIX(num_samples); +uniform float PREFIX(sample_x_scale); +uniform float PREFIX(sample_x_offset); + +// Sample a single weight. First fetch information about where to sample +// and the weight from sample_tex, and then read the pixel itself. +vec4 PREFIX(do_sample)(vec2 tc, int i) +{ + vec2 sample_tc; + sample_tc.x = float(i) * PREFIX(sample_x_scale) + PREFIX(sample_x_offset); +#if DIRECTION_VERTICAL + sample_tc.y = tc.y; +#else + sample_tc.y = tc.x; +#endif + vec2 sample = texture2D(PREFIX(sample_tex), sample_tc).rg; + +#if DIRECTION_VERTICAL + tc.y = sample.g; +#else + tc.x = sample.g; +#endif + return vec4(sample.r) * INPUT(tc); +} + +vec4 FUNCNAME(vec2 tc) { + vec4 sum = PREFIX(do_sample)(tc, 0); + for (int i = 1; i < PREFIX(num_samples); ++i) { + sum += PREFIX(do_sample)(tc, i); + } + return sum; +} + +#undef DIRECTION_VERTICAL