20 lines
847 B
GLSL
20 lines
847 B
GLSL
// Fragment-stage only (uses screen-space derivatives).
|
|
// "Sharp bilinear": crisp texel edges when magnified, antialiased boundaries
|
|
// and correct mip selection when minified (unlike GL_NEAREST shimmer).
|
|
vec4 sharpSample(sampler2D tex, vec2 uv) {
|
|
vec2 size = vec2(textureSize(tex, 0));
|
|
vec2 px = uv * size;
|
|
vec2 seam = floor(px + 0.5);
|
|
vec2 fw = max(fwidth(px), vec2(1e-5));
|
|
px = seam + clamp((px - seam) / fw, -0.5, 0.5);
|
|
return textureGrad(tex, px / size, dFdx(uv), dFdy(uv));
|
|
}
|
|
vec4 sharpSampleArray(sampler2DArray tex, vec2 uv, float layer) {
|
|
vec2 size = vec2(textureSize(tex, 0).xy);
|
|
vec2 px = uv * size;
|
|
vec2 seam = floor(px + 0.5);
|
|
vec2 fw = max(fwidth(px), vec2(1e-5));
|
|
px = seam + clamp((px - seam) / fw, -0.5, 0.5);
|
|
return textureGrad(tex, vec3(px / size, layer), dFdx(uv), dFdy(uv));
|
|
}
|