| # Color blending |
| |
| Impeller currently supports the same set of blending operations that |
| [Skia](https://api.skia.org/SkBlendMode_8h.html#ad96d76accb8ff5f3eafa29b91f7a25f0) |
| 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](https://www.w3.org/TR/compositing-1/). |
| |
| 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)`. |
| |
| ## Glossary of blending terms |
| | 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. | |
| |
| ## Premultiplied colors |
| |
| 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. |
| |
| ## Pipeline blends |
| |
| 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 |
| |
| 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 | |