Simple Opacity
On this page
Overview
“Simple Opacity” is a non-standard way of rendering elements with applied opacity
. At the cost of a changed visual result, Prysm can render transparent elements without needing separate textures and thus saves GPU memory as well as some CPU performance. When the simple opacity is enabled, the transparency from the opacity
property will be applied to the colors of all child elements. In this case, Prysm won’t need to create temporary textures where the transparent content has to be rendered separately. This leads to a reduced GPU memory footprint when the temporary textures are created only to render the transparent content. For more details, see the note in the next section of the documentation.
With Standard Opacity the opacity is applied to the whole hierarchy and the colors are preserved. With Simple Opacity the colors of the individual elements are blended. In the example below, we end up with purple where the red and blue overlap each other.
Standard Opacity
Simple Opacity
How to use
The simple Opacity can be activated on a per-element basis with the coh-simple-opacity: on
CSS property. The property value is not inherited. The coh-simple-opacity
property makes sense only for elements with the opacity
property. There is also a way to enable the simple opacity globally with the cohtml::ViewSettings::EnableGlobalSimpleOpacity
setting for the cohtml::View
. For more details, see the Property section
For best performance you can enable the feature globally with the cohtml::ViewSettings::EnableGlobalSimpleOpacity
setting and then turn it off for specific elements with coh-simple-opacity: off
when needed.
Details
Prysm supports the standard opacity
CSS property and renders content with applied opacity according to the web standards. This standard rendering, however, comes with some disadvantages. Every time an element in the DOM uses the opacity
property, Prysm has to render all of its contents to a separate texture and then draw the rasterized content “together” using the given opacity. The idea behind this is that the transparent element and all of its children are treated as a separate wholistic image and the transparency is applied to this image and not its individual elements. This can potentially lead to the allocation of many temporary GPU textures.
A typical case of opacity
is fading in some big hierarchy of DOM elements.
Simple Opacity
With the Simple Opacity feature of Prysm we can avoid the usage of a separate texture when rendering elements with opacity
. If we enable it (with coh-simple-opacity: on
) the value of the opacity
property will be “transferred” to all of the content inside of its hierarchy. The result is equivalent to multiplying the opacity with the alpha value of every color we use to draw the hierarchy. This is non-standard behavior and will result in different visuals. However, under certain circumstances, this can be an acceptable trade-off. For instance, the following animation is the same fade-in as before but with simple opacity enabled:
Note that the Simple Opacity might not necessarily lead to fewer GPU textures needed for an element. The Simple Opacity is relevant only for the cases where the opacity
is the only reason the rendering logic requires GPU textures. The temporary textures are still required, if the element has other effects like
- usage of the
filter
CSS property - usage of the
backdrop-filter
CSS property - usage of the
mix-blend-mode
CSS property isolation: isolate
- uses custom effects or goes through the Prysm’s Compositor flow.
Property
The coh-simple-opacity
controls whether the simple opacity is enabled for a given element. The property is non-inherited and can have the following values:
on
– forces simple opacity for the element.off
– forces standard opacity for the element.auto
(default) – the simple opacity will be enabled based on the providedcohtml::ViewSettings::EnableGlobalSimpleOpacity
during the initialization of thecohtml::View
The cohtml::ViewSettings::EnableGlobalSimpleOpacity
setting is there to provide an easy way of enabling global simple opacity where all elements with opacity
will be rendered with simple opacity unless coh-simple-opacity: off
is specified.