 1141e731ff
			
		
	
	
		1141e731ff
		
			
		
	
	
	
	
		
			
			[Alpha to coverage] (A2C) replaces alpha blending with a hardware-specific multisample coverage mask when multisample antialiasing is in use. It's a simple form of [order-independent transparency] that relies on MSAA. ["Anti-aliased Alpha Test: The Esoteric Alpha To Coverage"] is a good summary of the motivation for and best practices relating to A2C. This commit implements alpha to coverage support as a new variant for `AlphaMode`. You can supply `AlphaMode::AlphaToCoverage` as the `alpha_mode` field in `StandardMaterial` to use it. When in use, the standard material shader automatically applies the texture filtering method from ["Anti-aliased Alpha Test: The Esoteric Alpha To Coverage"]. Objects with alpha-to-coverage materials are binned in the opaque pass, as they're fully order-independent. The `transparency_3d` example has been updated to feature an object with alpha to coverage. Happily, the example was already using MSAA. This is part of #2223, as far as I can tell. [Alpha to coverage]: https://en.wikipedia.org/wiki/Alpha_to_coverage [order-independent transparency]: https://en.wikipedia.org/wiki/Order-independent_transparency ["Anti-aliased Alpha Test: The Esoteric Alpha To Coverage"]: https://bgolus.medium.com/anti-aliased-alpha-test-the-esoteric-alpha-to-coverage-8b177335ae4f --- ## Changelog ### Added * The `AlphaMode` enum now supports `AlphaToCoverage`, to provide limited order-independent transparency when multisample antialiasing is in use.
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use bevy_reflect::std_traits::ReflectDefault;
 | |
| use bevy_reflect::Reflect;
 | |
| 
 | |
| // TODO: add discussion about performance.
 | |
| /// Sets how a material's base color alpha channel is used for transparency.
 | |
| #[derive(Debug, Default, Reflect, Copy, Clone, PartialEq)]
 | |
| #[reflect(Default, Debug)]
 | |
| pub enum AlphaMode {
 | |
|     /// Base color alpha values are overridden to be fully opaque (1.0).
 | |
|     #[default]
 | |
|     Opaque,
 | |
|     /// Reduce transparency to fully opaque or fully transparent
 | |
|     /// based on a threshold.
 | |
|     ///
 | |
|     /// Compares the base color alpha value to the specified threshold.
 | |
|     /// If the value is below the threshold,
 | |
|     /// considers the color to be fully transparent (alpha is set to 0.0).
 | |
|     /// If it is equal to or above the threshold,
 | |
|     /// considers the color to be fully opaque (alpha is set to 1.0).
 | |
|     Mask(f32),
 | |
|     /// The base color alpha value defines the opacity of the color.
 | |
|     /// Standard alpha-blending is used to blend the fragment's color
 | |
|     /// with the color behind it.
 | |
|     Blend,
 | |
|     /// Similar to [`AlphaMode::Blend`], however assumes RGB channel values are
 | |
|     /// [premultiplied](https://en.wikipedia.org/wiki/Alpha_compositing#Straight_versus_premultiplied).
 | |
|     ///
 | |
|     /// For otherwise constant RGB values, behaves more like [`AlphaMode::Blend`] for
 | |
|     /// alpha values closer to 1.0, and more like [`AlphaMode::Add`] for
 | |
|     /// alpha values closer to 0.0.
 | |
|     ///
 | |
|     /// Can be used to avoid “border” or “outline” artifacts that can occur
 | |
|     /// when using plain alpha-blended textures.
 | |
|     Premultiplied,
 | |
|     /// Spreads the fragment out over a hardware-dependent number of sample
 | |
|     /// locations proportional to the alpha value. This requires multisample
 | |
|     /// antialiasing; if MSAA isn't on, this is identical to
 | |
|     /// [`AlphaMode::Mask`] with a value of 0.5.
 | |
|     ///
 | |
|     /// Alpha to coverage provides improved performance and better visual
 | |
|     /// fidelity over [`AlphaMode::Blend`], as Bevy doesn't have to sort objects
 | |
|     /// when it's in use. It's especially useful for complex transparent objects
 | |
|     /// like foliage.
 | |
|     ///
 | |
|     /// [alpha to coverage]: https://en.wikipedia.org/wiki/Alpha_to_coverage
 | |
|     AlphaToCoverage,
 | |
|     /// Combines the color of the fragments with the colors behind them in an
 | |
|     /// additive process, (i.e. like light) producing lighter results.
 | |
|     ///
 | |
|     /// Black produces no effect. Alpha values can be used to modulate the result.
 | |
|     ///
 | |
|     /// Useful for effects like holograms, ghosts, lasers and other energy beams.
 | |
|     Add,
 | |
|     /// Combines the color of the fragments with the colors behind them in a
 | |
|     /// multiplicative process, (i.e. like pigments) producing darker results.
 | |
|     ///
 | |
|     /// White produces no effect. Alpha values can be used to modulate the result.
 | |
|     ///
 | |
|     /// Useful for effects like stained glass, window tint film and some colored liquids.
 | |
|     Multiply,
 | |
| }
 | |
| 
 | |
| impl Eq for AlphaMode {}
 |