#version 100 precision mediump float; // Input from the vertex shader varying vec2 fragTexCoord; // Output color for the screen varying 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(float n, vec2 p) { p = floor(p*vec2(-4.0, 4.0) + 2.5); // Check if the calculated coordinate is inside the 5x5 grid (from 0.0 to 4.0) if (clamp(p.x, 0.0, 4.0) == p.x && clamp(p.y, 0.0, 4.0) == p.y) { float a = floor(p.x + 0.5) + 5.0*floor(p.y + 0.5); // This checked if the 'a'-th bit of 'n' was set float shiftedN = floor(n/pow(2.0, a)); if (mod(shiftedN, 2.0) == 1.0) { return 1.0; // The bit is on } } 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 = texture2D(texture0, cellUV).rgb; // Gray is used to define what character will be selected to draw float gray = GreyScale(cellColor); float n = 4096.0; // 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.0; // : if (gray > 0.3) n = 18725316.0; // v if (gray > 0.4) n = 15255086.0; // o if (gray > 0.5) n = 13121101.0; // & if (gray > 0.6) n = 15252014.0; // 8 if (gray > 0.7) n = 13195790.0; // @ if (gray > 0.8) n = 11512810.0; // # vec2 localUV = (fragTexCoord - cellUV)/uvCellSize; // Range [0.0, 1.0] vec2 p = localUV*2.0 - 1.0; // Range [-1.0, 1.0] // cellColor and charShape will define the color of the char vec3 color = cellColor*GetCharacter(n, p); gl_FragColor = vec4(color, 1.0); }