#version 330 // Input from the vertex shader in vec2 fragTexCoord; // Output color for the screen out vec4 finalColor; uniform sampler2D texture0; uniform vec2 resolution; // Fontsize less then 9 may be not complete uniform float fontSize; float GreyScale(in vec3 col) { return dot(col, vec3(0.2126, 0.7152, 0.0722)); } float GetCharacter(int n, vec2 p) { p = floor(p*vec2(-4.0, 4.0) + 2.5); // Check if the coordinate is inside the 5x5 grid (0 to 4) if (clamp(p.x, 0.0, 4.0) == p.x && clamp(p.y, 0.0, 4.0) == p.y) { int a = int(round(p.x) + 5.0*round(p.y)); if (((n >> a) & 1) == 1) { return 1.0; } } return 0.0; // The bit is off, or we are outside the grid } // ----------------------------------------------------------------------------- // Main shader logic // ----------------------------------------------------------------------------- void main() { vec2 charPixelSize = vec2(fontSize, fontSize); vec2 uvCellSize = charPixelSize/resolution; // The cell size is based on the fontSize set by application vec2 cellUV = floor(fragTexCoord/uvCellSize)*uvCellSize; vec3 cellColor = texture(texture0, cellUV).rgb; // Gray is used to define what character will be selected to draw float gray = GreyScale(cellColor); int n = 4096; // Character set from https://www.shadertoy.com/view/lssGDj // Create new bitmaps https://thrill-project.com/archiv/coding/bitmap/ if (gray > 0.2) n = 65600; // : if (gray > 0.3) n = 18725316; // v if (gray > 0.4) n = 15255086; // o if (gray > 0.5) n = 13121101; // & if (gray > 0.6) n = 15252014; // 8 if (gray > 0.7) n = 13195790; // @ if (gray > 0.8) n = 11512810; // # vec2 localUV = (fragTexCoord - cellUV)/uvCellSize; // Range [0.0, 1.0] vec2 p = localUV*2.0 - 1.0; // Range [-1.0, 1.0] vec3 color = cellColor*GetCharacter(n, p); finalColor = vec4(color, 1.0); }