diff --git a/crates/bevy_pbr/src/pbr_material.rs b/crates/bevy_pbr/src/pbr_material.rs index ed91e3da1d..1bacb9605b 100644 --- a/crates/bevy_pbr/src/pbr_material.rs +++ b/crates/bevy_pbr/src/pbr_material.rs @@ -589,6 +589,7 @@ bitflags::bitflags! { const TRANSMISSION_TEXTURE = (1 << 10); const THICKNESS_TEXTURE = (1 << 11); const DIFFUSE_TRANSMISSION_TEXTURE = (1 << 12); + const ATTENUATION_ENABLED = (1 << 13); const ALPHA_MODE_RESERVED_BITS = (Self::ALPHA_MODE_MASK_BITS << Self::ALPHA_MODE_SHIFT_BITS); // ← Bitmask reserving bits for the `AlphaMode` const ALPHA_MODE_OPAQUE = (0 << Self::ALPHA_MODE_SHIFT_BITS); // ← Values are just sequential values bitshifted into const ALPHA_MODE_MASK = (1 << Self::ALPHA_MODE_SHIFT_BITS); // the bitmask, and can range from 0 to 7. @@ -724,6 +725,10 @@ impl AsBindGroupShaderType for StandardMaterial { AlphaMode::Multiply => flags |= StandardMaterialFlags::ALPHA_MODE_MULTIPLY, }; + if self.attenuation_distance.is_finite() { + flags |= StandardMaterialFlags::ATTENUATION_ENABLED; + } + StandardMaterialUniform { base_color: self.base_color.as_linear_rgba_f32().into(), emissive: self.emissive.as_linear_rgba_f32().into(), diff --git a/crates/bevy_pbr/src/render/pbr_functions.wgsl b/crates/bevy_pbr/src/render/pbr_functions.wgsl index 8014b40033..41d0cf4f43 100644 --- a/crates/bevy_pbr/src/render/pbr_functions.wgsl +++ b/crates/bevy_pbr/src/render/pbr_functions.wgsl @@ -385,7 +385,7 @@ fn pbr( transmitted_light += lighting::transmissive_light(in.world_position, in.frag_coord.xyz, in.N, in.V, ior, thickness, perceptual_roughness, transmissive_color, transmitted_environment_light_specular).rgb; } - if in.material.attenuation_distance < (1.0 / 0.0) /* f32::INFINITY */ { + if (in.material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_ATTENUATION_ENABLED_BIT) != 0u { // We reuse the `atmospheric_fog()` function here, as it's fundamentally // equivalent to the attenuation that takes place inside the material volume, // and will allow us to eventually hook up subsurface scattering more easily diff --git a/crates/bevy_pbr/src/render/pbr_types.wgsl b/crates/bevy_pbr/src/render/pbr_types.wgsl index 026a2f5a87..7934b84418 100644 --- a/crates/bevy_pbr/src/render/pbr_types.wgsl +++ b/crates/bevy_pbr/src/render/pbr_types.wgsl @@ -33,6 +33,7 @@ const STANDARD_MATERIAL_FLAGS_DEPTH_MAP_BIT: u32 = 512u; const STANDARD_MATERIAL_FLAGS_TRANSMISSION_TEXTURE_BIT: u32 = 1024u; const STANDARD_MATERIAL_FLAGS_THICKNESS_TEXTURE_BIT: u32 = 2048u; const STANDARD_MATERIAL_FLAGS_DIFFUSE_TRANSMISSION_TEXTURE_BIT: u32 = 4096u; +const STANDARD_MATERIAL_FLAGS_ATTENUATION_ENABLED_BIT: u32 = 8192u; const STANDARD_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS: u32 = 3758096384u; // (0b111u32 << 29) const STANDARD_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE: u32 = 0u; // (0u32 << 29) const STANDARD_MATERIAL_FLAGS_ALPHA_MODE_MASK: u32 = 536870912u; // (1u32 << 29) @@ -57,7 +58,7 @@ fn standard_material_new() -> StandardMaterial { material.transmission = 0.0; material.thickness = 0.0; material.ior = 1.5; - material.attenuation_distance = 1.0 / 0.0; // f32::INFINITY + material.attenuation_distance = 1.0; material.attenuation_color = vec4(1.0, 1.0, 1.0, 1.0); material.flags = STANDARD_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE; material.alpha_cutoff = 0.5;