From 06623e2558d50b8bb20d34cead39c43c92121857 Mon Sep 17 00:00:00 2001 From: ggrizzly Date: Mon, 2 Mar 2026 19:42:20 -0500 Subject: [PATCH] added cel-shading and outline using inverted hull example --- .../shaders/resources/shaders/glsl330/cel.fs | 60 ++++++ .../shaders/resources/shaders/glsl330/cel.vs | 25 +++ .../resources/shaders/glsl330/outline_hull.fs | 7 + .../resources/shaders/glsl330/outline_hull.vs | 15 ++ examples/shaders/shaders_cel_shading.c | 202 ++++++++++++++++++ examples/shaders/shaders_cel_shading.png | Bin 0 -> 35758 bytes 6 files changed, 309 insertions(+) create mode 100644 examples/shaders/resources/shaders/glsl330/cel.fs create mode 100644 examples/shaders/resources/shaders/glsl330/cel.vs create mode 100644 examples/shaders/resources/shaders/glsl330/outline_hull.fs create mode 100644 examples/shaders/resources/shaders/glsl330/outline_hull.vs create mode 100644 examples/shaders/shaders_cel_shading.c create mode 100644 examples/shaders/shaders_cel_shading.png diff --git a/examples/shaders/resources/shaders/glsl330/cel.fs b/examples/shaders/resources/shaders/glsl330/cel.fs new file mode 100644 index 000000000..435f6fb7d --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/cel.fs @@ -0,0 +1,60 @@ +#version 330 + +in vec3 fragPosition; +in vec2 fragTexCoord; +in vec4 fragColor; +in vec3 fragNormal; + +// Raylib standard uniforms +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// View position for future specular / fresnel use. +uniform vec3 viewPos; + +// Number of discrete toon bands (2 = hard binary, 10 = default, 20 = near-smooth). +uniform float numBands; + +// rlights.h compatible light block. +struct Light { + int enabled; + int type; // 0 = directional, 1 = point + vec3 position; + vec3 target; + vec4 color; + float attenuation; +}; +uniform Light lights[4]; + +out vec4 finalColor; + +void main() { + vec4 texColor = texture(texture0, fragTexCoord); + vec3 baseColor = texColor.rgb * fragColor.rgb * colDiffuse.rgb; + vec3 norm = normalize(fragNormal); + + float lightAccum = 0.08; // ambient floor + + for (int i = 0; i < 4; i++) { + if (lights[i].enabled == 0) continue; + + vec3 lightDir; + if (lights[i].type == 0) { + // Directional: direction is from position toward target. + lightDir = normalize(lights[i].position - lights[i].target); + } else { + // Point: direction from surface to light. + lightDir = normalize(lights[i].position - fragPosition); + } + + float NdotL = max(dot(norm, lightDir), 0.0); + + // Quantize NdotL into numBands discrete steps. + // min() guards against NdotL == 1.0 producing an out-of-range index. + float quantized = min(floor(NdotL * numBands), numBands - 1.0) / (numBands - 1.0); + lightAccum += quantized * lights[i].color.r; + } + + lightAccum = clamp(lightAccum, 0.0, 1.0); + finalColor = vec4(baseColor * lightAccum, texColor.a * colDiffuse.a); +} diff --git a/examples/shaders/resources/shaders/glsl330/cel.vs b/examples/shaders/resources/shaders/glsl330/cel.vs new file mode 100644 index 000000000..813ab8836 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/cel.vs @@ -0,0 +1,25 @@ +#version 330 + +// Raylib standard attributes +in vec3 vertexPosition; +in vec2 vertexTexCoord; +in vec3 vertexNormal; +in vec4 vertexColor; + +// Raylib standard uniforms +uniform mat4 mvp; +uniform mat4 matModel; +uniform mat4 matNormal; + +out vec3 fragPosition; +out vec2 fragTexCoord; +out vec4 fragColor; +out vec3 fragNormal; + +void main() { + fragPosition = vec3(matModel * vec4(vertexPosition, 1.0)); + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + fragNormal = normalize(vec3(matNormal * vec4(vertexNormal, 0.0))); + gl_Position = mvp * vec4(vertexPosition, 1.0); +} diff --git a/examples/shaders/resources/shaders/glsl330/outline_hull.fs b/examples/shaders/resources/shaders/glsl330/outline_hull.fs new file mode 100644 index 000000000..c8a33de08 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/outline_hull.fs @@ -0,0 +1,7 @@ +#version 330 + +out vec4 finalColor; + +void main() { + finalColor = vec4(0.05, 0.05, 0.05, 1.0); +} diff --git a/examples/shaders/resources/shaders/glsl330/outline_hull.vs b/examples/shaders/resources/shaders/glsl330/outline_hull.vs new file mode 100644 index 000000000..4a3dafdce --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/outline_hull.vs @@ -0,0 +1,15 @@ +#version 330 + +in vec3 vertexPosition; +in vec3 vertexNormal; +in vec2 vertexTexCoord; +in vec4 vertexColor; + +uniform mat4 mvp; +uniform float outlineThickness; + +void main() { + // Extrude vertex along its normal to create the hull. + vec3 extruded = vertexPosition + vertexNormal * outlineThickness; + gl_Position = mvp * vec4(extruded, 1.0); +} diff --git a/examples/shaders/shaders_cel_shading.c b/examples/shaders/shaders_cel_shading.c new file mode 100644 index 000000000..6dfcc7321 --- /dev/null +++ b/examples/shaders/shaders_cel_shading.c @@ -0,0 +1,202 @@ +/******************************************************************************************* +* +* raylib [shaders] example - cel shading +* +* Example complexity rating: [★★★☆] 3/4 +* +* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support, +* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version +* +* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3) +* +* Example contributed by Gleb A (@ggrizzly) +* +* 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) 2015-2026 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" +#include "raymath.h" +#include "rlgl.h" +#include +#include + +#define RLIGHTS_IMPLEMENTATION +#include "rlights.h" + +#if defined(PLATFORM_DESKTOP) + #define GLSL_VERSION 330 +#else // PLATFORM_ANDROID, PLATFORM_WEB + #define GLSL_VERSION 100 +#endif + +//------------------------------------------------------------------------------------ +// Model table: path, optional diffuse texture path (NULL = embedded), draw scale +//------------------------------------------------------------------------------------ +typedef struct { + const char *modelPath; + const char *texturePath; // NULL for GLB files with embedded textures + float scale; + float outlineThickness; +} ModelInfo; + +static const ModelInfo MODEL = { "resources/models/old_car_new.glb", NULL, 0.75f, 0.005f }; + + +//------------------------------------------------------------------------------------ +// Load model and its diffuse texture (if any). Does NOT assign a shader. +//------------------------------------------------------------------------------------ +static Model celLoadModel() +{ + Model model = LoadModel(MODEL.modelPath); + + if (MODEL.texturePath != NULL) + { + Texture2D tex = LoadTexture(MODEL.texturePath); + model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = tex; + } + + return model; +} + +static void ApplyShaderToModel(Model model, Shader shader) +{ + model.materials[0].shader = shader; +} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + SetConfigFlags(FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "raylib [shaders] example - cel shading"); + + Camera camera = { 0 }; + camera.position = (Vector3){ 9.0f, 10.0f, 9.0f }; + camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; + camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; + camera.fovy = 45.0f; + camera.projection = CAMERA_PERSPECTIVE; + + // Load cel shader + Shader celShader = LoadShader(TextFormat("resources/shaders/glsl%i/cel.vs", GLSL_VERSION), + TextFormat("resources/shaders/glsl%i/cel.fs", GLSL_VERSION)); + celShader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(celShader, "viewPos"); + + // numBands: controls toon quantization steps (2 = hard binary, 20 = near-smooth) + float numBands = 10.0f; + int numBandsLoc = GetShaderLocation(celShader, "numBands"); + SetShaderValue(celShader, numBandsLoc, &numBands, SHADER_UNIFORM_FLOAT); + + // Inverted-hull outline shader: draws back faces extruded along normals + Shader outlineShader = LoadShader( + TextFormat("resources/shaders/glsl%i/outline_hull.vs", GLSL_VERSION), + TextFormat("resources/shaders/glsl%i/outline_hull.fs", GLSL_VERSION)); + int outlineThicknessLoc = GetShaderLocation(outlineShader, "outlineThickness"); + + // Single directional white light, angled so toon bands are visible on the model sides. + // Spins opposite to CAMERA_ORBITAL (0.5 rad/s) so lighting changes as you watch. + Light lights[MAX_LIGHTS] = { 0 }; + lights[0] = CreateLight(LIGHT_DIRECTIONAL, (Vector3){ 5.0f, 5.0f, 0.0f }, Vector3Zero(), WHITE, celShader); + + + bool celEnabled = true; + bool outlineEnabled = true; + + Model model = celLoadModel(); + Shader defaultShader = model.materials[0].shader; + ApplyShaderToModel(model, celShader); + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) + { + // Update + //---------------------------------------------------------------------------------- + UpdateCamera(&camera, CAMERA_ORBITAL); + + float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z }; + SetShaderValue(celShader, celShader.locs[SHADER_LOC_VECTOR_VIEW], cameraPos, SHADER_UNIFORM_VEC3); + + // [Z] Toggle cel shading on/off + if (IsKeyPressed(KEY_Z)) + { + celEnabled = !celEnabled; + ApplyShaderToModel(model, celEnabled ? celShader : defaultShader); + } + + // [C] Toggle outline on/off + if (IsKeyPressed(KEY_C)) outlineEnabled = !outlineEnabled; + + // [Q/E] Decrease/increase toon band count (press or hold to repeat) + if (IsKeyPressed(KEY_E) || IsKeyPressedRepeat(KEY_E)) numBands = Clamp(numBands + 1.0f, 2.0f, 20.0f); + if (IsKeyPressed(KEY_Q) || IsKeyPressedRepeat(KEY_Q)) numBands = Clamp(numBands - 1.0f, 2.0f, 20.0f); + SetShaderValue(celShader, numBandsLoc, &numBands, SHADER_UNIFORM_FLOAT); + + // Spin light opposite to CAMERA_ORBITAL (0.5 rad/s), angled 45 degrees off vertical + float t = (float)GetTime(); + lights[0].position = (Vector3){ + sinf(-t * 0.5f) * 5.0f, + 5.0f, + cosf(-t * 0.5f) * 5.0f + }; + + for (int i = 0; i < MAX_LIGHTS; i++) UpdateLightValues(celShader, lights[i]); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + BeginMode3D(camera); + + if (outlineEnabled) + { + // Outline pass: cull front faces, draw extruded back faces as silhouette + float thickness = MODEL.outlineThickness; + SetShaderValue(outlineShader, outlineThicknessLoc, &thickness, SHADER_UNIFORM_FLOAT); + rlSetCullFace(RL_CULL_FACE_FRONT); + ApplyShaderToModel(model, outlineShader); + DrawModel(model, Vector3Zero(), MODEL.scale, WHITE); + ApplyShaderToModel(model, celEnabled ? celShader : defaultShader); + rlSetCullFace(RL_CULL_FACE_BACK); + } + + DrawModel(model, Vector3Zero(), MODEL.scale, WHITE); + DrawSphereEx(lights[0].position, 0.2f, 10, 10, YELLOW); // Light position indicator + DrawGrid(20, 1.0f); + + EndMode3D(); + + DrawFPS(10, 10); + DrawText(TextFormat("Cel: %s [Z]", celEnabled ? "ON" : "OFF"), 10, 65, 20, celEnabled ? DARKGREEN : DARKGRAY); + DrawText(TextFormat("Outline: %s [C]", outlineEnabled ? "ON" : "OFF"), 10, 90, 20, outlineEnabled ? DARKGREEN : DARKGRAY); + DrawText(TextFormat("Bands: %.0f [Q/E]", numBands), 10, 115, 20, DARKGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadModel(model); + UnloadShader(celShader); + UnloadShader(outlineShader); + CloseWindow(); + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/examples/shaders/shaders_cel_shading.png b/examples/shaders/shaders_cel_shading.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca6ab5708014234f67fc293f907a88b476c8f29 GIT binary patch literal 35758 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%0D_$%_fT6}2DtsV;f^NqX{x+#{sdu8T2O1R3b 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 HoD!M