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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