Add a material flag to enable attenuation, removing need for non-portable infinity use
This commit is contained in:
parent
e3487e30c8
commit
0adc5da0b6
@ -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(),
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user