pub struct Bloom {
pub intensity: f32,
pub low_frequency_boost: f32,
pub low_frequency_boost_curvature: f32,
pub high_pass_frequency: f32,
pub prefilter: BloomPrefilter,
pub composite_mode: BloomCompositeMode,
pub max_mip_dimension: u32,
pub uv_offset: f32,
}
Expand description
Applies a bloom effect to an HDR-enabled 2d or 3d camera.
Bloom emulates an effect found in real cameras and the human eye, causing halos to appear around very bright parts of the scene.
See also https://en.wikipedia.org/wiki/Bloom_(shader_effect).
§Usage Notes
Bloom is currently not compatible with WebGL2.
Often used in conjunction with bevy_pbr::StandardMaterial::emissive
for 3d meshes.
Bloom is best used alongside a tonemapping function that desaturates bright colors,
such as crate::tonemapping::Tonemapping::TonyMcMapface
.
Bevy’s implementation uses a parametric curve to blend between a set of blurred (lower frequency) images generated from the camera’s view. See https://starlederer.github.io/bloom/ for a visualization of the parametric curve used in Bevy as well as a visualization of the curve’s respective scattering profile.
Fields§
§intensity: f32
Controls the baseline of how much the image is scattered (default: 0.15).
This parameter should be used only to control the strength of the bloom for the scene as a whole. Increasing it too much will make the scene appear blurry and over-exposed.
To make a mesh glow brighter, rather than increase the bloom intensity,
you should increase the mesh’s emissive
value.
§In energy-conserving mode
The value represents how likely the light is to scatter.
The value should be between 0.0 and 1.0 where:
- 0.0 means no bloom
- 1.0 means the light is scattered as much as possible
§In additive mode
The value represents how much scattered light is added to the image to create the glow effect.
In this configuration:
- 0.0 means no bloom
- Greater than 0.0 means a proportionate amount of scattered light is added
low_frequency_boost: f32
Low frequency contribution boost. Controls how much more likely the light is to scatter completely sideways (low frequency image).
Comparable to a low shelf boost on an equalizer.
§In energy-conserving mode
The value should be between 0.0 and 1.0 where:
- 0.0 means low frequency light uses base intensity for blend factor calculation
- 1.0 means low frequency light contributes at full power
§In additive mode
The value represents how much scattered light is added to the image to create the glow effect.
In this configuration:
- 0.0 means no bloom
- Greater than 0.0 means a proportionate amount of scattered light is added
low_frequency_boost_curvature: f32
Low frequency contribution boost curve. Controls the curvature of the blend factor function making frequencies next to the lowest ones contribute more.
Somewhat comparable to the Q factor of an equalizer node.
Valid range:
- 0.0 - base intensity and boosted intensity are linearly interpolated
- 1.0 - all frequencies below maximum are at boosted intensity level
high_pass_frequency: f32
Tightens how much the light scatters (default: 1.0).
Valid range:
- 0.0 - maximum scattering angle is 0 degrees (no scattering)
- 1.0 - maximum scattering angle is 90 degrees
prefilter: BloomPrefilter
Controls the threshold filter used for extracting the brightest regions from the input image before blurring them and compositing back onto the original image.
Changing these settings creates a physically inaccurate image and makes it easy to make
the final result look worse. However, they can be useful when emulating the 1990s-2000s game look.
See BloomPrefilter
for more information.
composite_mode: BloomCompositeMode
Controls whether bloom textures
are blended between or added to each other. Useful
if image brightening is desired and a must-change
if prefilter
is used.
§Recommendation
Set to BloomCompositeMode::Additive
if prefilter
is
configured in a non-energy-conserving way,
otherwise set to BloomCompositeMode::EnergyConserving
.
max_mip_dimension: u32
Maximum size of each dimension for the largest mipchain texture used in downscaling/upscaling. Only tweak if you are seeing visual artifacts.
uv_offset: f32
UV offset for bloom shader. Ideally close to 2.0 / max_mip_dimension
.
Only tweak if you are seeing visual artifacts.
Implementations§
Source§impl Bloom
impl Bloom
Sourcepub const NATURAL: Self
pub const NATURAL: Self
The default bloom preset.
This uses the EnergyConserving
composite mode.
Sourcepub const OLD_SCHOOL: Self
pub const OLD_SCHOOL: Self
A preset that’s similar to how older games did bloom.
Sourcepub const SCREEN_BLUR: Self
pub const SCREEN_BLUR: Self
A preset that applies a very strong bloom, and blurs the whole screen.
Trait Implementations§
Source§impl Component for Bloom
impl Component for Bloom
Source§const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::Table
const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::Table
Source§fn register_required_components(
requiree: ComponentId,
components: &mut Components,
storages: &mut Storages,
required_components: &mut RequiredComponents,
inheritance_depth: u16,
)
fn register_required_components( requiree: ComponentId, components: &mut Components, storages: &mut Storages, required_components: &mut RequiredComponents, inheritance_depth: u16, )
Source§fn register_component_hooks(hooks: &mut ComponentHooks)
fn register_component_hooks(hooks: &mut ComponentHooks)
ComponentHooks
.Source§impl ExtractComponent for Bloom
impl ExtractComponent for Bloom
Source§type QueryData = (&'static Bloom, &'static Camera)
type QueryData = (&'static Bloom, &'static Camera)
ReadOnlyQueryData
to fetch the components to extract.Source§type QueryFilter = ()
type QueryFilter = ()
Source§impl FromReflect for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl FromReflect for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self>
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self>
Self
from a reflected value.Source§fn take_from_reflect(
reflect: Box<dyn PartialReflect>,
) -> Result<Self, Box<dyn PartialReflect>>
fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>
Self
using,
constructing the value using from_reflect
if that fails. Read moreSource§impl GetTypeRegistration for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl GetTypeRegistration for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn get_type_registration() -> TypeRegistration
fn get_type_registration() -> TypeRegistration
TypeRegistration
for this type.Source§fn register_type_dependencies(registry: &mut TypeRegistry)
fn register_type_dependencies(registry: &mut TypeRegistry)
Source§impl PartialReflect for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl PartialReflect for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
Source§fn clone_value(&self) -> Box<dyn PartialReflect>
fn clone_value(&self) -> Box<dyn PartialReflect>
Reflect
trait object. Read moreSource§fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError>
fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError>
Source§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
Source§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
Source§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
Source§fn reflect_owned(self: Box<Self>) -> ReflectOwned
fn reflect_owned(self: Box<Self>) -> ReflectOwned
Source§fn try_into_reflect(
self: Box<Self>,
) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
fn try_into_reflect( self: Box<Self>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
Source§fn try_as_reflect(&self) -> Option<&dyn Reflect>
fn try_as_reflect(&self) -> Option<&dyn Reflect>
Source§fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect>
fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect>
Source§fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect>
fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect>
Source§fn as_partial_reflect(&self) -> &dyn PartialReflect
fn as_partial_reflect(&self) -> &dyn PartialReflect
Source§fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect
fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect
Source§fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool>
fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool>
Source§fn apply(&mut self, value: &(dyn PartialReflect + 'static))
fn apply(&mut self, value: &(dyn PartialReflect + 'static))
Source§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
Source§fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Source§fn serializable(&self) -> Option<Serializable<'_>>
fn serializable(&self) -> Option<Serializable<'_>>
Source§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
Source§impl Reflect for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Reflect for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any
. Read moreSource§fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
Source§fn as_reflect(&self) -> &dyn Reflect
fn as_reflect(&self) -> &dyn Reflect
Source§fn as_reflect_mut(&mut self) -> &mut dyn Reflect
fn as_reflect_mut(&mut self) -> &mut dyn Reflect
Source§impl Struct for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Struct for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn field(&self, name: &str) -> Option<&dyn PartialReflect>
fn field(&self, name: &str) -> Option<&dyn PartialReflect>
name
as a &dyn PartialReflect
.Source§fn field_mut(&mut self, name: &str) -> Option<&mut dyn PartialReflect>
fn field_mut(&mut self, name: &str) -> Option<&mut dyn PartialReflect>
name
as a
&mut dyn PartialReflect
.Source§fn field_at(&self, index: usize) -> Option<&dyn PartialReflect>
fn field_at(&self, index: usize) -> Option<&dyn PartialReflect>
index
as a
&dyn PartialReflect
.Source§fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn PartialReflect>
fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn PartialReflect>
index
as a &mut dyn PartialReflect
.Source§fn name_at(&self, index: usize) -> Option<&str>
fn name_at(&self, index: usize) -> Option<&str>
index
.Source§fn iter_fields(&self) -> FieldIter<'_>
fn iter_fields(&self) -> FieldIter<'_>
Source§fn clone_dynamic(&self) -> DynamicStruct
fn clone_dynamic(&self) -> DynamicStruct
DynamicStruct
.Source§fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
None
if TypeInfo
is not available.Source§impl TypePath for Bloom
impl TypePath for Bloom
Source§fn type_path() -> &'static str
fn type_path() -> &'static str
Source§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
Source§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
Source§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
Source§impl Typed for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Typed for Bloomwhere
Bloom: Any + Send + Sync,
f32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomPrefilter: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
BloomCompositeMode: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
u32: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Auto Trait Implementations§
impl Freeze for Bloom
impl RefUnwindSafe for Bloom
impl Send for Bloom
impl Sync for Bloom
impl Unpin for Bloom
impl UnwindSafe for Bloom
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut Components, storages: &mut Storages, ids: &mut impl FnMut(ComponentId), )
unsafe fn from_components<T, F>(ctx: &mut T, func: &mut F) -> C
Source§fn register_required_components(
components: &mut Components,
storages: &mut Storages,
required_components: &mut RequiredComponents,
)
fn register_required_components( components: &mut Components, storages: &mut Storages, required_components: &mut RequiredComponents, )
Bundle
.Source§fn get_component_ids(
components: &Components,
ids: &mut impl FnMut(Option<ComponentId>),
)
fn get_component_ids( components: &Components, ids: &mut impl FnMut(Option<ComponentId>), )
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<C> DynamicBundle for Cwhere
C: Component,
impl<C> DynamicBundle for Cwhere
C: Component,
fn get_components(self, func: &mut impl FnMut(StorageType, OwningPtr<'_>))
Source§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
Source§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path
.Source§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
Source§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident
.Source§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name
.Source§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
Source§impl<T> DynamicTyped for Twhere
T: Typed,
impl<T> DynamicTyped for Twhere
T: Typed,
Source§fn reflect_type_info(&self) -> &'static TypeInfo
fn reflect_type_info(&self) -> &'static TypeInfo
Typed::type_info
.Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self
using default()
.
Source§impl<S> GetField for Swhere
S: Struct,
impl<S> GetField for Swhere
S: Struct,
Source§impl<T> GetPath for T
impl<T> GetPath for T
Source§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
path
. Read moreSource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
path
. Read moreSource§fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
path
. Read moreSource§fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
path
. Read moreSource§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more