Impeller currently supports the same set of blending operations that Skia supports. Internally, Impeller distinguishes between two different kinds of blend modes: Those which can be performed using the raster pipeline blend configuration (called "Pipeline Blends"), and those which cannot (called "Advanced Blends").
All blend modes conform to the W3C Compositing and Blending recommendation.
Blend operations are driven by the BlendMode
enum. In the Aiks layer,
all drawing operations conform to the given Paint::blend_mode
. In the Entities
layer, all Entities have an associated blend mode, which can be set via
Entity::SetBlendMode(BlendMode)
.
Term | Definition |
---|---|
Source color | Any color that is output by a fragment shader. |
Destination color | The backdrop color in a blend operation. |
Premultiplied color | A color that has its alpha multiplied into it. Used for additive blending operations as well as colors presented to a surface. |
Porter-Duff alpha composite | One of several operations that add together a source color and destination color, with both the source and destination colors being multiplied by respective alpha factors. |
Pipeline blend | A blend mode that Impeller can always implement by using the raster pipeline blend configuration provided by the underlying graphics backend. Most of these are simple Porter-Duff alpha composites. |
Advanced blend | A blend mode that Impeller computes using a fragment program. |
In Impeller, all blending source colors are assumed to be premultiplied for the purpose of blending. This means that all Entity shaders must output colors with premultiplied alpha. In general, these shaders also assume that sampled textures and uniform color inputs are premultiplied.
The reason for this is that it enables us to implement all of the Porter-Duff alpha composites using the built-in raster pipeline blend configuration offered by all major graphics backends.
Most of the pipeline blends are actually Porter-Duff alpha composites, which add together the source color and destination color -- both the source and destination colors are multiplied by an alpha factor which determines the behavior of the blend.
Pipeline blends are always cheap and don't require additional draw calls to render.
Pipeline blend |
---|
Clear |
Source |
Destination |
SourceOver |
DestinationOver |
SourceIn |
DestinationIn |
SourceOut |
DestinationOut |
SourceATop |
DestinationATop |
Xor |
Plus |
Modulate |
Advanced blends are blends that Impeller can't always implement using the built-in raster pipeline blend configuration offered by graphics backends. Instead, they're implemented using special blend shaders that bind the backdrop texture in a separate render pass.
Note that all of the advanced blends are color blends rather than alpha composites, and they can technically be combined with any pipeline blend with predictable compositing behavior. However, in order to keep in line with Flutter's (and Skia's) current behavior, Impeller uses Source Over compositing when rendering all advanced blends.
Advanced blends are expensive when compared to pipeline blends (which are essentially free) for the following reasons:
- For each advanced blend, the current render pass ends because the backdrop texture needs to be sampled.
- A potentially large texture (the render pass backdrop) is sampled. Although in practice, just the coverage rectangle of the source being blended is actually used.
- An intermediary texture is allocated for the blend output before being blitted back to the render pass texture.
Advanced blend |
---|
kScreen |
Overlay |
Darken |
Lighten |
ColorDodge |
ColorBurn |
HardLight |
SoftLight |
Difference |
Exclusion |
Multiply |
Hue |
Saturation |
Color |
Luminosity |