mirror of https://github.com/bsnes-emu/bsnes.git
33 lines
855 B
GLSL
33 lines
855 B
GLSL
#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);;
|
|
} |