Umbra Soft Shadows · Troubleshooting & FAQ
Yes. All Kronnect assets are fully compatible with Unity 6. The minimum supported version is Unity 2022.3 LTS, and this includes Unity 6 and any newer releases.
No. Umbra Soft Shadows is designed exclusively for the Universal Render Pipeline (URP). Built-in and HDRP are not supported.
Yes. Umbra integrates with Unity's real-time directional light shadow system. Soft shadows apply to all objects — static and dynamic — the same way standard Unity shadows do.
Yes. Umbra respects all URP shadow settings including bias, normal bias, and cascade splits. The Advanced section provides Cascade Scales and Blend Cascades for additional control over cascade transitions.
Impact varies with settings. The main cost drivers are Sample Count and Occluders Count (when Contact Hardening is enabled). See Performance Tips for optimization strategies.
Yes. Sample _ScreenSpaceShadowMapTexture in screen-space coordinates. Values range from 0 (fully shadowed) to 1 (fully lit).
Yes. Enable Transparent Receiver Plane in the Advanced section and place a plane using the included Transparent Floor material or ShadowReceiverTransparent shader. See the Demo Transparent Receiver scene for an example.
Use UmbraProfile ScriptableObjects for each quality tier and assign them at runtime via UmbraSoftShadows.instance.profile = yourProfile;. See Scripting Support for full API details.
Umbra uses screen-space shadow resolution, which can provide performance improvements in complex scenes with lots of geometry. However, it uses more samples than standard PCF shadows, so it may be slower in simple scenes, though the difference is often barely noticeable on PC depending on settings like sample count and blur iterations.
The shadow caster pass is still executed, but the shadow resolve is replaced by Umbra's calculation. In regular Unity shadows, the shadowmap can be sampled many times per pixel for soft shadows. With Umbra enabled, shaders only sample once from the screen space shadow texture generated by Umbra, eliminating those multiple samples. Umbra performs its own work instead, but this is generally more efficient. Check the guides for optimization options like loop and frame skipping.
Umbra enables the _MAIN_LIGHT_SHADOWS_SCREEN keyword in URP. To access the softened shadows in your custom shader, use the URP shadows API and call MainLightRealtimeShadow(shadowCoord), passing the screen space UV as (uv.x, uv.y, 0, 1) to shadowCoord. This will retrieve the soft shadows from the global _ScreenSpaceShadowmapTexture that Umbra generates.
Contact shadows have two operation modes: 'shadow texture' mode renders them into the same shadow texture and they are affected by shadow distance (good for close details), and 'after opaque' mode which limits them to the camera far clip plane (suitable for large distances). Use 'after opaque' mode for far distance shadows to avoid the expense of rendering shadows across the entire 1000 unit distance.
Umbra Soft Shadows only supports one directional light instance per scene at this time. When switching between multiple directional lights (like a sun/moon system), the shadows will not render correctly on the newly enabled light without manually toggling the Umbra Soft Shadows component on and off.
The flickering is likely caused by shaders not properly supporting screen space shadows, which is common with shaders created using Amplify Shaders. Check the FAQ guide at https://kronnect.com/guides/umbra-soft-shadows-faq/ for a workaround. If the issue persists, contact the asset author to report compatibility issues.
Use the Contact Hardening option set to 0.7 or 0.9, and increase the distance spread parameter. Set blur to 0 for better results. This creates the effect where shadows are strong near the object and soften with distance.
Objects using incompatible shaders will fall back to regular URP shadows instead of Screen Space Shadows. Verify the object is using a compatible shader (like SimpleLit) and that the required shader keywords are included in your shader variant collection.
There are two main reasons: (1) Capturing variables in lambdas causes GC allocation, and (2) In Render Graph, capturing variables in the SetRenderFunc lambda breaks Render Graph compilation caching, which incurs additional CPU cost each frame. Instead, refer to the PassData passed in as a lambda parameter rather than capturing it from the outer scope.
Go to the Directional Light settings, navigate to Shadows, and increase the Depth Bias value to around 8. This should reduce the flickering caused by TAA interaction with the shadows.
You can disable _SHADOWS_SOFT, _SHADOWS_SOFT_LOW, _SHADOWS_SOFT_MEDIUM, _SHADOWS_SOFT_HIGH, _REFLECTION_PROBE_BOX_PROJECTION, _REFLECTION_PROBE_BLENDING, MAIN_LIGHT_SHADOWS, and MAIN_LIGHT_SHADOWS_CASCADE. However, you must keep _MAIN_LIGHT_SHADOWS_SCREEN enabled when using Umbra, as it is required for the soft shadows to work properly.
Jagged edges can be reduced by disabling MSAA on the URP asset and using the blur and edge preserve options in Umbra settings. Flickering shadows at edges while moving the camera can be caused by the Frame Skip Optimization setting - disable it if you experience this issue.
Umbra works in screen space by resolving world space pixel positions from depth. MSAA samples multiple positions around pixel centers, and some of those positions may or may not match the sampling depth. This causes some samples to be under shadows while others are not, resulting in jagged shadow differences along edges. Using blur and edge preserve options can help mitigate this, though it may not be perfect.
Help us improve this documentation page.