Enum bevy_pbr::FogFalloff
source · pub enum FogFalloff {
Linear {
start: f32,
end: f32,
},
Exponential {
density: f32,
},
ExponentialSquared {
density: f32,
},
Atmospheric {
extinction: Vec3,
inscattering: Vec3,
},
}
Expand description
Allows switching between different fog falloff modes, and configuring their parameters.
Convenience Methods
When using non-linear fog modes it can be hard to determine the right parameter values for a given scene.
For easier artistic control, instead of creating the enum variants directly, you can use the visibility-based convenience methods:
-
For
FogFalloff::Exponential
: -
For
FogFalloff::ExponentialSquared
: -
For
FogFalloff::Atmospheric
:
Variants§
Linear
Fields
A linear fog falloff that grows in intensity between start
and end
distances.
This falloff mode is simpler to control than other modes, however it can produce results that look “artificial”, depending on the scene.
Formula
The fog intensity for a given point in the scene is determined by the following formula:
let fog_intensity = 1.0 - ((end - distance) / (end - start)).clamp(0.0, 1.0);
Exponential
Fields
An exponential fog falloff with a given density
.
Initially gains intensity quickly with distance, then more slowly. Typically produces more natural results than FogFalloff::Linear
,
but is a bit harder to control.
To move the fog “further away”, use lower density values. To move it “closer” use higher density values.
Tips
- Use the
FogFalloff::from_visibility()
convenience method to create an exponential falloff with the proper density for a desired visibility distance in world units; - It’s not unusual to have very large or very small values for the density, depending on the scene
scale. Typically, for scenes with objects in the scale of thousands of units, you might want density values
in the ballpark of
0.001
. Conversely, for really small scale scenes you might want really high values of density; - Combine the
density
parameter with theFogSettings
color
’s alpha channel for easier artistic control.
Formula
The fog intensity for a given point in the scene is determined by the following formula:
let fog_intensity = 1.0 - 1.0 / (distance * density).exp();
ExponentialSquared
Fields
A squared exponential fog falloff with a given density
.
Similar to FogFalloff::Exponential
, but grows more slowly in intensity for closer distances
before “catching up”.
To move the fog “further away”, use lower density values. To move it “closer” use higher density values.
Tips
- Use the
FogFalloff::from_visibility_squared()
convenience method to create an exponential squared falloff with the proper density for a desired visibility distance in world units; - Combine the
density
parameter with theFogSettings
color
’s alpha channel for easier artistic control.
Formula
The fog intensity for a given point in the scene is determined by the following formula:
let fog_intensity = 1.0 - 1.0 / (distance * density).powi(2).exp();
Atmospheric
Fields
extinction: Vec3
Controls how much light is removed due to atmospheric “extinction”, i.e. loss of light due to photons being absorbed by atmospheric particles.
Each component can be thought of as an independent per R
/G
/B
channel density
factor from
FogFalloff::Exponential
: Multiplier applied to the world distance (within the fog
falloff calculation) for that specific channel.
Note:
This value is not a Color
, since it affects the channels exponentially in a non-intuitive way.
For artistic control, use the FogFalloff::from_visibility_colors()
convenience method.
inscattering: Vec3
Controls how much light is added due to light scattering from the sun through the atmosphere.
Each component can be thought of as an independent per R
/G
/B
channel density
factor from
FogFalloff::Exponential
: A multiplier applied to the world distance (within the fog
falloff calculation) for that specific channel.
Note:
This value is not a Color
, since it affects the channels exponentially in a non-intuitive way.
For artistic control, use the FogFalloff::from_visibility_colors()
convenience method.
A more general form of the FogFalloff::Exponential
mode. The falloff formula is separated into
two terms, extinction
and inscattering
, for a somewhat simplified atmospheric scattering model.
Additionally, individual color channels can have their own density values, resulting in a total of
six different configuration parameters.
Tips
- Use the
FogFalloff::from_visibility_colors()
orFogFalloff::from_visibility_color()
convenience methods to create an atmospheric falloff with the proper densities for a desired visibility distance in world units and extinction and inscattering colors; - Combine the atmospheric fog parameters with the
FogSettings
color
’s alpha channel for easier artistic control.
Formula
Unlike other modes, atmospheric falloff doesn’t use a simple intensity-based blend of fog color with object color. Instead, it calculates per-channel extinction and inscattering factors, which are then used to calculate the final color.
let extinction_factor = 1.0 - 1.0 / (distance * extinction).exp();
let inscattering_factor = 1.0 - 1.0 / (distance * inscattering).exp();
let result = input_color * (1.0 - extinction_factor) + fog_color * inscattering_factor;
Equivalence to FogFalloff::Exponential
For a density value of D
, the following two falloff modes will produce identical visual results:
let exponential = FogFalloff::Exponential {
density: D,
};
let atmospheric = FogFalloff::Atmospheric {
extinction: Vec3::new(D, D, D),
inscattering: Vec3::new(D, D, D),
};
Note: While the results are identical, FogFalloff::Atmospheric
is computationally more expensive.
Implementations§
source§impl FogFalloff
impl FogFalloff
sourcepub fn from_visibility(visibility: f32) -> FogFalloff
pub fn from_visibility(visibility: f32) -> FogFalloff
Creates a FogFalloff::Exponential
value from the given visibility distance in world units,
using the revised Koschmieder contrast threshold, FogFalloff::REVISED_KOSCHMIEDER_CONTRAST_THRESHOLD
.
sourcepub fn from_visibility_contrast(
visibility: f32,
contrast_threshold: f32
) -> FogFalloff
pub fn from_visibility_contrast( visibility: f32, contrast_threshold: f32 ) -> FogFalloff
Creates a FogFalloff::Exponential
value from the given visibility distance in world units,
and a given contrast threshold in the range of 0.0
to 1.0
.
sourcepub fn from_visibility_squared(visibility: f32) -> FogFalloff
pub fn from_visibility_squared(visibility: f32) -> FogFalloff
Creates a FogFalloff::ExponentialSquared
value from the given visibility distance in world units,
using the revised Koschmieder contrast threshold, FogFalloff::REVISED_KOSCHMIEDER_CONTRAST_THRESHOLD
.
sourcepub fn from_visibility_contrast_squared(
visibility: f32,
contrast_threshold: f32
) -> FogFalloff
pub fn from_visibility_contrast_squared( visibility: f32, contrast_threshold: f32 ) -> FogFalloff
Creates a FogFalloff::ExponentialSquared
value from the given visibility distance in world units,
and a given contrast threshold in the range of 0.0
to 1.0
.
sourcepub fn from_visibility_color(
visibility: f32,
extinction_inscattering_color: Color
) -> FogFalloff
pub fn from_visibility_color( visibility: f32, extinction_inscattering_color: Color ) -> FogFalloff
Creates a FogFalloff::Atmospheric
value from the given visibility distance in world units,
and a shared color for both extinction and inscattering, using the revised Koschmieder contrast threshold,
FogFalloff::REVISED_KOSCHMIEDER_CONTRAST_THRESHOLD
.
sourcepub fn from_visibility_colors(
visibility: f32,
extinction_color: Color,
inscattering_color: Color
) -> FogFalloff
pub fn from_visibility_colors( visibility: f32, extinction_color: Color, inscattering_color: Color ) -> FogFalloff
Creates a FogFalloff::Atmospheric
value from the given visibility distance in world units,
extinction and inscattering colors, using the revised Koschmieder contrast threshold,
FogFalloff::REVISED_KOSCHMIEDER_CONTRAST_THRESHOLD
.
Tips
- Alpha values of the provided colors can modulate the
extinction
andinscattering
effects; - Using an
extinction_color
ofColor::WHITE
orColor::NONE
disables the extinction effect; - Using an
inscattering_color
ofColor::BLACK
orColor::NONE
disables the inscattering effect.
sourcepub fn from_visibility_contrast_color(
visibility: f32,
contrast_threshold: f32,
extinction_inscattering_color: Color
) -> FogFalloff
pub fn from_visibility_contrast_color( visibility: f32, contrast_threshold: f32, extinction_inscattering_color: Color ) -> FogFalloff
Creates a FogFalloff::Atmospheric
value from the given visibility distance in world units,
a contrast threshold in the range of 0.0
to 1.0
, and a shared color for both extinction and inscattering.
sourcepub fn from_visibility_contrast_colors(
visibility: f32,
contrast_threshold: f32,
extinction_color: Color,
inscattering_color: Color
) -> FogFalloff
pub fn from_visibility_contrast_colors( visibility: f32, contrast_threshold: f32, extinction_color: Color, inscattering_color: Color ) -> FogFalloff
Creates a FogFalloff::Atmospheric
value from the given visibility distance in world units,
a contrast threshold in the range of 0.0
to 1.0
, extinction and inscattering colors.
Tips
- Alpha values of the provided colors can modulate the
extinction
andinscattering
effects; - Using an
extinction_color
ofColor::WHITE
orColor::NONE
disables the extinction effect; - Using an
inscattering_color
ofColor::BLACK
orColor::NONE
disables the inscattering effect.
sourcepub const REVISED_KOSCHMIEDER_CONTRAST_THRESHOLD: f32 = 0.0500000007f32
pub const REVISED_KOSCHMIEDER_CONTRAST_THRESHOLD: f32 = 0.0500000007f32
A 2% contrast threshold was originally proposed by Koschmieder, being the minimum visual contrast at which a human observer could detect an object. We use a revised 5% contrast threshold, deemed more realistic for typical human observers.
sourcepub fn koschmieder(v: f32, c_t: f32) -> f32
pub fn koschmieder(v: f32, c_t: f32) -> f32
Calculates the extinction coefficient β, from V and Cₜ, where:
- Cₜ is the contrast threshold, in the range of
0.0
to1.0
- V is the visibility distance in which a perfectly black object is still identifiable against the horizon sky within the contrast threshold
We start with Koschmieder’s equation:
-ln(Cₜ)
V = ─────────
β
Multiplying both sides by β/V, that gives us:
-ln(Cₜ)
β = ─────────
V
See:
Trait Implementations§
source§impl Clone for FogFalloff
impl Clone for FogFalloff
source§fn clone(&self) -> FogFalloff
fn clone(&self) -> FogFalloff
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for FogFalloff
impl Debug for FogFalloff
source§impl Enum for FogFalloff
impl Enum for FogFalloff
source§fn field(&self, __name_param: &str) -> Option<&dyn Reflect>
fn field(&self, __name_param: &str) -> Option<&dyn Reflect>
source§fn field_at(&self, __index_param: usize) -> Option<&dyn Reflect>
fn field_at(&self, __index_param: usize) -> Option<&dyn Reflect>
source§fn field_mut(&mut self, __name_param: &str) -> Option<&mut dyn Reflect>
fn field_mut(&mut self, __name_param: &str) -> Option<&mut dyn Reflect>
source§fn field_at_mut(&mut self, __index_param: usize) -> Option<&mut dyn Reflect>
fn field_at_mut(&mut self, __index_param: usize) -> Option<&mut dyn Reflect>
source§fn index_of(&self, __name_param: &str) -> Option<usize>
fn index_of(&self, __name_param: &str) -> Option<usize>
source§fn name_at(&self, __index_param: usize) -> Option<&str>
fn name_at(&self, __index_param: usize) -> Option<&str>
source§fn iter_fields(&self) -> VariantFieldIter<'_>
fn iter_fields(&self) -> VariantFieldIter<'_>
source§fn variant_name(&self) -> &str
fn variant_name(&self) -> &str
source§fn variant_index(&self) -> usize
fn variant_index(&self) -> usize
source§fn variant_type(&self) -> VariantType
fn variant_type(&self) -> VariantType
fn clone_dynamic(&self) -> DynamicEnum
source§fn is_variant(&self, variant_type: VariantType) -> bool
fn is_variant(&self, variant_type: VariantType) -> bool
source§fn variant_path(&self) -> String
fn variant_path(&self) -> String
source§impl FromReflect for FogFalloff
impl FromReflect for FogFalloff
source§fn from_reflect(__param0: &dyn Reflect) -> Option<Self>
fn from_reflect(__param0: &dyn Reflect) -> Option<Self>
Self
from a reflected value.source§fn take_from_reflect(
reflect: Box<dyn Reflect>
) -> Result<Self, Box<dyn Reflect>>
fn take_from_reflect( reflect: Box<dyn Reflect> ) -> Result<Self, Box<dyn Reflect>>
Self
using,
constructing the value using from_reflect
if that fails. Read moresource§impl GetTypeRegistration for FogFalloff
impl GetTypeRegistration for FogFalloff
source§impl Reflect for FogFalloff
impl Reflect for FogFalloff
source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
source§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any
.source§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§fn clone_value(&self) -> Box<dyn Reflect>
fn clone_value(&self) -> Box<dyn Reflect>
Reflect
trait object. Read moresource§fn set(
&mut self,
__value_param: Box<dyn Reflect>
) -> Result<(), Box<dyn Reflect>>
fn set( &mut self, __value_param: Box<dyn Reflect> ) -> Result<(), Box<dyn Reflect>>
source§fn apply(&mut self, __value_param: &dyn Reflect)
fn apply(&mut self, __value_param: &dyn Reflect)
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 reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
source§fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
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 TypePath for FogFalloff
impl TypePath for FogFalloff
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>
Auto Trait Implementations§
impl RefUnwindSafe for FogFalloff
impl Send for FogFalloff
impl Sync for FogFalloff
impl Unpin for FogFalloff
impl UnwindSafe for FogFalloff
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<Image>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<Image>) -> 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<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<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> GetPath for T
impl<T> GetPath for T
source§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>
) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p> ) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
path
. Read moresource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>
) -> Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p> ) -> Result<&mut (dyn Reflect + '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 more