From 129703fad18b478d015a520524d46ab4afa2cb79 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 11 Apr 2019 16:53:20 +0200 Subject: [PATCH] new example: shaders_texture_drawing --- .../shaders/glsl330/cubes_panning.fs | 61 +++++++++++++++ examples/shaders/shaders_texture_drawing.c | 71 ++++++++++++++++++ examples/shaders/shaders_texture_drawing.png | Bin 0 -> 16865 bytes 3 files changed, 132 insertions(+) create mode 100644 examples/shaders/resources/shaders/glsl330/cubes_panning.fs create mode 100644 examples/shaders/shaders_texture_drawing.c create mode 100644 examples/shaders/shaders_texture_drawing.png diff --git a/examples/shaders/resources/shaders/glsl330/cubes_panning.fs b/examples/shaders/resources/shaders/glsl330/cubes_panning.fs new file mode 100644 index 000000000..c92418a48 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/cubes_panning.fs @@ -0,0 +1,61 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec2 fragTexCoord; +in vec4 fragColor; + +// Output fragment color +out vec4 finalColor; + +// Custom variables +#define PI 3.14159265358979323846 +uniform float uTime = 0.0; + +float divisions = 5.0; +float angle = 0.0; + +vec2 VectorRotateTime(vec2 v, float speed) +{ + float time = uTime*speed; + float localTime = fract(time); // The time domain this works on is 1 sec. + + if ((localTime >= 0.0) && (localTime < 0.25)) angle = 0.0; + else if ((localTime >= 0.25) && (localTime < 0.50)) angle = PI/4*sin(2*PI*localTime - PI/2); + else if ((localTime >= 0.50) && (localTime < 0.75)) angle = PI*0.25; + else if ((localTime >= 0.75) && (localTime < 1.00)) angle = PI/4*sin(2*PI*localTime); + + // Rotate vector by angle + v -= 0.5; + v = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*v; + v += 0.5; + + return v; +} + +float Rectangle(in vec2 st, in float size, in float fill) +{ + float roundSize = 0.5 - size/2.0; + float left = step(roundSize, st.x); + float top = step(roundSize, st.y); + float bottom = step(roundSize, 1.0 - st.y); + float right = step(roundSize, 1.0 - st.x); + + return (left*bottom*right*top)*fill; +} + +void main() +{ + vec2 fragPos = fragTexCoord; + fragPos.xy += uTime/9.0; + + fragPos *= divisions; + vec2 ipos = floor(fragPos); // Get the integer coords + vec2 fpos = fract(fragPos); // Get the fractional coords + + fpos = VectorRotateTime(fpos, 0.2); + + float alpha = Rectangle(fpos, 0.216, 1.0); + vec3 color = vec3(0.3, 0.3, 0.3); + + finalColor = vec4(color, alpha); +} \ No newline at end of file diff --git a/examples/shaders/shaders_texture_drawing.c b/examples/shaders/shaders_texture_drawing.c new file mode 100644 index 000000000..cb8a9c1eb --- /dev/null +++ b/examples/shaders/shaders_texture_drawing.c @@ -0,0 +1,71 @@ +/******************************************************************************************* +* +* raylib [textures] example - Shader texture drawing +* +* This example illustrates how to draw on a blank texture using a shader +* +* This example has been created using raylib 2.0 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2019 MichaƂ Ciesielski and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - shader texture drawing"); + + Image imBlank = GenImageColor(1024, 1024, BLANK); + Texture2D texture = LoadTextureFromImage(imBlank); // Load blank texture to fill on shader + UnloadImage(imBlank); + + // NOTE: Using GLSL 330 shader version, on OpenGL ES 2.0 use GLSL 100 shader version + Shader shader = LoadShader(0, "resources/shaders/glsl330/cubes_panning.fs"); + + float time = 0.0f; + int timeLoc = GetShaderLocation(shader, "uTime"); + SetShaderValue(shader, timeLoc, &time, UNIFORM_FLOAT); + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + while (!WindowShouldClose()) + { + // Update + //---------------------------------------------------------------------------------- + time = GetTime(); + SetShaderValue(shader, timeLoc, &time, UNIFORM_FLOAT); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginShaderMode(shader); // Enable our custom shader for next shapes/textures drawings + DrawTexture(texture, 0, 0, WHITE); // Drawing BLANK texture, all magic happens on shader + EndShaderMode(); // Disable our custom shader, return to default shader + + DrawText("BACKGROUND is PAINTED and ANIMATED on SHADER!", 10, 10, 20, MAROON); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadShader(shader); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/shaders/shaders_texture_drawing.png b/examples/shaders/shaders_texture_drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..12df6fae39c4154cbcda6987c999606c552cd8a1 GIT binary patch literal 16865 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 literal 0 HcmV?d00001