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
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
pub fn new( falloff_resolution: u32, phase_resolution: u32, terms: impl IntoIterator<Item = ScatteringTerm>, ) -> ScatteringMedium
pub fn with_label(self, label: impl Into<Cow<'static, str>>) -> ScatteringMedium
pub fn with_density_multiplier(self, multiplier: f32) -> ScatteringMedium
Sourcepub fn earthlike(
falloff_resolution: u32,
phase_resolution: u32,
) -> ScatteringMedium
pub fn earthlike( falloff_resolution: u32, phase_resolution: u32, ) -> ScatteringMedium
Returns a scattering medium representing an earthlike 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
Trait Implementations§
Source§impl Clone for ScatteringMedium
impl Clone for ScatteringMedium
Source§fn clone(&self) -> ScatteringMedium
fn clone(&self) -> ScatteringMedium
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§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))
impl Asset for ScatteringMedium
Auto Trait Implementations§
impl Freeze for ScatteringMedium
impl !RefUnwindSafe for ScatteringMedium
impl Send for ScatteringMedium
impl Sync for ScatteringMedium
impl Unpin for ScatteringMedium
impl !UnwindSafe 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
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>, 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, 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