From 317c1eaeeb2bd67e54711639cbb13391dfa44c87 Mon Sep 17 00:00:00 2001 From: Maicon Santana Date: Mon, 29 Sep 2025 16:44:48 +0100 Subject: [PATCH] Add ascii post processing (#5213) --- .../resources/shaders/glsl100/ascii.fs | 67 ++++++++++ .../resources/shaders/glsl120/ascii.fs | 65 ++++++++++ .../resources/shaders/glsl330/ascii.fs | 66 ++++++++++ examples/shaders/shaders_ascii_effect.c | 119 ++++++++++++++++++ examples/shaders/shaders_ascii_effect.png | Bin 0 -> 45176 bytes 5 files changed, 317 insertions(+) create mode 100644 examples/shaders/resources/shaders/glsl100/ascii.fs create mode 100644 examples/shaders/resources/shaders/glsl120/ascii.fs create mode 100644 examples/shaders/resources/shaders/glsl330/ascii.fs create mode 100644 examples/shaders/shaders_ascii_effect.c create mode 100644 examples/shaders/shaders_ascii_effect.png diff --git a/examples/shaders/resources/shaders/glsl100/ascii.fs b/examples/shaders/resources/shaders/glsl100/ascii.fs new file mode 100644 index 000000000..a4a930c3c --- /dev/null +++ b/examples/shaders/resources/shaders/glsl100/ascii.fs @@ -0,0 +1,67 @@ +#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; +uniform float fontSize; + +float greyScale(in vec3 col) { + return dot(col, vec3(0.2126, 0.7152, 0.0722)); +} + +float character(float 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) { + + if (int(mod(n / exp2(p.x + 5.0 * p.y), 2.0)) == 1) { + return 1.0; // The bit is on, so draw this part of the character. + } + } + + return 0.0; // The bit is off, or we are outside the grid. +} + +// ----------------------------------------------------------------------------- +// Main shader logic +// ----------------------------------------------------------------------------- +void main() +{ + vec2 charPixelSize = vec2(fontSize, fontSize * 1.8); + vec2 uvCellSize = charPixelSize / resolution; + + vec2 cellUV = floor(fragTexCoord / uvCellSize) * uvCellSize; + + vec3 cellColor = texture2D(texture0, cellUV).rgb; + float gray = greyScale(cellColor); + + float n = 4096; + + // limited character set + if (gray > 0.2) n = 65600.0; // : + if (gray > 0.3) n = 163153.0; // * + 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; + + float charShape = character(n, p); + + vec3 final_col = cellColor * charShape; + + gl_FragColor = vec4(final_col, 1.0); +} \ No newline at end of file diff --git a/examples/shaders/resources/shaders/glsl120/ascii.fs b/examples/shaders/resources/shaders/glsl120/ascii.fs new file mode 100644 index 000000000..3521c8b33 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl120/ascii.fs @@ -0,0 +1,65 @@ +#version 120 + +// Input from the vertex shader +varying vec2 fragTexCoord; + +// Output color for the screen +varying vec4 finalColor; + +uniform sampler2D texture0; +uniform vec2 resolution; +uniform float fontSize; + +float greyScale(in vec3 col) { + return dot(col, vec3(0.2126, 0.7152, 0.0722)); +} + +float character(float 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) { + + if (int(mod(n / exp2(p.x + 5.0 * p.y), 2.0)) == 1) { + return 1.0; // The bit is on, so draw this part of the character. + } + } + + return 0.0; // The bit is off, or we are outside the grid. +} + +// ----------------------------------------------------------------------------- +// Main shader logic +// ----------------------------------------------------------------------------- +void main() +{ + vec2 charPixelSize = vec2(fontSize, fontSize * 1.8); + vec2 uvCellSize = charPixelSize / resolution; + + vec2 cellUV = floor(fragTexCoord / uvCellSize) * uvCellSize; + + vec3 cellColor = texture2D(texture0, cellUV).rgb; + float gray = greyScale(cellColor); + + float n = 4096; + + // limited character set + if (gray > 0.2) n = 65600.0; // : + if (gray > 0.3) n = 163153.0; // * + 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; + + float charShape = character(n, p); + + vec3 final_col = cellColor * charShape; + + gl_FragColor = vec4(final_col, 1.0); +} \ No newline at end of file diff --git a/examples/shaders/resources/shaders/glsl330/ascii.fs b/examples/shaders/resources/shaders/glsl330/ascii.fs new file mode 100644 index 000000000..4477f948d --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/ascii.fs @@ -0,0 +1,66 @@ +#version 330 + +// Input from the vertex shader +in vec2 fragTexCoord; + +// Output color for the screen +out vec4 finalColor; + +uniform sampler2D texture0; +uniform vec2 resolution; +uniform float fontSize; + +float greyScale(in vec3 col) { + return dot(col, vec3(0.2126, 0.7152, 0.0722)); +} + +float character(float 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) { + + if (int(mod(n / exp2(p.x + 5.0 * p.y), 2.0)) == 1) { + return 1.0; // The bit is on, so draw this part of the character. + } + } + + return 0.0; // The bit is off, or we are outside the grid. +} + +// ----------------------------------------------------------------------------- +// Main shader logic +// ----------------------------------------------------------------------------- + +void main() +{ + vec2 charPixelSize = vec2(fontSize, fontSize * 1.8); + vec2 uvCellSize = charPixelSize / resolution; + + vec2 cellUV = floor(fragTexCoord / uvCellSize) * uvCellSize; + + vec3 cellColor = texture(texture0, cellUV).rgb; + float gray = greyScale(cellColor); + + float n = 4096; + + // limited character set + if (gray > 0.2) n = 65600.0; // : + if (gray > 0.3) n = 163153.0; // * + 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; + + float charShape = character(n, p); + + vec3 final_col = cellColor * charShape; + + finalColor = vec4(final_col, 1.0); +} \ No newline at end of file diff --git a/examples/shaders/shaders_ascii_effect.c b/examples/shaders/shaders_ascii_effect.c new file mode 100644 index 000000000..c505d8516 --- /dev/null +++ b/examples/shaders/shaders_ascii_effect.c @@ -0,0 +1,119 @@ +/******************************************************************************************* +* +* raylib [shaders] example - ascii effect +* +* Example complexity rating: [★☆☆☆] 1/4 +* +* Example originally created with raylib 5.5, last time updated with raylib 5.6 +* +* Example contributed by Maicon Santana (@maiconpintoabreu) and reviewed by Ramon Santamaria (@raysan5) +* +* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software +* +* Copyright (c) 2025-2025 Maicon Santana (@maiconpintoabreu) +* +********************************************************************************************/ + +#include "raylib.h" + +#if defined(PLATFORM_DESKTOP) + #define GLSL_VERSION 330 +#else // PLATFORM_ANDROID, PLATFORM_WEB + #define GLSL_VERSION 100 +#endif + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - ascii effect"); + + // Texture to test static drawing + Texture2D fudesumi = LoadTexture("resources/fudesumi.png"); + // Texture to test moving drawing + Texture2D raysan = LoadTexture("resources/raysan.png"); + + // Load shader to be used on postprocessing + Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/ascii.fs", GLSL_VERSION)); + + // These locations are used to send data to the GPU. + int resolutionLoc = GetShaderLocation(shader, "resolution"); + int fontSizeLoc = GetShaderLocation(shader, "fontSize"); + + // Set the character size for the ASCII effect + float fontSize = 4.0f; + + // Send the updated values to the shader + float resolution[2] = { (float)screenWidth, (float)screenHeight }; + SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2); + SetShaderValue(shader, fontSizeLoc, &fontSize, SHADER_UNIFORM_FLOAT); + + Vector2 circlePos = (Vector2){40.0f, (float)screenHeight * 0.5f}; + float circleSpeed = 1.0f; + + // RenderTexture to apply the postprocessing later + RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight); + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (circlePos.x > 200.0f || circlePos.x < 40.0f) { + circleSpeed *= -1; + } + circlePos.x += circleSpeed; + + // Draw + //---------------------------------------------------------------------------------- + + BeginTextureMode(target); + ClearBackground(WHITE); // The background of the scene itself + + DrawTexture(fudesumi, 500, -30, WHITE); // Using custom shader + DrawTextureV(raysan, circlePos, WHITE); + + EndTextureMode(); + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginShaderMode(shader); + + // Draw the scene texture (that we rendered earlier) to the screen. + // The shader will process every pixel of this texture. + DrawTextureRec(target.texture, + (Rectangle){ 0, 0, (float)target.texture.width, (float)-target.texture.height }, + (Vector2){ 0, 0 }, + WHITE); + EndShaderMode(); + + DrawRectangle(0, 0, screenWidth, 40, BLACK); + DrawText("Ascii effect", 120, 10, 20, LIGHTGRAY); + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadShader(shader); // Unload shader + UnloadTexture(fudesumi); // Unload texture + UnloadTexture(raysan); // Unload texture + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/shaders/shaders_ascii_effect.png b/examples/shaders/shaders_ascii_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..eee5cc90b620c14cc111bb9a8348765cb77e827d GIT binary patch literal 45176 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 ntY^P`$Sott