Cel shading with real lighting data, without post process materials or engine modifications


I discovered how to use real lighting data alongside cel shading in Unreal Engine 5, without needing a post process material or engine modifications.

The gist of the solution is to make your normal PBR material, then use a translucent overlay material to get the lighting data (by dividing scene color by base color scene texture). This gives the "raw" lighting data, which can then be used with if nodes, smoothstep, curves, etc.

This gives more artistic freedom than a post process material, as it can be applied per-mesh instead of to the entire scene. Experiment with custom shadow colors per mesh!

You can find an example overlay material here:

4 Likes

That looks super cool, and what a sick Goku model.

insanely cool!

will add the caveats:

  • unreal 5.1 or greater
  • overlay materials result in an extra draw call for the mesh, so just something to be aware of
  • dynamic exposure will affect scene color

also going to share these images that @WistfulHopes had shared on discord because i think it really helps drive the technique home:

base material

base + overlay material

Hello, Im trying it, but I got stuck with the CurveAtlasRowparameter. which is asking me for a curve and atlas Material expression. how to go about that?

1 Like

Also getting that error, I added a default curve & atlas but wasn't able to replicate the cell effect

Actually, I think I ended up getting it working by adding some constant keys to the curve from near black to white. Interested to see if WistfulHope has a more ideal curve setup?

In any case, the results are great - thank you for sharing!

I seem to be having trouble getting this to work. When I had made the translucent material, and applied it to my character as an overlay material, they appear completely blackened out.

Any possible fixes?

Just to check: you made a basic linear color curve float and applied it to your material?


Also, here's how I currently apply light coloring to the cel shader.

The Point Light node is added to the texture, then the Light node is done with an Overlay blend.

Yea. I have my gradient set up like this

I have my translucent overlay material setup with the blueprint code provided in the link of the original post, and then I assigned my curve to the Curve Atlas Parameter Node. Not sure if I did the right approach, but if I have the material blueprints just like it is in the link in the OP, and use it as the overlay material, my character gets blacked out.

And with those named reroutes nodes for applying the lights to the cel shader, I'm not entirely sure how to apply them. Are those just part of the overlay material and I plug them into one of the outputs, or am I supposed to make a material function to carry these reroutes to my base cel shader?

I might be overcomplicating things lmao

Well, I am a dingus and didn't understand the setup at the time LMAO. Now I got it to work and it looking amazing.

I do have one question though: how do I approach decals that have different materials?

FighterZ models like this one have decals on the face that appears to be on a different material slot. I tried applying the decal texture by using the texture coordinate node but that doesn't work. How could I fix this?

1 Like

Congrats, it looks good.
I'm trying to do it too, can you give some more details?

Made a huge upgrade to the material, here it is:

The first link is the material, the second link is a material function the main material depends on.

Screenshot below:

1 Like

Also, if you have multiple materials that all need to be cel shaded, you can do the following:

  • Duplicate all cel shaded parts of your model, and assign it to one material slot before all other materials. This will be your "pure white" PBR material.
  • Instead of setting an overlay material, set the individual material slots to be cel shaded.

This has the same effect as the overlay material system, but is more flexible.

1 Like