From ad78123e234d96a24a857ecdda3625020a2af6d7 Mon Sep 17 00:00:00 2001 From: Luo Zhiaho Date: Mon, 27 Apr 2026 22:12:50 +0800 Subject: [PATCH 1/3] Merge LTC and DFG LUTs into a texture array --- Cargo.toml | 3 - crates/bevy_internal/Cargo.toml | 3 - crates/bevy_pbr/Cargo.toml | 6 +- crates/bevy_pbr/src/environment_map/dfg.ktx2 | Bin 13904 -> 0 bytes crates/bevy_pbr/src/lib.rs | 71 ++++-------------- crates/bevy_pbr/src/ltc/ltc1.ktx2 | Bin 28776 -> 0 bytes crates/bevy_pbr/src/ltc/ltc2.ktx2 | Bin 17276 -> 0 bytes crates/bevy_pbr/src/ltc_dfg/ltc_dfg.ktx2 | Bin 0 -> 58348 bytes crates/bevy_pbr/src/render/mesh.rs | 3 - .../bevy_pbr/src/render/mesh_view_bindings.rs | 55 ++++---------- .../src/render/mesh_view_bindings.wgsl | 9 +-- crates/bevy_pbr/src/render/pbr_lighting.wgsl | 21 ++---- crates/bevy_pbr/src/ssr/mod.rs | 3 - crates/bevy_solari/Cargo.toml | 4 +- crates/bevy_solari/src/scene/binder.rs | 18 ++++- docs/cargo_features.md | 1 - 16 files changed, 56 insertions(+), 141 deletions(-) delete mode 100644 crates/bevy_pbr/src/environment_map/dfg.ktx2 delete mode 100644 crates/bevy_pbr/src/ltc/ltc1.ktx2 delete mode 100644 crates/bevy_pbr/src/ltc/ltc2.ktx2 create mode 100644 crates/bevy_pbr/src/ltc_dfg/ltc_dfg.ktx2 diff --git a/Cargo.toml b/Cargo.toml index 66be632d7ad42..d5a5b33e14867 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -572,9 +572,6 @@ smaa_luts = ["bevy_internal/smaa_luts"] # Include spatio-temporal blue noise KTX2 file used by generated environment maps, Solari and atmosphere bluenoise_texture = ["bevy_internal/bluenoise_texture"] -# Include a preintegrated BRDF Look Up Table for more accurate specular shading. -dfg_lut = ["bevy_internal/dfg_lut"] - # NVIDIA Deep Learning Super Sampling dlss = ["bevy_internal/dlss"] diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 36943d996b107..2c679515f4337 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -82,9 +82,6 @@ smaa_luts = ["bevy_anti_alias?/smaa_luts", "ktx2", "bevy_image/zstd"] # Include Bluenoise texture for environment map generation. bluenoise_texture = ["bevy_pbr?/bluenoise_texture", "ktx2", "bevy_image/zstd"] -# Include a preintegrated BRDF Look Up Table for more accurate specular shading. -dfg_lut = ["bevy_pbr?/dfg_lut", "ktx2", "bevy_image/zstd"] - # NVIDIA Deep Learning Super Sampling dlss = ["bevy_anti_alias/dlss", "bevy_solari?/dlss"] diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index e370e93d38dbb..1fd56bf7ddaaa 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -21,7 +21,6 @@ experimental_pbr_pcss = ["bevy_light/experimental_pbr_pcss"] pbr_clustered_decals = [] pbr_light_textures = [] bluenoise_texture = ["bevy_image/ktx2", "bevy_image/zstd"] -dfg_lut = ["bevy_image/ktx2", "bevy_image/zstd"] shader_format_glsl = ["bevy_shader/shader_format_glsl"] trace = ["bevy_render/trace"] # Enables the meshlet renderer for dense high-poly scenes (experimental) @@ -47,7 +46,10 @@ bevy_ecs = { path = "../bevy_ecs", version = "0.19.0-dev" } bevy_gltf = { path = "../bevy_gltf", version = "0.19.0-dev", optional = true } bevy_light = { path = "../bevy_light", version = "0.19.0-dev" } bevy_log = { path = "../bevy_log", version = "0.19.0-dev" } -bevy_image = { path = "../bevy_image", version = "0.19.0-dev" } +bevy_image = { path = "../bevy_image", version = "0.19.0-dev", features = [ + "ktx2", + "zstd", +] } bevy_mesh = { path = "../bevy_mesh", version = "0.19.0-dev", features = [ "morph", "bevy_mikktspace", diff --git a/crates/bevy_pbr/src/environment_map/dfg.ktx2 b/crates/bevy_pbr/src/environment_map/dfg.ktx2 deleted file mode 100644 index faa32d5b3ad10dd5de30f0005413af422f91cfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13904 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, } -/// LTC (Linearly Transformed Cosines) LUT textures for area light shading. +/// A texture array with 2 LTC LUT and 1 DFG LUT +/// +/// Index 0 and 1: LTC (Linearly Transformed Cosines) LUT textures for area light shading. /// /// `ltc_1` encodes the 4 non-trivial elements of the inverse GGX LTC matrix. /// `ltc_2` encodes amplitude and Fresnel-related weights. /// /// [LUT source and fitting code](https://github.com/selfshadow/ltc_code/blob/master/fit/results) +/// +/// Index 2: The split-sum approximation LUT (`F_AB`) indexed by (`NdotV`, `perceptual_roughness`). +/// See https://github.com/bevyengine/bevy/pull/23737 for information on how the LUT was generated. #[derive(Resource, Clone)] -pub struct LtcLuts { - pub ltc_1: Handle, - pub ltc_2: Handle, -} - -// See https://github.com/bevyengine/bevy/pull/23737 for information on how the LUT was generated. -/// The split-sum approximation LUT (`F_AB`) indexed by (`NdotV`, `perceptual_roughness`). -#[derive(Resource, Clone)] -pub struct DfgLut { - pub texture: Handle, +pub struct LtcDfgLuts { + pub image: Handle, } impl Plugin for PbrPlugin { @@ -301,64 +298,28 @@ impl Plugin for PbrPlugin { } } - let has_ltc_luts = app + let has_ltc_dfg_luts = app .get_sub_app(RenderApp) - .is_some_and(|render_app| render_app.world().is_resource_added::()); + .is_some_and(|render_app| render_app.world().is_resource_added::()); - if !has_ltc_luts { + if !has_ltc_dfg_luts { let mut images = app.world_mut().resource_mut::>(); - let ltc_luts = LtcLuts { - ltc_1: images.add( - Image::from_buffer( - include_bytes!("ltc/ltc1.ktx2"), - ImageType::Extension("ktx2"), - CompressedImageFormats::NONE, - false, - ImageSampler::linear(), - RenderAssetUsages::RENDER_WORLD, - ) - .expect("Failed to decode embedded LTC LUT 1"), - ), - ltc_2: images.add( + let ltc_dfg_luts = LtcDfgLuts { + image: images.add( Image::from_buffer( - include_bytes!("ltc/ltc2.ktx2"), + include_bytes!("ltc_dfg/ltc_dfg.ktx2"), ImageType::Extension("ktx2"), CompressedImageFormats::NONE, false, ImageSampler::linear(), RenderAssetUsages::RENDER_WORLD, ) - .expect("Failed to decode embedded LTC LUT 2"), + .expect("Failed to decode embedded LTC DFG LUT"), ), }; if let Some(render_app) = app.get_sub_app_mut(RenderApp) { - render_app.world_mut().insert_resource(ltc_luts); - } - } - - let has_dfg_lut = app - .get_sub_app(RenderApp) - .is_some_and(|render_app| render_app.world().is_resource_added::()); - - if !has_dfg_lut { - #[cfg(feature = "dfg_lut")] - let texture = app.world_mut().resource_mut::>().add( - Image::from_buffer( - include_bytes!("environment_map/dfg.ktx2"), - ImageType::Extension("ktx2"), - CompressedImageFormats::NONE, - false, - ImageSampler::linear(), - RenderAssetUsages::RENDER_WORLD, - ) - .expect("Failed to decode embedded DFG LUT"), - ); - #[cfg(not(feature = "dfg_lut"))] - let texture = Handle::default(); - - if let Some(render_app) = app.get_sub_app_mut(RenderApp) { - render_app.world_mut().insert_resource(DfgLut { texture }); + render_app.world_mut().insert_resource(ltc_dfg_luts); } } diff --git a/crates/bevy_pbr/src/ltc/ltc1.ktx2 b/crates/bevy_pbr/src/ltc/ltc1.ktx2 deleted file mode 100644 index 81553fe0c1e6f3119eab902f6959e9c41d68c480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28776 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 diff --git a/crates/bevy_pbr/src/ltc/ltc2.ktx2 b/crates/bevy_pbr/src/ltc/ltc2.ktx2 deleted file mode 100644 index 616a6d0c47b48a561b5503debae78471ff7c1827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17276 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 U>WE>`Ut$B;=Pk5j+Z0p*0V0{{_W%F@ diff --git a/crates/bevy_pbr/src/ltc_dfg/ltc_dfg.ktx2 b/crates/bevy_pbr/src/ltc_dfg/ltc_dfg.ktx2 new file mode 100644 index 0000000000000000000000000000000000000000..ed49286a8c945c707db76c6d1d4f2d1d827890ac GIT binary patch literal 58348 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 literal 0 HcmV?d00001 diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 6b90cffa7149c..6dab64ee67039 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -3337,9 +3337,6 @@ impl SpecializedMeshPipeline for MeshPipeline { if cfg!(feature = "bluenoise_texture") { shader_defs.push("BLUE_NOISE_TEXTURE".into()); } - if cfg!(feature = "dfg_lut") { - shader_defs.push("DFG_LUT".into()); - } let bind_group_layout = self.get_view_layout(key.into()); let mut bind_group_layout = vec![ diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index 16a3eda5f24f0..2cad9595060c6 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -1,4 +1,4 @@ -use crate::{DfgLut, LtcLuts}; +use crate::LtcDfgLuts; use alloc::sync::Arc; use bevy_core_pipeline::{ oit::{resolve::is_oit_supported, OitBuffers, OrderIndependentTransparencySettings}, @@ -436,28 +436,14 @@ pub fn layout_entries( texture_2d_array(TextureSampleType::Float { filterable: false }), ),)); } - // LTC LUTs for area lights + // LTC LUTs for area lights and DFG LUT entries = entries.extend_with_indices(( ( 36, - texture_2d(TextureSampleType::Float { filterable: true }), - ), - ( - 37, - texture_2d(TextureSampleType::Float { filterable: true }), + texture_2d_array(TextureSampleType::Float { filterable: true }), ), - (38, sampler(SamplerBindingType::Filtering)), + (37, sampler(SamplerBindingType::Filtering)), )); - // DFG LUT - if cfg!(feature = "dfg_lut") { - entries = entries.extend_with_indices(( - ( - 39, - texture_2d(TextureSampleType::Float { filterable: true }), - ), - (40, sampler(SamplerBindingType::Filtering)), - )); - } let mut binding_array_entries = DynamicBindGroupLayoutEntries::new(ShaderStages::FRAGMENT); binding_array_entries = binding_array_entries.extend_with_indices(( (0, environment_map_entries[0]), @@ -662,16 +648,14 @@ pub fn prepare_mesh_view_bind_groups( atmosphere_buffer, atmosphere_sampler, blue_noise, - ltc_luts, - dfg_lut, + ltc_dfg_luts, ): ( Res, Res, Option>, Option>, Res, - Res, - Res, + Res, ), ) { if let ( @@ -843,26 +827,15 @@ pub fn prepare_mesh_view_bind_groups( entries = entries.extend_with_indices(((35, stbn_view),)); } - // LTC LUTs for area lights - let (ltc1_view, ltc_sampler) = images - .get(<c_luts.ltc_1) + // LTC LUTs for area lights and DFG LUT. + let (ltc_dfg_view, ltc_dfg_sampler) = images + .get(<c_dfg_luts.image) .map(|img| (&img.texture_view, &img.sampler)) - .unwrap_or((&fallback_image.d2.texture_view, &fallback_image.d2.sampler)); - let ltc2_view = images - .get(<c_luts.ltc_2) - .map(|img| &img.texture_view) - .unwrap_or(&fallback_image.d2.texture_view); - entries = - entries.extend_with_indices(((36, ltc1_view), (37, ltc2_view), (38, ltc_sampler))); - - // DFG LUT - if cfg!(feature = "dfg_lut") { - let (dfg_view, dfg_sampler) = images - .get(&dfg_lut.texture) - .map(|img| (&img.texture_view, &img.sampler)) - .unwrap_or((&fallback_image.d2.texture_view, &fallback_image.d2.sampler)); - entries = entries.extend_with_indices(((39, dfg_view), (40, dfg_sampler))); - } + .unwrap_or(( + &fallback_image.d2_array.texture_view, + &fallback_image.d2_array.sampler, + )); + entries = entries.extend_with_indices(((36, ltc_dfg_view), (37, ltc_dfg_sampler))); let mut entries_binding_array = DynamicBindGroupEntries::new(); diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl b/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl index 9311ab0d9a70d..2985678f5eb04 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl @@ -107,13 +107,8 @@ const VISIBILITY_RANGE_UNIFORM_BUFFER_SIZE: u32 = 64u; @group(0) @binding(35) var blue_noise_texture: texture_2d_array; #endif // BLUE_NOISE_TEXTURE -@group(0) @binding(36) var ltc_lut1: texture_2d; -@group(0) @binding(37) var ltc_lut2: texture_2d; -@group(0) @binding(38) var ltc_lut_sampler: sampler; -#ifdef DFG_LUT -@group(0) @binding(39) var dfg_lut: texture_2d; -@group(0) @binding(40) var dfg_lut_sampler: sampler; -#endif // DFG_LUT +@group(0) @binding(36) var ltc_dfg_lut: texture_2d_array; +@group(0) @binding(37) var ltc_dfg_lut_sampler: sampler; #ifdef MULTIPLE_LIGHT_PROBES_IN_ARRAY @group(1) @binding(0) var diffuse_environment_maps: binding_array, 8u>; diff --git a/crates/bevy_pbr/src/render/pbr_lighting.wgsl b/crates/bevy_pbr/src/render/pbr_lighting.wgsl index 5f8b6e8f635b5..e4c016335061a 100644 --- a/crates/bevy_pbr/src/render/pbr_lighting.wgsl +++ b/crates/bevy_pbr/src/render/pbr_lighting.wgsl @@ -527,18 +527,7 @@ fn Fd_Burley( // Scale/bias approximation fn F_AB(perceptual_roughness: f32, NdotV: f32) -> vec2 { -#ifdef DFG_LUT - return textureSampleLevel(view_bindings::dfg_lut, view_bindings::dfg_lut_sampler, vec2(NdotV, perceptual_roughness), 0.0).rg; -#else - // Polynomial approximation, see https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile - let c0 = vec4(-1.0, -0.0275, -0.572, 0.022); - let c1 = vec4(1.0, 0.0425, 1.04, -0.04); - let r = perceptual_roughness * c0 + c1; - let a004 = min(r.x * r.x, exp2(-9.28 * NdotV)) * r.x + r.y; - // Keep F_ab positive to avoid divide-by-zero in downstream BRDF terms. - let f_ab_epsilon = 0.00005; - return max(vec2(-1.04, 1.04) * a004 + r.zw, vec2(f_ab_epsilon)); -#endif + return textureSampleLevel(view_bindings::ltc_dfg_lut, view_bindings::ltc_dfg_lut_sampler, vec2(NdotV, perceptual_roughness), 2, 0.0).rg; } fn EnvBRDFApprox(F0: vec3, F_ab: vec2) -> vec3 { @@ -1046,8 +1035,8 @@ fn rect_light( let LUT_SCALE = 63.0 / 64.0; let LUT_BIAS = 0.5 / 64.0; let uv = vec2(perceptual_roughness, sqrt(1.0 - NdotV)) * LUT_SCALE + LUT_BIAS; - let t1 = textureSampleLevel(view_bindings::ltc_lut1, view_bindings::ltc_lut_sampler, uv, 0.0); - let t2 = textureSampleLevel(view_bindings::ltc_lut2, view_bindings::ltc_lut_sampler, uv, 0.0); + let t1 = textureSampleLevel(view_bindings::ltc_dfg_lut, view_bindings::ltc_dfg_lut_sampler, uv, 0, 0.0); + let t2 = textureSampleLevel(view_bindings::ltc_dfg_lut, view_bindings::ltc_dfg_lut_sampler, uv, 1, 0.0); // Reconstruct the GGX inverse-LTC matrix let Minv = mat3x3( @@ -1077,8 +1066,8 @@ fn rect_light( // Sample LUTs for clearcoat layer let cc_uv = vec2(clearcoat_perceptual_roughness, sqrt(1.0 - clearcoat_NdotV)) * LUT_SCALE + LUT_BIAS; - let tc1 = textureSampleLevel(view_bindings::ltc_lut1, view_bindings::ltc_lut_sampler, cc_uv, 0.0); - let tc2 = textureSampleLevel(view_bindings::ltc_lut2, view_bindings::ltc_lut_sampler, cc_uv, 0.0); + let tc1 = textureSampleLevel(view_bindings::ltc_dfg_lut, view_bindings::ltc_dfg_lut_sampler, cc_uv, 0, 0.0); + let tc2 = textureSampleLevel(view_bindings::ltc_dfg_lut, view_bindings::ltc_dfg_lut_sampler, cc_uv, 1, 0.0); let Minv_cc = mat3x3( vec3(tc1.x, 0.0, tc1.y), vec3(0.0, 1.0, 0.0), diff --git a/crates/bevy_pbr/src/ssr/mod.rs b/crates/bevy_pbr/src/ssr/mod.rs index b8b08e56eae68..1969bc50d96b1 100644 --- a/crates/bevy_pbr/src/ssr/mod.rs +++ b/crates/bevy_pbr/src/ssr/mod.rs @@ -574,9 +574,6 @@ impl SpecializedRenderPipeline for ScreenSpaceReflectionsPipeline { if cfg!(feature = "bluenoise_texture") { shader_defs.push("BLUE_NOISE_TEXTURE".into()); } - if cfg!(feature = "dfg_lut") { - shader_defs.push("DFG_LUT".into()); - } #[cfg(not(target_arch = "wasm32"))] shader_defs.push("USE_DEPTH_SAMPLERS".into()); diff --git a/crates/bevy_solari/Cargo.toml b/crates/bevy_solari/Cargo.toml index 7f8c4bee22053..8f7c902662452 100644 --- a/crates/bevy_solari/Cargo.toml +++ b/crates/bevy_solari/Cargo.toml @@ -22,9 +22,7 @@ bevy_ecs = { path = "../bevy_ecs", version = "0.19.0-dev" } bevy_shader = { path = "../bevy_shader", version = "0.19.0-dev" } bevy_math = { path = "../bevy_math", version = "0.19.0-dev" } bevy_mesh = { path = "../bevy_mesh", version = "0.19.0-dev" } -bevy_pbr = { path = "../bevy_pbr", version = "0.19.0-dev", features = [ - "dfg_lut", -] } +bevy_pbr = { path = "../bevy_pbr", version = "0.19.0-dev" } bevy_platform = { path = "../bevy_platform", version = "0.19.0-dev", default-features = false, features = [ "std", ] } diff --git a/crates/bevy_solari/src/scene/binder.rs b/crates/bevy_solari/src/scene/binder.rs index e65a4d2b9237e..f417663edb608 100644 --- a/crates/bevy_solari/src/scene/binder.rs +++ b/crates/bevy_solari/src/scene/binder.rs @@ -8,7 +8,8 @@ use bevy_ecs::{ }; use bevy_math::{ops::cos, Mat4, Vec3}; use bevy_pbr::{ - DfgLut, ExtractedDirectionalLight, MeshMaterial3d, PreviousGlobalTransform, StandardMaterial, + ExtractedDirectionalLight, LtcDfgLuts, MeshMaterial3d, PreviousGlobalTransform, + StandardMaterial, }; use bevy_platform::{collections::HashMap, hash::FixedHasher}; use bevy_render::{ @@ -48,7 +49,7 @@ pub fn prepare_raytracing_scene_bindings( material_assets: Res, texture_assets: Res>, fallback_texture: Res, - dfg_lut: Res, + ltc_dfg_luts: Res, render_device: Res, pipeline_cache: Res, render_queue: Res, @@ -268,8 +269,17 @@ pub fn prepare_raytracing_scene_bindings( render_queue.submit([command_encoder.finish()]); let (dfg_view, dfg_sampler) = texture_assets - .get(&dfg_lut.texture) - .map(|img| (&img.texture_view, &img.sampler)) + .get(<c_dfg_luts.image) + .map(|img| { + ( + &img.texture.create_view(&TextureViewDescriptor { + dimension: Some(TextureViewDimension::D2), + base_array_layer: 2, + ..Default::default() + }), + &img.sampler, + ) + }) .unwrap_or(( &fallback_texture.d2.texture_view, &fallback_texture.d2.sampler, diff --git a/docs/cargo_features.md b/docs/cargo_features.md index 724db9e1f7de0..984da206b251f 100644 --- a/docs/cargo_features.md +++ b/docs/cargo_features.md @@ -120,7 +120,6 @@ This is the complete `bevy` cargo feature list, without "profiles" or "collectio |debug_glam_assert|Enable assertions in debug builds to check the validity of parameters passed to glam| |default_font|Include a default font, containing only ASCII characters, at the cost of a 20kB binary size increase| |detailed_trace|Enable detailed trace event logging. These trace events are expensive even when off, thus they require compile time opt-in| -|dfg_lut|Include a preintegrated BRDF Look Up Table for more accurate specular shading.| |dlss|NVIDIA Deep Learning Super Sampling| |dynamic_linking|Force dynamic linking, which improves iterative compile times| |embedded_watcher|Enables watching in memory asset providers for Bevy Asset hot-reloading| From e4373814226499c870f8eec741a49f477b5c7903 Mon Sep 17 00:00:00 2001 From: Luo Zhiaho Date: Mon, 27 Apr 2026 22:33:04 +0800 Subject: [PATCH 2/3] Label textures --- crates/bevy_pbr/src/lib.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index 0b9e6821ab186..40d1e7c628deb 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -276,7 +276,7 @@ impl Plugin for PbrPlugin { let mut images = app.world_mut().resource_mut::>(); #[cfg(feature = "bluenoise_texture")] let handle = { - let image = Image::from_buffer( + let mut image = Image::from_buffer( include_bytes!("bluenoise/stbn.ktx2"), ImageType::Extension("ktx2"), CompressedImageFormats::NONE, @@ -285,6 +285,7 @@ impl Plugin for PbrPlugin { RenderAssetUsages::RENDER_WORLD, ) .expect("Failed to decode embedded blue-noise texture"); + image.texture_descriptor.label = Some("bluenoise_texture"); images.add(image) }; @@ -305,8 +306,8 @@ impl Plugin for PbrPlugin { if !has_ltc_dfg_luts { let mut images = app.world_mut().resource_mut::>(); let ltc_dfg_luts = LtcDfgLuts { - image: images.add( - Image::from_buffer( + image: images.add({ + let mut img = Image::from_buffer( include_bytes!("ltc_dfg/ltc_dfg.ktx2"), ImageType::Extension("ktx2"), CompressedImageFormats::NONE, @@ -314,8 +315,10 @@ impl Plugin for PbrPlugin { ImageSampler::linear(), RenderAssetUsages::RENDER_WORLD, ) - .expect("Failed to decode embedded LTC DFG LUT"), - ), + .expect("Failed to decode embedded LTC DFG LUT"); + img.texture_descriptor.label = Some("ltc_dfg_luts"); + img + }), }; if let Some(render_app) = app.get_sub_app_mut(RenderApp) { From 00d3423aaf894b55a5a9199cbbc8e838d47d767c Mon Sep 17 00:00:00 2001 From: Luo Zhiaho Date: Tue, 28 Apr 2026 01:40:07 +0800 Subject: [PATCH 3/3] CI --- crates/bevy_pbr/src/lib.rs | 3 ++- crates/bevy_solari/src/scene/binder.rs | 25 +++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index 40d1e7c628deb..e05890ccb1c94 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -174,7 +174,8 @@ pub struct Bluenoise { /// [LUT source and fitting code](https://github.com/selfshadow/ltc_code/blob/master/fit/results) /// /// Index 2: The split-sum approximation LUT (`F_AB`) indexed by (`NdotV`, `perceptual_roughness`). -/// See https://github.com/bevyengine/bevy/pull/23737 for information on how the LUT was generated. +/// +// See https://github.com/bevyengine/bevy/pull/23737 for information on how the DFG LUT was generated. #[derive(Resource, Clone)] pub struct LtcDfgLuts { pub image: Handle, diff --git a/crates/bevy_solari/src/scene/binder.rs b/crates/bevy_solari/src/scene/binder.rs index f417663edb608..3044c72613840 100644 --- a/crates/bevy_solari/src/scene/binder.rs +++ b/crates/bevy_solari/src/scene/binder.rs @@ -268,18 +268,19 @@ pub fn prepare_raytracing_scene_bindings( command_encoder.build_acceleration_structures(&[], [&tlas]); render_queue.submit([command_encoder.finish()]); - let (dfg_view, dfg_sampler) = texture_assets - .get(<c_dfg_luts.image) - .map(|img| { - ( - &img.texture.create_view(&TextureViewDescriptor { - dimension: Some(TextureViewDimension::D2), - base_array_layer: 2, - ..Default::default() - }), - &img.sampler, - ) - }) + let dfg_lut = texture_assets.get(<c_dfg_luts.image).map(|img| { + ( + img.texture.create_view(&TextureViewDescriptor { + dimension: Some(TextureViewDimension::D2), + base_array_layer: 2, + ..Default::default() + }), + &img.sampler, + ) + }); + let (dfg_view, dfg_sampler) = dfg_lut + .as_ref() + .map(|(dfg_view, sampler)| (dfg_view, *sampler)) .unwrap_or(( &fallback_texture.d2.texture_view, &fallback_texture.d2.sampler,