mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-12-25 23:13:39 +00:00
[client] egl: implement lanczos filter shader
This commit is contained in:
parent
16adbab5d4
commit
94de061587
@ -64,6 +64,7 @@ build_shaders(
|
||||
shader/ffx_fsr1_easu.frag
|
||||
shader/ffx_fsr1_rcas.frag
|
||||
shader/downscale.frag
|
||||
shader/downscale_lanczos2.frag
|
||||
)
|
||||
|
||||
make_defines(
|
||||
|
67
client/renderers/EGL/shader/downscale_lanczos2.frag
Normal file
67
client/renderers/EGL/shader/downscale_lanczos2.frag
Normal file
@ -0,0 +1,67 @@
|
||||
#version 300 es
|
||||
precision mediump float;
|
||||
|
||||
#define PI 3.141592653589793
|
||||
|
||||
in vec2 fragCoord;
|
||||
out vec4 fragColor;
|
||||
|
||||
uniform sampler2D texture;
|
||||
float sinc(float x)
|
||||
{
|
||||
return x == 0.0 ? 1.0 : sin(x * PI) / (x * PI);
|
||||
}
|
||||
|
||||
float lanczos(float x)
|
||||
{
|
||||
return sinc(x) * sinc(x * 0.5);
|
||||
}
|
||||
|
||||
float lanczos(vec2 v)
|
||||
{
|
||||
return lanczos(v.x) * lanczos(v.y);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 size = vec2(textureSize(texture, 0));
|
||||
vec2 pos = fragCoord * size;
|
||||
vec2 invSize = 1.0 / size;
|
||||
vec2 uvc = floor(pos) + vec2(0.5, 0.5);
|
||||
|
||||
vec2 uvs[16] = vec2[](
|
||||
uvc + vec2(-1.0, -1.0),
|
||||
uvc + vec2(-1.0, 0.0),
|
||||
uvc + vec2(-1.0, 1.0),
|
||||
uvc + vec2(-1.0, 2.0),
|
||||
uvc + vec2( 0.0, -1.0),
|
||||
uvc + vec2( 0.0, 0.0),
|
||||
uvc + vec2( 0.0, 1.0),
|
||||
uvc + vec2( 0.0, 2.0),
|
||||
uvc + vec2( 1.0, -1.0),
|
||||
uvc + vec2( 1.0, 0.0),
|
||||
uvc + vec2( 1.0, 1.0),
|
||||
uvc + vec2( 1.0, 2.0),
|
||||
uvc + vec2( 2.0, -1.0),
|
||||
uvc + vec2( 2.0, 0.0),
|
||||
uvc + vec2( 2.0, 1.0),
|
||||
uvc + vec2( 2.0, 2.0)
|
||||
);
|
||||
|
||||
float factors[16];
|
||||
float sum = 0.0;
|
||||
for (int i = 0; i < 16; ++i)
|
||||
{
|
||||
factors[i] = lanczos(uvs[i] - fragCoord * size);
|
||||
sum += factors[i];
|
||||
}
|
||||
|
||||
for (int i = 0; i < 16; ++i)
|
||||
factors[i] /= sum;
|
||||
|
||||
vec3 color = vec3(0.0);
|
||||
for (int i = 0; i < 16; ++i)
|
||||
color += texture2D(texture, uvs[i] * invSize).rgb * factors[i];
|
||||
|
||||
fragColor = vec4(color, 1.0);
|
||||
}
|
Loading…
Reference in New Issue
Block a user