This was my attempt at stylized rendering in Unity. I wanted to recreate that soft, childish Kirby look - like something a kid drew with crayons. The goal was to find a style I liked and try to copy it, and Kirby felt perfect for that. I'm really happy with how it turned out, even though it looks simple on the surface. I wrote all the rendering code myself to really understand how Unity's pipeline works.

The base of the look is a custom toon shader with hatching-style shading. I'm using line patterns instead of solid shadow colors to give it that hand-drawn feel. The shader supports both directional and point lights, which was important for getting nice rim lighting and colored light effects.

Directional light + hatching

Point light support
URP doesn't give you shadow support out of the box for unlit shaders, so I had to write custom functions to make shadows work. The real challenge was supporting multiple spotlights - each one needed its own shadow map. I went deep into Unity's lighting pipeline to figure out how to sample shadow maps correctly and blend multiple light sources.

Hatched shadows with custom sampling
For the stars in the background, I used inverted hull rendering to get those thick, colored outlines. It's a classic technique - you render the back faces of the mesh, push them out along the normals, and color them. I set this up as a separate render pass using URP's Render Objects feature with a dedicated layer mask.

Cyan and yellow stars with inverted hull outlines
I wrote my own rendering pipeline for the outlines using the Sobel edge detection algorithm. I actually implemented two types:
Combining both gives you that complete hand-drawn outline look where you get both silhouettes and internal details.
To get that crackling crayon texture, I used a lot of procedural noise. I added noise to the outlines to make them wobbly and imperfect, like they were drawn by hand. The white smudge effect and animated background also use noise with tiling and offset controls.

Watercolor smudge material in action
Note: I used procedural noise to save time during development, but I wouldn't recommend it for production. Textures perform way better and are basically free - you can generate them easily. My goal here was just to nail the rendering look, not optimize for shipping.
To pull all this off, I had to stack a ridiculous amount of URP Renderer Features. Each effect needed its own render pass at the right point in the pipeline:

The full render feature stack
I grabbed an external Kirby model online to save time, but I had to edit it. The original was very low-poly, which caused shadow aliasing issues - you'd see stair-stepping artifacts on the shadows. I had to add more vertices and refine the geometry to get clean shadow edges.
It looks simple, but I wrote everything myself. Custom shadow functions, custom render passes, custom materials. I really wanted to understand how Unity's rendering pipeline works under the hood, and this project forced me to dig deep into all of it.
Unity
URP
HLSL
Shaders
C#
Render Features
Blender
Model edits