Files
Nuake-custom/Resources/Shaders/posterization.shader

36 lines
939 B
GLSL

#shader vertex
#version 440 core
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 UVPosition;
out flat vec2 UV;
void main()
{
UV = UVPosition;
gl_Position = vec4(VertexPosition, 1.0f);
}
#shader fragment
#version 440 core
uniform sampler2D u_Source;
uniform int u_Levels = 10;
in vec2 UV;
out vec4 FragColor;
// Implementation from: https://lettier.github.io/3d-game-shaders-for-beginners/posterization.html
void main()
{
vec4 frameColor = texture(u_Source, UV);
float greyscale = max(frameColor.r, max(frameColor.g, frameColor.b));
float lower = floor(greyscale * u_Levels) / u_Levels;
float lowerDiff = abs(greyscale - lower);
float upper = ceil(greyscale * u_Levels) / u_Levels;
float upperDiff = abs(upper - greyscale);
float level = lowerDiff <= upperDiff ? lower : upper;
float adjustment = level / greyscale;
FragColor = frameColor * adjustment;
}