From e973e1766092df3ef954a27d49d40da50d446d08 Mon Sep 17 00:00:00 2001 From: Marco Buono Date: Tue, 26 Sep 2023 00:54:50 -0300 Subject: [PATCH] Rename `transmission` to `specular_transmission` --- crates/bevy_gltf/src/loader.rs | 6 +-- crates/bevy_pbr/src/pbr_material.rs | 26 +++++------ crates/bevy_pbr/src/render/pbr.wgsl | 6 +-- crates/bevy_pbr/src/render/pbr_functions.wgsl | 22 +++++----- crates/bevy_pbr/src/render/pbr_lighting.wgsl | 6 +-- crates/bevy_pbr/src/render/pbr_types.wgsl | 4 +- examples/3d/transmission.rs | 44 +++++++++---------- 7 files changed, 57 insertions(+), 57 deletions(-) diff --git a/crates/bevy_gltf/src/loader.rs b/crates/bevy_gltf/src/loader.rs index 3fa0b429ea..1e110f9a13 100644 --- a/crates/bevy_gltf/src/loader.rs +++ b/crates/bevy_gltf/src/loader.rs @@ -708,7 +708,7 @@ fn load_material( }); #[cfg(feature = "pbr_transmission_textures")] - let (transmission, transmission_texture) = + let (specular_transmission, transmission_texture) = material.transmission().map_or((0.0, None), |transmission| { let transmission_texture: Option> = transmission .transmission_texture() @@ -721,7 +721,7 @@ fn load_material( }); #[cfg(not(feature = "pbr_transmission_textures"))] - let transmission = material + let specular_transmission = material .transmission() .map_or(0.0, |transmission| transmission.transmission_factor()); @@ -776,7 +776,7 @@ fn load_material( emissive: Color::rgb_linear(emissive[0], emissive[1], emissive[2]) * material.emissive_strength().unwrap_or(1.0), emissive_texture, - transmission, + specular_transmission, #[cfg(feature = "pbr_transmission_textures")] transmission_texture, thickness, diff --git a/crates/bevy_pbr/src/pbr_material.rs b/crates/bevy_pbr/src/pbr_material.rs index 445ceae46a..cab683623f 100644 --- a/crates/bevy_pbr/src/pbr_material.rs +++ b/crates/bevy_pbr/src/pbr_material.rs @@ -145,7 +145,7 @@ pub struct StandardMaterial { /// which provides an inexpensive but plausible approximation of translucency for thin dieletric objects (e.g. paper, /// leaves, some fabrics) or thicker volumetric materials with short scattering distances (e.g. porcelain, wax). /// - /// For specular transmission usecases with refraction (e.g. glass) use the [`StandardMaterial::transmission`] and + /// For specular transmission usecases with refraction (e.g. glass) use the [`StandardMaterial::specular_transmission`] and /// [`StandardMaterial::ior`] properties instead. /// /// - When set to `0.0` (the default) no diffuse light is transmitted; @@ -185,17 +185,17 @@ pub struct StandardMaterial { /// /// - [`Camera3d::transmissive_steps`](bevy_core_pipeline::core_3d::Camera3d::transmissive_steps) can be used to enable transmissive objects /// to be seen through other transmissive objects, at the cost of additional draw calls and texture copies; (Use with caution!) - /// - If a simplified approximation of transmission using only environment map lighting is sufficient, consider setting + /// - If a simplified approximation of specular transmission using only environment map lighting is sufficient, consider setting /// [`Camera3d::transmissive_steps`](bevy_core_pipeline::core_3d::Camera3d::transmissive_steps) to `0`. /// - If purely diffuse light transmission is needed, (i.e. “translucency”) consider using [`StandardMaterial::diffuse_transmission`] instead, /// for a much less expensive effect. #[doc(alias = "refraction")] - pub transmission: f32, + pub specular_transmission: f32, - /// A map that modulates specular transmission via its **R channel**. Multiplied by [`StandardMaterial::transmission`] + /// A map that modulates specular transmission via its **R channel**. Multiplied by [`StandardMaterial::specular_transmission`] /// to obtain the final result. /// - /// **Important:** The [`StandardMaterial::transmission`] property must be set to a value higher than 0.0, + /// **Important:** The [`StandardMaterial::specular_transmission`] property must be set to a value higher than 0.0, /// or this texture won't have any effect. #[texture(13)] #[sampler(14)] @@ -209,7 +209,7 @@ pub struct StandardMaterial { /// /// When set to any other value, the material distorts light like a thick lens. /// - /// **Note:** Typically used in conjunction with [`StandardMaterial::transmission`] and [`StandardMaterial::ior`], or with + /// **Note:** Typically used in conjunction with [`StandardMaterial::specular_transmission`] and [`StandardMaterial::ior`], or with /// [`StandardMaterial::diffuse_transmission`]. #[doc(alias = "volume")] #[doc(alias = "thin_walled")] @@ -250,7 +250,7 @@ pub struct StandardMaterial { /// | Diamond | 2.42 | /// | Moissanite | 2.65 | /// - /// **Note:** Typically used in conjunction with [`StandardMaterial::transmission`] and [`StandardMaterial::thickness`]. + /// **Note:** Typically used in conjunction with [`StandardMaterial::specular_transmission`] and [`StandardMaterial::thickness`]. #[doc(alias = "index_of_refraction")] #[doc(alias = "refraction_index")] #[doc(alias = "refractive_index")] @@ -264,7 +264,7 @@ pub struct StandardMaterial { /// **Note:** To have any effect, must be used in conjunction with: /// - [`StandardMaterial::attenuation_color`]; /// - [`StandardMaterial::thickness`]; - /// - [`StandardMaterial::diffuse_transmission`] or [`StandardMaterial::transmission`]. + /// - [`StandardMaterial::diffuse_transmission`] or [`StandardMaterial::specular_transmission`]. #[doc(alias = "absorption_distance")] #[doc(alias = "extinction_distance")] pub attenuation_distance: f32, @@ -276,7 +276,7 @@ pub struct StandardMaterial { /// **Note:** To have any effect, must be used in conjunction with: /// - [`StandardMaterial::attenuation_distance`]; /// - [`StandardMaterial::thickness`]; - /// - [`StandardMaterial::diffuse_transmission`] or [`StandardMaterial::transmission`]. + /// - [`StandardMaterial::diffuse_transmission`] or [`StandardMaterial::specular_transmission`]. #[doc(alias = "absorption_color")] #[doc(alias = "extinction_color")] pub attenuation_color: Color, @@ -479,7 +479,7 @@ impl Default for StandardMaterial { diffuse_transmission: 0.0, #[cfg(feature = "pbr_transmission_textures")] diffuse_transmission_texture: None, - transmission: 0.0, + specular_transmission: 0.0, #[cfg(feature = "pbr_transmission_textures")] transmission_texture: None, thickness: 0.0, @@ -585,7 +585,7 @@ pub struct StandardMaterialUniform { /// Amount of diffuse light transmitted through the material pub diffuse_transmission: f32, /// Amount of specular light transmitted through the material - pub transmission: f32, + pub specular_transmission: f32, /// Thickness of the volume underneath the material surface pub thickness: f32, /// Index of Refraction @@ -694,7 +694,7 @@ impl AsBindGroupShaderType for StandardMaterial { metallic: self.metallic, reflectance: self.reflectance, diffuse_transmission: self.diffuse_transmission, - transmission: self.transmission, + specular_transmission: self.specular_transmission, thickness: self.thickness, ior: self.ior, attenuation_distance: self.attenuation_distance, @@ -778,6 +778,6 @@ impl Material for StandardMaterial { #[inline] fn reads_view_transmission_texture(&self) -> bool { - self.transmission > 0.0 + self.specular_transmission > 0.0 } } diff --git a/crates/bevy_pbr/src/render/pbr.wgsl b/crates/bevy_pbr/src/render/pbr.wgsl index d7335aa40e..f1f628ded8 100644 --- a/crates/bevy_pbr/src/render/pbr.wgsl +++ b/crates/bevy_pbr/src/render/pbr.wgsl @@ -95,13 +95,13 @@ fn fragment( pbr_input.material.metallic = metallic; pbr_input.material.perceptual_roughness = perceptual_roughness; - var transmission: f32 = pbr_bindings::material.transmission; + var specular_transmission: f32 = pbr_bindings::material.specular_transmission; #ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED if ((pbr_bindings::material.flags & STANDARD_MATERIAL_FLAGS_TRANSMISSION_TEXTURE_BIT) != 0u) { - transmission *= textureSample(pbr_bindings::transmission_texture, pbr_bindings::transmission_sampler, uv).r; + specular_transmission *= textureSample(pbr_bindings::transmission_texture, pbr_bindings::transmission_sampler, uv).r; } #endif - pbr_input.material.transmission = transmission; + pbr_input.material.specular_transmission = specular_transmission; var thickness: f32 = pbr_bindings::material.thickness; #ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED diff --git a/crates/bevy_pbr/src/render/pbr_functions.wgsl b/crates/bevy_pbr/src/render/pbr_functions.wgsl index 69f125ace2..e97a5980a8 100644 --- a/crates/bevy_pbr/src/render/pbr_functions.wgsl +++ b/crates/bevy_pbr/src/render/pbr_functions.wgsl @@ -189,9 +189,9 @@ fn pbr( let ior = in.material.ior; let thickness = in.material.thickness; let diffuse_transmission = in.material.diffuse_transmission; - let transmission = in.material.transmission; + let specular_transmission = in.material.specular_transmission; - let transmissive_color = transmission * in.material.base_color.rgb; + let specular_transmissive_color = specular_transmission * in.material.base_color.rgb; let occlusion = in.occlusion; @@ -206,10 +206,10 @@ fn pbr( let F0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + output_color.rgb * metallic; // Diffuse strength is inversely related to metallicity, specular and diffuse transmission - let diffuse_color = output_color.rgb * (1.0 - metallic) * (1.0 - transmission) * (1.0 - diffuse_transmission); + let diffuse_color = output_color.rgb * (1.0 - metallic) * (1.0 - specular_transmission) * (1.0 - diffuse_transmission); // Diffuse transmissive strength is inversely related to metallicity and specular transmission, but directly related to diffuse transmission - let diffuse_transmissive_color = output_color.rgb * (1.0 - metallic) * (1.0 - transmission) * diffuse_transmission; + let diffuse_transmissive_color = output_color.rgb * (1.0 - metallic) * (1.0 - specular_transmission) * diffuse_transmission; // Calculate the world position of the second Lambertian lobe used for diffuse transmission, by subtracting material thickness let diffuse_transmissive_lobe_world_position = in.world_position - vec4(in.world_normal, 0.0) * thickness; @@ -350,10 +350,10 @@ fn pbr( indirect_light += (environment_light.diffuse * occlusion) + environment_light.specular; // we'll use the specular component of the transmitted environment - // light in the call to `transmissive_light()` below - var transmitted_environment_light_specular = vec3(0.0); + // light in the call to `specular_transmissive_light()` below + var specular_transmitted_environment_light = vec3(0.0); - if diffuse_transmission > 0.0 || transmission > 0.0 { + if diffuse_transmission > 0.0 || specular_transmission > 0.0 { // NOTE: We use the diffuse transmissive color, inverted normal and view vectors, // and the following simplified values for the transmitted environment light contribution // approximation: @@ -371,18 +371,18 @@ fn pbr( let transmitted_environment_light = bevy_pbr::environment_map::environment_map_light(perceptual_roughness, roughness, diffuse_transmissive_color, 1.0, vec2(0.1), -in.N, T, vec3(0.16)); transmitted_light += transmitted_environment_light.diffuse; - transmitted_environment_light_specular = transmitted_environment_light.specular; + specular_transmitted_environment_light = transmitted_environment_light.specular; } #else // If there's no environment map light, there's no transmitted environment // light specular component, so we can just hardcode it to zero. - let transmitted_environment_light_specular = vec3(0.0); + let specular_transmitted_environment_light = vec3(0.0); #endif let emissive_light = emissive.rgb * output_color.a; - if transmission > 0.0 { - transmitted_light += lighting::transmissive_light(in.world_position, in.frag_coord.xyz, view_z, in.N, in.V, ior, thickness, perceptual_roughness, transmissive_color, transmitted_environment_light_specular).rgb; + if specular_transmission > 0.0 { + transmitted_light += lighting::specular_transmissive_light(in.world_position, in.frag_coord.xyz, view_z, in.N, in.V, ior, thickness, perceptual_roughness, specular_transmissive_color, specular_transmitted_environment_light).rgb; } if (in.material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_ATTENUATION_ENABLED_BIT) != 0u { diff --git a/crates/bevy_pbr/src/render/pbr_lighting.wgsl b/crates/bevy_pbr/src/render/pbr_lighting.wgsl index a0bbc36c40..af669c9fd0 100644 --- a/crates/bevy_pbr/src/render/pbr_lighting.wgsl +++ b/crates/bevy_pbr/src/render/pbr_lighting.wgsl @@ -286,7 +286,7 @@ fn directional_light(light_id: u32, roughness: f32, NdotV: f32, normal: vec3, frag_coord: vec3, view_z: f32, N: vec3, V: vec3, ior: f32, thickness: f32, perceptual_roughness: f32, transmissive_color: vec3, transmitted_environment_light_specular: vec3) -> vec3 { +fn specular_transmissive_light(world_position: vec4, frag_coord: vec3, view_z: f32, N: vec3, V: vec3, ior: f32, thickness: f32, perceptual_roughness: f32, specular_transmissive_color: vec3, transmitted_environment_light_specular: vec3) -> vec3 { // Calculate the ratio between refaction indexes. Assume air/vacuum for the space outside the mesh let eta = 1.0 / ior; @@ -310,9 +310,9 @@ fn transmissive_light(world_position: vec4, frag_coord: vec3, view_z: // Fetch background color let background_color = fetch_transmissive_background(offset_position, frag_coord, view_z, perceptual_roughness); - // Calculate final color by applying transmissive color to a mix of background color and transmitted specular environment light + // Calculate final color by applying specular transmissive color to a mix of background color and transmitted specular environment light // TODO: Add support for attenuationColor and attenuationDistance - return transmissive_color * mix(transmitted_environment_light_specular, background_color.rgb, background_color.a); + return specular_transmissive_color * mix(transmitted_environment_light_specular, background_color.rgb, background_color.a); } // https://blog.demofox.org/2022/01/01/interleaved-gradient-noise-a-different-kind-of-low-discrepancy-sequence diff --git a/crates/bevy_pbr/src/render/pbr_types.wgsl b/crates/bevy_pbr/src/render/pbr_types.wgsl index 7934b84418..9cf04280b9 100644 --- a/crates/bevy_pbr/src/render/pbr_types.wgsl +++ b/crates/bevy_pbr/src/render/pbr_types.wgsl @@ -7,7 +7,7 @@ struct StandardMaterial { metallic: f32, reflectance: f32, diffuse_transmission: f32, - transmission: f32, + specular_transmission: f32, thickness: f32, ior: f32, attenuation_distance: f32, @@ -55,7 +55,7 @@ fn standard_material_new() -> StandardMaterial { material.metallic = 0.00; material.reflectance = 0.5; material.diffuse_transmission = 0.0; - material.transmission = 0.0; + material.specular_transmission = 0.0; material.thickness = 0.0; material.ior = 1.5; material.attenuation_distance = 1.0; diff --git a/examples/3d/transmission.rs b/examples/3d/transmission.rs index 70bfa4bf30..06a7ce8c91 100644 --- a/examples/3d/transmission.rs +++ b/examples/3d/transmission.rs @@ -5,7 +5,7 @@ //! | Key Binding | Action | //! |:-------------------|:------------------------------------------| //! | `1` / `2` | Decrease / Increase Diffuse Transmission | -//! | `Q` / `W` | Decrease / Increase Transmission | +//! | `Q` / `W` | Decrease / Increase Specular Transmission | //! | `A` / `S` | Decrease / Increase Thickness | //! | `Z` / `X` | Decrease / Increase IOR | //! | `E` / `R` | Decrease / Increase Perceptual Roughness | @@ -96,7 +96,7 @@ fn setup( }, ExampleControls { color: true, - transmission: false, + specular_transmission: false, diffuse_transmission: false, }, )); @@ -116,7 +116,7 @@ fn setup( }, ExampleControls { color: true, - transmission: false, + specular_transmission: false, diffuse_transmission: false, }, )); @@ -138,7 +138,7 @@ fn setup( NotTransmittedShadowReceiver, ExampleControls { color: true, - transmission: false, + specular_transmission: false, diffuse_transmission: true, }, )); @@ -165,7 +165,7 @@ fn setup( mesh: icosphere_mesh.clone(), material: materials.add(StandardMaterial { base_color: Color::WHITE, - transmission: 0.9, + specular_transmission: 0.9, diffuse_transmission: 1.0, thickness: 1.8, ior: 1.5, @@ -178,7 +178,7 @@ fn setup( NotTransmittedShadowReceiver, ExampleControls { color: true, - transmission: true, + specular_transmission: true, diffuse_transmission: false, }, )); @@ -189,7 +189,7 @@ fn setup( mesh: icosphere_mesh.clone(), material: materials.add(StandardMaterial { base_color: Color::RED, - transmission: 0.9, + specular_transmission: 0.9, diffuse_transmission: 1.0, thickness: 1.8, ior: 1.5, @@ -202,7 +202,7 @@ fn setup( NotTransmittedShadowReceiver, ExampleControls { color: true, - transmission: true, + specular_transmission: true, diffuse_transmission: false, }, )); @@ -213,7 +213,7 @@ fn setup( mesh: icosphere_mesh.clone(), material: materials.add(StandardMaterial { base_color: Color::GREEN, - transmission: 0.9, + specular_transmission: 0.9, diffuse_transmission: 1.0, thickness: 1.8, ior: 1.5, @@ -226,7 +226,7 @@ fn setup( NotTransmittedShadowReceiver, ExampleControls { color: true, - transmission: true, + specular_transmission: true, diffuse_transmission: false, }, )); @@ -237,7 +237,7 @@ fn setup( mesh: icosphere_mesh, material: materials.add(StandardMaterial { base_color: Color::BLUE, - transmission: 0.9, + specular_transmission: 0.9, diffuse_transmission: 1.0, thickness: 1.8, ior: 1.5, @@ -250,7 +250,7 @@ fn setup( NotTransmittedShadowReceiver, ExampleControls { color: true, - transmission: true, + specular_transmission: true, diffuse_transmission: false, }, )); @@ -285,7 +285,7 @@ fn setup( }, ExampleControls { color: true, - transmission: false, + specular_transmission: false, diffuse_transmission: false, }, )); @@ -311,7 +311,7 @@ fn setup( ..default() }, ExampleControls { - transmission: false, + specular_transmission: false, color: false, diffuse_transmission: true, }, @@ -396,13 +396,13 @@ struct Flicker; #[derive(Component)] struct ExampleControls { diffuse_transmission: bool, - transmission: bool, + specular_transmission: bool, color: bool, } struct ExampleState { diffuse_transmission: f32, - transmission: f32, + specular_transmission: f32, thickness: f32, ior: f32, perceptual_roughness: f32, @@ -415,7 +415,7 @@ impl Default for ExampleState { fn default() -> Self { ExampleState { diffuse_transmission: 0.5, - transmission: 0.9, + specular_transmission: 0.9, thickness: 1.8, ior: 1.5, perceptual_roughness: 0.12, @@ -450,9 +450,9 @@ fn example_control_system( } if input.pressed(KeyCode::W) { - state.transmission = (state.transmission + time.delta_seconds()).min(1.0); + state.specular_transmission = (state.specular_transmission + time.delta_seconds()).min(1.0); } else if input.pressed(KeyCode::Q) { - state.transmission = (state.transmission - time.delta_seconds()).max(0.0); + state.specular_transmission = (state.specular_transmission - time.delta_seconds()).max(0.0); } if input.pressed(KeyCode::S) { @@ -477,8 +477,8 @@ fn example_control_system( for (material_handle, controls) in &controllable { let material = materials.get_mut(material_handle).unwrap(); - if controls.transmission { - material.transmission = state.transmission; + if controls.specular_transmission { + material.specular_transmission = state.specular_transmission; material.thickness = state.thickness; material.ior = state.ior; material.perceptual_roughness = state.perceptual_roughness; @@ -556,7 +556,7 @@ fn example_control_system( "N/A" }, state.diffuse_transmission, - state.transmission, + state.specular_transmission, state.thickness, state.ior, state.perceptual_roughness,