36 lines
939 B
GLSL
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;
|
|
} |