I mean, you can do stuff like mask out whatever pixel is hit in a certain way by the light (dot product, limit the result range to something) and filter the final value of it out by a multiply or lerping a color or whatever else you think.
But to be able to properly shade shadows you’d need to know about the light vector at each pixel to do it this way.
And you don’t really.
Even with an MPC and youd need a ray trace or a value for each mesh quad.
First you’d essentially be replicating how ray tracing works, second, you’d be doing it on a single object which is cheaper, but manually and in a non optimized way (material shaders vs .usf) which is slower.
The shader can know about self shadowing, at least in theory.
Comparing the light vector to the vertex normal gives you an idea of what side should be darker.
So long as you know that’s just an idea…
And that it doesnt really mean your mesh is not in the shade of something else already…