pub struct ScatteringMedium {
pub label: Option<Cow<'static, str>>,
pub falloff_resolution: u32,
pub phase_resolution: u32,
pub terms: SmallVec<[ScatteringTerm; 1]>,
}Expand description
An asset that defines how a material scatters light.
In order to calculate how light passes through a medium, you need three pieces of information:
- how much light the medium absorbs per unit length
- how much light the medium scatters per unit length
- what directions the medium is likely to scatter light in.
The first two are fairly simple, and are sometimes referred to together (accurately enough) as the medium’s optical density.
The last, defined by a phase function, is the most important in creating
the look of a medium. Our brains are very good at noticing (if unconsciously)
that a dust storm scatters light differently than a rain cloud, for example.
See the docs on PhaseFunction for more info.
In reality, media are often composed of multiple elements that scatter light
independently, for Earth’s atmosphere is composed of the gas itself, but also
suspended dust and particulate. These each scatter light differently, and are
distributed in different amounts at different altitudes. In a ScatteringMedium,
these are each represented by a ScatteringTerm
§Technical Details
A ScatteringMedium is represented on the GPU by a set of two LUTs, which
are re-created every time the asset is modified. See the docs on
bevy_pbr::GpuScatteringMedium for more info.
Fields§
§label: Option<Cow<'static, str>>An optional label for the medium, used when creating the LUTs on the GPU.
falloff_resolution: u32The resolution at which to sample the falloff distribution of each scattering term. Custom or more detailed distributions may benefit from a higher value, at the cost of more memory use.
phase_resolution: u32The resolution at which to sample the phase function of each scattering term. Custom or more detailed phase functions may benefit from a higher value, at the cost of more memory use.
terms: SmallVec<[ScatteringTerm; 1]>The list of ScatteringTerms that compose this ScatteringMedium
Implementations§
Source§impl ScatteringMedium
impl ScatteringMedium
Sourcepub fn new(
falloff_resolution: u32,
phase_resolution: u32,
terms: impl IntoIterator<Item = ScatteringTerm>,
) -> ScatteringMedium
pub fn new( falloff_resolution: u32, phase_resolution: u32, terms: impl IntoIterator<Item = ScatteringTerm>, ) -> ScatteringMedium
Returns a scattering medium with a default label and the specified scattering terms.
Sourcepub fn with_label(self, label: impl Into<Cow<'static, str>>) -> ScatteringMedium
pub fn with_label(self, label: impl Into<Cow<'static, str>>) -> ScatteringMedium
Consumes and returns this scattering medium with a new label.
Sourcepub fn with_density_multiplier(self, multiplier: f32) -> ScatteringMedium
pub fn with_density_multiplier(self, multiplier: f32) -> ScatteringMedium
Consumes and returns this scattering medium with each scattering terms’
densities multiplied by multiplier.
Sourcepub fn earth(falloff_resolution: u32, phase_resolution: u32) -> ScatteringMedium
pub fn earth(falloff_resolution: u32, phase_resolution: u32) -> ScatteringMedium
Returns a scattering medium representing an earth atmosphere.
Uses physically-based scale heights from Earth’s atmosphere, assuming a 60 km atmosphere height:
- Rayleigh (molecular) scattering: 8 km scale height
- Mie (aerosol) scattering: 1.2 km scale height
Sourcepub fn mars(
falloff_resolution: u32,
phase_resolution: u32,
dust_phase: Handle<Image>,
) -> ScatteringMedium
pub fn mars( falloff_resolution: u32, phase_resolution: u32, dust_phase: Handle<Image>, ) -> ScatteringMedium
Returns a scattering medium representing a Martian atmosphere Schneegans et al. 2024.
Constituents:
- Rayleigh: carbon dioxide
- Dust: wavelength-dependent Mie phase, double-exponential density
Requires an Nx1 chromatic phase texture for the dust term.
Trait Implementations§
impl Asset for ScatteringMedium
Source§impl Clone for ScatteringMedium
impl Clone for ScatteringMedium
Source§fn clone(&self) -> ScatteringMedium
fn clone(&self) -> ScatteringMedium
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Default for ScatteringMedium
impl Default for ScatteringMedium
Source§fn default() -> ScatteringMedium
fn default() -> ScatteringMedium
Source§impl TypePath for ScatteringMedium
impl TypePath for ScatteringMedium
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 VisitAssetDependencies for ScatteringMedium
impl VisitAssetDependencies for ScatteringMedium
fn visit_dependencies(&self, visit: &mut impl FnMut(UntypedAssetId))
Auto Trait Implementations§
impl !RefUnwindSafe for ScatteringMedium
impl !Unpin for ScatteringMedium
impl !UnwindSafe for ScatteringMedium
impl Freeze for ScatteringMedium
impl Send for ScatteringMedium
impl Sync for ScatteringMedium
impl UnsafeUnpin for ScatteringMedium
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ConditionalSend for Twhere
T: Send,
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>, which can then be
downcast into Box<dyn 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>, which 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> 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> DowncastSend for T
impl<T> DowncastSend for T
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> 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<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§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