Add a material flag to enable attenuation, removing need for non-portable infinity use

This commit is contained in:
Marco Buono 2023-09-24 14:38:09 -03:00
parent e3487e30c8
commit 0adc5da0b6
3 changed files with 8 additions and 2 deletions

View File

@ -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<StandardMaterialUniform> 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(),

View File

@ -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

View File

@ -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<f32>(1.0, 1.0, 1.0, 1.0);
material.flags = STANDARD_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE;
material.alpha_cutoff = 0.5;