123456789101112131415161718192021222324252627282930313233 |
- #version 150
- // Sharp Bilinear
- // Author: Themaister
- // License: Public Domain
- uniform sampler2D source[];
- uniform vec4 sourceSize[];
- uniform vec4 targetSize;
- in Vertex {
- vec2 texCoord;
- };
- out vec4 fragColor;
- void main() {
- float prescale = floor(targetSize.y / sourceSize[0].y);
- vec2 texel = texCoord.xy * sourceSize[0].xy;
- vec2 texel_floored = floor(texel);
- vec2 s = fract(texel);
- float region_range = 0.5 - 0.5 / prescale;
- // Figure out where in the texel to sample to get correct pre-scaled bilinear.
- // Uses the hardware bilinear interpolator to avoid having to sample 4 times manually.
- vec2 center_dist = s - 0.5;
- vec2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * prescale + 0.5;
- vec2 mod_texel = texel_floored + f;
-
- fragColor = texture(source[0], mod_texel / sourceSize[0].xy);;
- }
|