Humanoids No Longer Force Shadow Casting

I just noticed this bug today when working on a custom character. Normally, Humanoids force transparent BaseParts to cast shadows in its parent Model, but this is no longer the case.

This happens in studio in both ShadowMap and Voxel mode. Joined a few games and seems to happen there as well on all graphics settings levels.

The main result of this is the character not casting shadows in first person.

That’s not a bug, it’s a long-standing side effect of the old lighting system that had special-case shadows intended for player characters only. Developers abused this to get shadows on other things by parenting humanoids to them, but it’s always been understood that this was not a supported, future-proof use case. The new ShadowMap system correctly handles transparent parts and player characters are no longer a special case.

In first-person, you don’t see your own character’s shadow because Roblox’s camera scripts (the TransparencyController in particular) make your character transparent on your machine only, with LocalTransparencyModifier = 1. If you disable this, you’d see the shadow of your own character, but you’d possibly also see bits of your character from the inside. So even this isn’t exactly a bug, it’s just the consequence of hiding the character.

Characters not casting shadows in first person is a bug though and it is linked to this being the way the new system handles them. Also, characters are still a special case as any model with a Humanoid inside will cast shadowmap based shadows even in Voxel mode.

To restore that behavior, there needs to be a way to make a part opaque during the shadow map rendering pass, but transparent during the scene render. This is currently not possible with LocalTransparencyModifier. It’s not a simple bug fix, it requires a new transparency type, or a change to how CastsShadow works on locally-transparent parts (probably not an option, because it would change existing games).

Or a simple property like IgnoreTransparency.

Do games use LocalTransparencyModifier much? My understanding is that it’s mainly used by our camera script, for first person and invisicam.

I use it a lot in my custom LOD module to hide characters and tools.

Hiding things temporarily without needing to cache the previous Transparency value.