#[non_exhaustive]pub struct Material {Show 22 fields
pub base_colour: [f32; 3],
pub ambient: f32,
pub diffuse: f32,
pub specular: f32,
pub shininess: f32,
pub metallic: f32,
pub roughness: f32,
pub texture_id: Option<TextureId>,
pub normal_map_id: Option<TextureId>,
pub ao_map_id: Option<TextureId>,
pub metallic_roughness_texture_id: Option<TextureId>,
pub emissive: [f32; 3],
pub emissive_texture_id: Option<TextureId>,
pub alpha_mode: AlphaMode,
pub shading_model: ShadingModel,
pub param_vis: Option<ParamVis>,
pub backface_policy: BackfacePolicy,
pub uv_offset: [f32; 2],
pub uv_scale: [f32; 2],
pub ao_range: [f32; 2],
pub metallic_range: [f32; 2],
pub roughness_range: [f32; 2],
}Expand description
Per-object material properties for Blinn-Phong and PBR shading.
Materials carry all shading parameters that were previously global in LightingSettings.
Each SceneRenderItem now has its own Material, enabling per-object visual distinction.
This struct is #[non_exhaustive]: construct via Material::default,
Material::from_colour, or spread syntax (..Default::default()). This allows new
fields to be added later without breaking downstream code.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.base_colour: [f32; 3]Base diffuse colour [r, g, b] in linear 0..1 range. Default [0.7, 0.7, 0.7].
ambient: f32Ambient light coefficient. Default 0.15.
diffuse: f32Diffuse light coefficient. Default 0.75.
specular: f32Specular highlight coefficient. Default 0.4.
shininess: f32Specular shininess exponent. Default 32.0.
metallic: f32Metallic factor for PBR Cook-Torrance shading. 0=dielectric, 1=metal. Default 0.0.
roughness: f32Roughness factor for PBR microfacet distribution. 0=mirror, 1=fully rough. Default 0.5.
texture_id: Option<TextureId>Optional albedo texture identifier. None = no texture applied. Default None.
normal_map_id: Option<TextureId>Optional normal map texture identifier. None = no normal mapping. Default None.
The normal map must be in tangent-space with XY encoded as RG (0..1 -> -1..+1). Requires UVs and tangents on the mesh for correct TBN construction.
ao_map_id: Option<TextureId>Optional ambient occlusion map texture identifier. None = no AO map. Default None.
The AO map R channel encodes cavity factor (0=fully occluded, 1=fully lit). Applied multiplicatively to ambient and diffuse terms.
metallic_roughness_texture_id: Option<TextureId>Optional combined metallic-roughness texture (ORM layout). Default None.
Matches the glTF metallicRoughnessTexture: G channel encodes roughness,
B channel encodes metallic. Each channel is multiplied by the corresponding
scalar factor (roughness, metallic). Only sampled when the material’s
shading_model is ShadingModel::Pbr.
emissive: [f32; 3]Self-illumination colour added after lighting. Default [0.0, 0.0, 0.0].
Matches glTF emissiveFactor. Applied to both Blinn-Phong and PBR paths.
When emissive_texture_id is set, this value is multiplied by the texture sample.
emissive_texture_id: Option<TextureId>Optional emissive texture identifier. Default None.
Matches glTF emissiveTexture. Sampled and multiplied by emissive.
alpha_mode: AlphaModeAlpha handling mode. Default AlphaMode::Opaque.
Mask(cutoff) discards fragments below the cutoff using the alpha channel.
Blend routes the mesh through the OIT transparent pass.
shading_model: ShadingModelWhich lit shading model evaluates this surface. Default ShadingModel::Phong.
Phong uses Blinn-Phong; Pbr uses Cook-Torrance GGX driven by metallic
and roughness; Matcap(id) replaces the lit path with a matcap texture
lookup. The unlit per-item bypass on ItemSettings is checked
independently and takes precedence over any value here.
param_vis: Option<ParamVis>UV parameterization visualization. When set, replaces albedo/lighting with a procedural pattern in UV space : useful for inspecting parameterization quality.
Requires UV coordinates on the mesh. Default None (standard shading).
backface_policy: BackfacePolicyBack-face rendering policy. Default BackfacePolicy::Cull (back faces hidden).
Use BackfacePolicy::Identical for single-sided geometry like planes and open
surfaces. Use BackfacePolicy::DifferentColour to highlight back faces in a
distinct colour : helpful for diagnosing mesh orientation errors.
uv_offset: [f32; 2]Per-material UV offset applied to all texture samples (albedo, normal,
AO, metallic-roughness, emissive). Default [0.0, 0.0].
Sampled as uv = mesh_uv * uv_scale + uv_offset in the fragment shader.
Lets one mesh be shared between multiple atlas-region materials without
duplicating vertex buffers : an asset pack with a single tree atlas can
pick the trunk or leaves region per material instance.
uv_scale: [f32; 2]Per-material UV scale. Default [1.0, 1.0].
See uv_offset for the full sampling formula.
ao_range: [f32; 2]Min/max range applied to the AO map’s R sample. Identity [0.0, 1.0]
passes the sample through unchanged. Skipped when ao_map_id is None.
The remap is mix(min, max, raw_sample). Useful when a packed mask
map authors AO in a reduced range (e.g. [0.4, 1.0]) and the renderer
needs to normalise the sample before it drives lighting.
metallic_range: [f32; 2]Min/max range applied to the metallic sample (B channel of the
metallic-roughness texture in the glTF/ORM convention). Identity
[0.0, 1.0]. Skipped when metallic_roughness_texture_id is None.
Applied to the texture sample before the scalar metallic factor:
final = clamp(mix(min, max, raw.b) * metallic, 0.0, 1.0).
roughness_range: [f32; 2]Min/max range applied to the roughness sample (G channel of the
metallic-roughness texture). Identity [0.0, 1.0]. Skipped when
metallic_roughness_texture_id is None.
Applied to the texture sample before the scalar roughness factor:
final = max(mix(min, max, raw.g) * roughness, 0.04).
Implementations§
Source§impl Material
impl Material
Sourcepub fn is_two_sided(&self) -> bool
pub fn is_two_sided(&self) -> bool
Returns true if the backface policy makes back faces visible.
Sourcepub fn backface_needs_per_object(&self) -> bool
pub fn backface_needs_per_object(&self) -> bool
Returns true if back faces need the per-object draw path.
Cull and Identical render correctly through the instanced path: Cull
uses back-face culling and Identical disables culling but shades back
faces with the geometric normal, neither of which needs per-item state the
instanced shader does not carry. The styled policies (DifferentColour,
Tint, Pattern) flip the normal and read a per-item back-face colour, so
they stay on the per-object path.
Sourcepub fn is_blend(&self) -> bool
pub fn is_blend(&self) -> bool
Returns true if this material uses alpha blending and should go through the OIT pass.
Sourcepub fn from_colour(colour: [f32; 3]) -> Self
pub fn from_colour(colour: [f32; 3]) -> Self
Construct from a plain colour, all other parameters at their defaults.
Sourcepub fn pbr(base_colour: [f32; 3], metallic: f32, roughness: f32) -> Self
pub fn pbr(base_colour: [f32; 3], metallic: f32, roughness: f32) -> Self
Construct a Cook-Torrance PBR material.
metallic: 0.0 = dielectric, 1.0 = full metalroughness: 0.0 = mirror, 1.0 = fully rough
All other parameters take their defaults. Enable post-processing
(PostProcessSettings::enabled = true) for correct HDR tone mapping.
Sourcepub fn is_pbr(&self) -> bool
pub fn is_pbr(&self) -> bool
Returns true when the material’s shading model is Cook-Torrance PBR.
Sourcepub fn is_flat(&self) -> bool
pub fn is_flat(&self) -> bool
Returns true when the material’s shading model is flat / faceted.
Sourcepub fn flat(base_colour: [f32; 3]) -> Self
pub fn flat(base_colour: [f32; 3]) -> Self
Construct a flat (faceted) material with the given base colour. The per-vertex normal is replaced at the fragment stage by a geometric normal recovered from screen-space derivatives, so polygon edges remain visible on otherwise smooth meshes. Everything else takes material defaults.
Sourcepub fn matcap_id(&self) -> Option<MatcapId>
pub fn matcap_id(&self) -> Option<MatcapId>
Returns the matcap id when the material uses a matcap shading model.
Sourcepub fn solid(colour: [f32; 3]) -> Self
pub fn solid(colour: [f32; 3]) -> Self
Alias for Material::from_colour.
Returns a material with the given base colour and all other fields at defaults.
“solid” is a more familiar name in some graphics contexts; both names are kept
so existing from_colour call sites do not need updating.
Sourcepub fn textured(texture_id: TextureId) -> Self
pub fn textured(texture_id: TextureId) -> Self
Returns a material with only texture_id set; all other fields take defaults.
Useful when the mesh already carries a UV layout and the only requirement is to apply a texture. Base colour, lighting model, and all other fields stay at their default values.
Sourcepub fn pbr_with_ao(
base_colour: [f32; 3],
metallic: f32,
roughness: f32,
ao_map: Option<TextureId>,
) -> Self
pub fn pbr_with_ao( base_colour: [f32; 3], metallic: f32, roughness: f32, ao_map: Option<TextureId>, ) -> Self
PBR constructor that also sets a baked ambient-occlusion texture.
base_colour: RGB albedo in linear 0..1metallic: 0.0 = dielectric, 1.0 = full metalroughness: 0.0 = mirror, 1.0 = fully roughao_map: baked AO texture id, orNoneto disable AO
Sets shading_model = ShadingModel::Pbr. All other fields take defaults.
Use Material::pbr when no AO map is needed.
Trait Implementations§
impl Copy for Material
Source§impl<'de> Deserialize<'de> for Material
impl<'de> Deserialize<'de> for Material
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl StructuralPartialEq for Material
Auto Trait Implementations§
impl Freeze for Material
impl RefUnwindSafe for Material
impl Send for Material
impl Sync for Material
impl Unpin for Material
impl UnsafeUnpin for Material
impl UnwindSafe for Material
Blanket Implementations§
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> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.