aboutsummaryrefslogtreecommitdiff
path: root/assets/shaders/psx_filter.fs
blob: 21eaadaa0308acf746e69811cbb2b518ecc449a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#version 330

uniform sampler2D texture0;

in vec2 fragTexCoord;

out vec4 finalColor;

const float neareight = 255.0;
vec3 dither(vec3 col, uvec2 fc)
{
    const int mat[16] = int[16] (
        -4, 0, -3, 1,
        2, -2, 3, -1,
        -3, 1, -4, 0,
        3, -1, 2, -2
    );

    ivec3 uncol = ivec3(col * neareight) + mat[(fc.y & uint(3)) * uint(4) + (fc.x & uint(3))];
    return vec3(uncol) / neareight;
}

vec3 band_color(vec3 lol)
{
	ivec3 res = ivec3(clamp(lol, 0.0, 1.0) * neareight) & ivec3(0xFF);
	ivec3 ires = res >> 3;
	ivec3 dres = (ires >> 2) & ivec3(7);
	res = (ires << 3) | dres;
	return vec3(res) / neareight;
}

void main()
{
    vec4 texelColor = texture(texture0, fragTexCoord);
    texelColor.rgb = band_color(dither(texelColor.rgb, uvec2(gl_FragCoord.xy)));

    finalColor = texelColor;
}