Cel → PBR
Shader Evolution

Post Process ShaderPBRUnreal Engine 5

A shader that started as cel and became something else — this page documents not just what I built, but why the aesthetic direction shifted mid-project and what that decision-making process looked like.

Curing Corruption gameplay — cel shader and PBR iteration in use

When the aesthetic stopped fitting

Curing Corruption started with a cel-shaded look — flat colour bands, hard shadow edges, hand-drawn feel. The shader worked technically, but as the game's environment developed the flat shading started to fight the lighting. The team decided the world needed more physical weight. That meant rebuilding the shader around a physically-based rendering approach instead.

No shader → Cel → PBR

No post process
Cel shader
PBR iteration
No post process
swipe or drag to compare

Same scene — three rendering states showing the aesthetic shift

How the cel shader worked

  • Diffuse banding — scene colour channel isolated into fixed value bands to create flat toon shading; blendable location set to "scene color before DOF" to reduce shadow jitter
  • Threshold stepping — instead of smooth gradients, light values snapped to discrete stops giving the characteristic cel look
  • PBR iteration — the rebuilt version removed banding and worked with UE5's physically-based material pipeline directly, preserving roughness and metallic channels
Cel Shader Blueprint drag to pan · scroll to zoom

What this taught me

The interesting part wasn't the shader math — it was learning that a technically correct shader can still be the wrong choice. The cel version wasn't broken. It just stopped serving the game. Rebuilding it as PBR was a design decision as much as a technical one, and making that call mid-project taught me to think about shaders in terms of what the scene needs, not just what the technique can do.

Research Question

How do aesthetic commitments in real-time rendering interact with iterative game development — and at what point does a technically sound shader become the wrong tool for the project?