Long Shadow Filter Component
Overview
This component adds a visual shadow effect to the UI object it is applied to.
WebGL Demo
Properties
Property | Type | Details |
---|---|---|
Distance | ||
Method | Enum | Which rendering method to use. Options are: • Normal - This is best for shorter shadows, it's high quality but can become very slow for shadows with a high Distance value. (DEFAULT)• DistanceMap - This is very fast for shadows with a high Distance value, but the quality of the edge is not as high as the Normal method. |
Long Shadow | ||
Angle | Float | The angle that shadow is cast in degrees. Default value is 135, range is [0..360]. |
Distance | Float | The distance in pixels that the shadow is cast. Default value is 32, range is [-1024..1024]. |
Step Size | Float | The number of pixels to step over, it can be used to create a more pixel-art style. Default is 1.0, range is [0..64]. |
Color Front | Color | The front color of the shadow. |
Use Back Color | Bool | Whether to use the back color. If disabled the shadow will just be a single color. If enabled the shadow will have a front and back color with the gradient between the two. |
Color Back | Color | The back color of the shadow. |
Pivot | Float | The pivot can be used for animating the shadow. A value of -1 means the front is located at the position of the back. A value of 0.0 means the front and back are at their furthest distance apart. A value of 1.0 means the back is located at the position of the front. Range is [-1..1]. Default is 0.0 |
Apply | ||
Source Alpha | Float | Fades the source Graphic. Default value is 1.0, range is [0..1] |
Mode | Enum | Which mode to use when compositing the shadow. Options are: • Normal - Long shadow is composited behind the source graphic. (DEFAULT)• Cutout - Shadow is rendered with the source graphic cut out from it.• Shadow - Only the shadow is rendered. |
Strength | Float | Strength of the effect. Default value is 1.0, range is [0..1] |
Render Space | Enum | Which coordinate system use when rendering this filter. Options are: • Canvas : Render the filter before any transforms (scale/rotation/translation etc) are applied.• Screen : Render the filter after transforms have been applied. Read more about this property here. |
Expand | Enum |
Usage
Add this component to any GameObject
that contains a UI Graphic
component (eg Text
, Image
, RawImage
, etc). The object will now render with a long shadow.
Usage with TextMeshPro
To use this filter effect with TextMeshPro
use the Filter Stack (TextMeshPro) component.
Render Space
The RenderSpace
property effectively controls whether the filter is rendered before or after the Transform
is applied. There are two options:
Canvas
- This is the default mode for all filters. In this mode the filter is rendered to theGraphic
before it is transformed into screen-space by the localTransform
and by theCanvas
. This means that any changes or animations to the transform (or it's parents) will not cause the filter to re-render (unlessCanvas
has pixel-perfect mode enabled), which is a performance benefit! This also means that when theGraphic
is rotated, the filter will not be aware of this, so the filter will rotate as well.Screen
- This was the default mode before version 1.8.0 was released. In this mode the filter is rendered to theGraphic
after it is transformed into screne-space. This means that any changes or animations to the transform (or it's parents) will cause the filter to re-render which can become expensive. It has the advantage that it is possible to do some screen-aware options, such as clamping the filter to the edges of the screen, or extending an edge to the edge of the screen (for example in the Frame Filter component)
RenderSpace Rotation Example
In the above example you can see that Canvas
RenderSpace renders the filters before the transforms are applied, so the drop shadow offset rotates with text and it is only rendered once which is good for performance. In the Screen
RenderSpace the filter is rendered after the transform is applies, so the drop shadow offset is not affected by the transform (both situations are valid depending on the use-case), however each time the transform is updated the filter must render which is more expensive.
RenderSpace Scaling Example
Again in this example we can see that transform affects how often the filters are rendered. This example also shows how scaling looks in the two RenderSpace
modes. In Canvas
mode the scaling transform is applied after the filter, so the drop shadow distance appears to scale naturally. In the Screen
mode, the scaling transform is applied before the filter, so the filter is using unscaled distance values so the drop shadow offset appears incorrect when scaled as the properties are in screen-space. This is also why the FilterStackTextMeshPro component has the Relative To Transform Scale
property.
RenderSpace Canvas Example
In Unity it is common to use the Canvas Scaler
component to allow the UI to scale to fit different device resolutions. UIFX supports this, but there are some subtle differences depending on the RenderSpace
mode used. If you don't use the Canvas Scaler
component, or your device resolution is the same as the Canvas Scaler
reference resolution, then UIFX will render the filters at the same resolution in both Canvas
and Screen
RenderSpace modes. If however your device resolution is lower than the reference resolution (eg reference is 1080p but your device is 720p), then Canvas
mode will still render the filter at the same resolution before, but Screen
mode will render it at half the resolution. This means Screen
mode will use less texture memory and will be faster. If your device resolkution is higher than the reference resolution (eg reference is 1080p but your device is 4K), then Canvas
mode will still render the filter at the same resolution as before, but Screen
mode will render at double the resolution. This means Screen
mode will use double the texture memory compared to Canvas
, however it also means that Screen
will give slightly better quality results.
For example if you have reference resolution on the Canvas Scaler
set to 1920x1080 and you have a UI text object is 400x200 on the screen with a filter applied to it:
- if your output resolution is 1920x1080, UIFX will render the filters at 400x200.
- if your output resolution is 3840x2160, UIFX will render the filter at 400x200 if it's in
Canvas
mode because the object is still 400x200 relative to the renference resolution - but inScreen
mode it will render it at 800x400 because that is the size it will be on the screen. - if your output resolution is 1280x720, UIFX will render the filter at 400x200 if it's in
Canvas
mode because the object is still 400x200 relative to the renference resolution - but inScreen
mode it will render it at 266x133 because that is the size it will be on the screen.
Summary
A summary of the differences:
Feature | Canvas | Screen |
---|---|---|
Adjusting local/parent transforms causes filter re-render | No (unless Canvas has pixel-perfect mode enabled) | Yes |
In WorldSpace Canvas adjusting camera transform causes filter re-render | No | Yes |
Best performance when using ScrollRect | Yes | No |
Filter offset/direction properties affected by rotation | Yes | No |
Filter offset/direction properties affected by scale | Yes | No |
Filter rendering resolution scales with screen resolution | No | Yes |
In general, Canvas
is usually the best option in terms of balance between performance, memory usage and functionlity. If you need higher quality rendering because you are targeting higher resolution devices than your reference resolution (on Canvas Scaler
component), then use Screen
mode. If you need the filter offset/direction properties to always run in screen-space (ie not be affected by rotation or other transforms), then use Screen
mode.