From c757497b27b16203062e97b9e5ddfd474f9f8bae Mon Sep 17 00:00:00 2001 From: Luo Zhihao Date: Mon, 4 May 2026 11:44:17 +0800 Subject: [PATCH] Gate LTC LUTs behind a feature and merge them to a texture array (#24065) # Objective Alternative to #24004. https://github.com/bevyengine/bevy/pull/23288 adds ltc luts for rect light support which implicitly requires `bevy_image/ktx2` and `bevy_image/zstd` otherwise loading ltc luts will panic. We either accept to always enable area light supoort (#24004), or add a feature to opt out it (this PR). ## Solution Gate ltc luts behind a feature and merge them to a texture array. ## Testing `rect_light` example works. --------- Co-authored-by: Kevin Chen --- .github/workflows/example-run.yml | 6 +- Cargo.toml | 6 +- _release-content/release-notes/area_lights.md | 2 + crates/bevy_internal/Cargo.toml | 3 + crates/bevy_light/src/rect_light.rs | 2 + crates/bevy_pbr/Cargo.toml | 1 + crates/bevy_pbr/src/lib.rs | 104 +++++++++++------- crates/bevy_pbr/src/ltc/ltc.ktx2 | Bin 0 -> 46171 bytes 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/render/light.rs | 7 ++ crates/bevy_pbr/src/render/mesh.rs | 3 + .../bevy_pbr/src/render/mesh_view_bindings.rs | 57 +++++----- .../src/render/mesh_view_bindings.wgsl | 13 ++- crates/bevy_pbr/src/render/pbr_functions.wgsl | 2 + crates/bevy_pbr/src/render/pbr_lighting.wgsl | 20 ++-- crates/bevy_pbr/src/ssr/mod.rs | 3 + docs/cargo_features.md | 1 + 18 files changed, 145 insertions(+), 85 deletions(-) create mode 100644 crates/bevy_pbr/src/ltc/ltc.ktx2 delete mode 100644 crates/bevy_pbr/src/ltc/ltc1.ktx2 delete mode 100644 crates/bevy_pbr/src/ltc/ltc2.ktx2 diff --git a/.github/workflows/example-run.yml b/.github/workflows/example-run.yml index bae8d677ed..82462039ee 100644 --- a/.github/workflows/example-run.yml +++ b/.github/workflows/example-run.yml @@ -52,7 +52,7 @@ jobs: example_name=`basename $example .ron` echo -n $example_name > last_example_run echo "running $example_name - "`date` - time TRACE_CHROME=trace-$example_name.json CI_TESTING_CONFIG=$example cargo run --example $example_name --features "bevy_ci_testing,trace,trace_chrome,bevy_ui_debug" + time TRACE_CHROME=trace-$example_name.json CI_TESTING_CONFIG=$example cargo run --example $example_name --features "bevy_ci_testing,trace,trace_chrome,bevy_ui_debug,area_light_luts" sleep 10 if [ `find ./ -maxdepth 1 -name 'screenshot-*.png' -print -quit` ]; then mkdir screenshots-$example_name @@ -132,7 +132,7 @@ jobs: example_name=`basename $example .ron` echo -n $example_name > last_example_run echo "running $example_name - "`date` - time TRACE_CHROME=trace-$example_name.json CI_TESTING_CONFIG=$example xvfb-run cargo run --example $example_name --features "bevy_ci_testing,trace,trace_chrome,bevy_ui_debug" + time TRACE_CHROME=trace-$example_name.json CI_TESTING_CONFIG=$example xvfb-run cargo run --example $example_name --features "bevy_ci_testing,trace,trace_chrome,bevy_ui_debug,area_light_luts" sleep 10 if [ `find ./ -maxdepth 1 -name 'screenshot-*.png' -print -quit` ]; then mkdir screenshots-$example_name @@ -202,7 +202,7 @@ jobs: example_name=`basename $example .ron` echo -n $example_name > last_example_run echo "running $example_name - "`date` - time WGPU_BACKEND=dx12 TRACE_CHROME=trace-$example_name.json CI_TESTING_CONFIG=$example cargo run --example $example_name --features "statically-linked-dxc,bevy_ci_testing,trace,trace_chrome,bevy_ui_debug" + time WGPU_BACKEND=dx12 TRACE_CHROME=trace-$example_name.json CI_TESTING_CONFIG=$example cargo run --example $example_name --features "statically-linked-dxc,bevy_ci_testing,trace,trace_chrome,bevy_ui_debug,area_light_luts" sleep 10 if [ `find ./ -maxdepth 1 -name 'screenshot-*.png' -print -quit` ]; then mkdir screenshots-$example_name diff --git a/Cargo.toml b/Cargo.toml index 78189d6874..0c160b3aea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -574,6 +574,9 @@ bluenoise_texture = ["bevy_internal/bluenoise_texture"] # Include a preintegrated BRDF Look Up Table for more accurate specular shading. dfg_lut = ["bevy_internal/dfg_lut"] +# Include Look Up Tables that are required for area lights. +area_light_luts = ["bevy_internal/area_light_luts"] + # NVIDIA Deep Learning Super Sampling dlss = ["bevy_internal/dlss"] @@ -1190,7 +1193,7 @@ wasm = true name = "rect_light" path = "examples/3d/rect_light.rs" doc-scrape-examples = true -required-features = ["free_camera"] +required-features = ["free_camera", "area_light_luts"] [package.metadata.example.rect_light] name = "Rectangular Area Light" @@ -5192,6 +5195,7 @@ hidden = true name = "testbed_3d" path = "examples/testbed/3d.rs" doc-scrape-examples = true +required-features = ["area_light_luts"] [package.metadata.example.testbed_3d] hidden = true diff --git a/_release-content/release-notes/area_lights.md b/_release-content/release-notes/area_lights.md index e7d9d37fce..c6cc3d4922 100644 --- a/_release-content/release-notes/area_lights.md +++ b/_release-content/release-notes/area_lights.md @@ -12,4 +12,6 @@ The implementation uses [Linearly Transformed Cosines](https://eheitzresearch.wo Rectangular lights currently don't cast shadows or have support for anisotropic materials. +You need to enable the `area_light_luts` cargo feature to use it. + Check out [the new example](https://github.com/bevyengine/bevy/tree/latest/examples/3d/rect_light.rs) to see them in action. diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 36943d996b..eeca37f7c4 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -85,6 +85,9 @@ 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"] +# Include Look Up Tables that are required for area lights. +area_light_luts = ["bevy_pbr?/area_light_luts", "ktx2", "bevy_image/zstd"] + # NVIDIA Deep Learning Super Sampling dlss = ["bevy_anti_alias/dlss", "bevy_solari?/dlss"] diff --git a/crates/bevy_light/src/rect_light.rs b/crates/bevy_light/src/rect_light.rs index e83f43c0e6..17b7e805c7 100644 --- a/crates/bevy_light/src/rect_light.rs +++ b/crates/bevy_light/src/rect_light.rs @@ -13,6 +13,8 @@ use crate::light_consts; /// /// Shadow maps are currently unsupported, objects illuminated by a /// ``RectLight`` will not cast shadows. +/// +/// Note: Requires the `area_light_luts` cargo feature. #[derive(Component, Debug, Clone, Copy, Reflect)] #[reflect(Component, Default, Debug, Clone)] #[require(Transform, Visibility, VisibilityClass)] diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index d3097ab67c..41a5ac1901 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -22,6 +22,7 @@ pbr_clustered_decals = [] pbr_light_textures = [] bluenoise_texture = ["bevy_image/ktx2", "bevy_image/zstd"] dfg_lut = ["bevy_image/ktx2", "bevy_image/zstd"] +area_light_luts = ["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) diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index f30c365f54..a734d08dbe 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -107,14 +107,14 @@ use bevy_asset::{AssetApp, AssetPath, Assets, Handle, RenderAssetUsages}; use bevy_core_pipeline::mip_generation::experimental::depth::early_downsample_depth; use bevy_core_pipeline::schedule::{Core3d, Core3dSystems}; use bevy_ecs::prelude::*; -use bevy_image::{CompressedImageFormats, Image, ImageSampler, ImageType}; +use bevy_image::{Image, ImageSampler}; use bevy_material::AlphaMode; use bevy_render::{ camera::sort_cameras, extract_resource::ExtractResourcePlugin, render_resource::{ Extent3d, TextureDataOrder, TextureDescriptor, TextureDimension, TextureFormat, - TextureUsages, + TextureUsages, TextureViewDescriptor, TextureViewDimension, }, sync_component::SyncComponentPlugin, ExtractSchedule, GpuResourceAppExt, Render, RenderApp, RenderDebugFlags, RenderStartup, @@ -169,14 +169,14 @@ pub struct Bluenoise { /// 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. +/// It is a texture array containing 2 LUT textures: +/// The first entry encodes the 4 non-trivial elements of the inverse GGX LTC matrix. +/// The second entry encodes amplitude and Fresnel-related weights. /// /// [LUT source and fitting code](https://github.com/selfshadow/ltc_code/blob/master/fit/results) #[derive(Resource, Clone)] -pub struct LtcLuts { - pub ltc_1: Handle, - pub ltc_2: Handle, +pub struct AreaLightLuts { + pub image: Handle, } // See https://github.com/bevyengine/bevy/pull/23737 for information on how the LUT was generated. @@ -282,15 +282,16 @@ 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, + bevy_image::ImageType::Extension("ktx2"), + bevy_image::CompressedImageFormats::NONE, false, ImageSampler::Default, RenderAssetUsages::RENDER_WORLD, ) .expect("Failed to decode embedded blue-noise texture"); + image.texture_descriptor.label = Some("bluenoise"); images.add(image) }; @@ -304,39 +305,32 @@ impl Plugin for PbrPlugin { } } - let has_ltc_luts = app + let has_area_light_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_area_light_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( - Image::from_buffer( - include_bytes!("ltc/ltc2.ktx2"), - ImageType::Extension("ktx2"), - CompressedImageFormats::NONE, - false, - ImageSampler::linear(), - RenderAssetUsages::RENDER_WORLD, - ) - .expect("Failed to decode embedded LTC LUT 2"), - ), + #[cfg(feature = "area_light_luts")] + let handle = { + let mut image = Image::from_buffer( + include_bytes!("ltc/ltc.ktx2"), + bevy_image::ImageType::Extension("ktx2"), + bevy_image::CompressedImageFormats::NONE, + false, + ImageSampler::linear(), + RenderAssetUsages::RENDER_WORLD, + ) + .expect("Failed to decode embedded LTC LUTs"); + image.texture_descriptor.label = Some("area_light_luts"); + images.add(image) }; + #[cfg(not(feature = "area_light_luts"))] + let handle = images.add(area_light_luts_placeholder()); + let area_light_luts = AreaLightLuts { image: handle }; if let Some(render_app) = app.get_sub_app_mut(RenderApp) { - render_app.world_mut().insert_resource(ltc_luts); + render_app.world_mut().insert_resource(area_light_luts); } } @@ -349,8 +343,8 @@ impl Plugin for PbrPlugin { let texture = app.world_mut().resource_mut::>().add( Image::from_buffer( include_bytes!("environment_map/dfg.ktx2"), - ImageType::Extension("ktx2"), - CompressedImageFormats::NONE, + bevy_image::ImageType::Extension("ktx2"), + bevy_image::CompressedImageFormats::NONE, false, ImageSampler::linear(), RenderAssetUsages::RENDER_WORLD, @@ -468,7 +462,7 @@ pub fn stbn_placeholder() -> Image { size: Extent3d::default(), format, dimension: TextureDimension::D2, - label: None, + label: Some("bluenoise_placeholder"), mip_level_count: 1, sample_count: 1, usage: TextureUsages::TEXTURE_BINDING, @@ -481,6 +475,36 @@ pub fn stbn_placeholder() -> Image { } } +pub fn area_light_luts_placeholder() -> Image { + let format = TextureFormat::Rgba16Float; + let data = vec![0; 16]; + Image { + data: Some(data), + data_order: TextureDataOrder::default(), + texture_descriptor: TextureDescriptor { + size: Extent3d { + width: 1, + height: 1, + depth_or_array_layers: 2, + }, + format, + dimension: TextureDimension::D2, + label: Some("area_light_luts_placeholder"), + mip_level_count: 1, + sample_count: 1, + usage: TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }, + sampler: ImageSampler::Default, + texture_view_descriptor: Some(TextureViewDescriptor { + dimension: Some(TextureViewDimension::D2Array), + ..Default::default() + }), + asset_usage: RenderAssetUsages::RENDER_WORLD, + copy_on_resize: false, + } +} + impl SyncComponent for DirectionalLight { type Target = ( Self, diff --git a/crates/bevy_pbr/src/ltc/ltc.ktx2 b/crates/bevy_pbr/src/ltc/ltc.ktx2 new file mode 100644 index 0000000000000000000000000000000000000000..97d6f87937575b5db0a6cadee87d5d308fd2b817 GIT binary patch literal 46171 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 MQOV=RO^YX|23yu`u>b%7 literal 0 HcmV?d00001 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/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 36f44d0fd3..bfd67faac1 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -420,6 +420,7 @@ pub fn extract_lights( &mut RenderExtractedShadowMapVisibleEntities, &mut RenderShadowMapVisibleEntities, )>, + mut rect_light_missing_luts_warning_emitted: Local, ) { let mapper = &visibility_extraction_system_param.mapper; @@ -824,6 +825,12 @@ pub fn extract_lights( } for (main_entity, render_entity, rect_light, transform, view_visibility) in &rect_lights { + if !cfg!(feature = "area_light_luts") && !*rect_light_missing_luts_warning_emitted { + warn!( + "RectLight will not work properly because the `area_light_luts` cargo feature is not enabled." + ); + *rect_light_missing_luts_warning_emitted = true; + } if !view_visibility.get() { if let Ok(mut entity_commands) = commands.get_entity(render_entity) { entity_commands.remove::(); diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 032c80a483..ad1981542d 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -3344,6 +3344,9 @@ impl SpecializedMeshPipeline for MeshPipeline { if cfg!(feature = "dfg_lut") { shader_defs.push("DFG_LUT".into()); } + if cfg!(feature = "area_light_luts") { + shader_defs.push("AREA_LIGHT_LUTS".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 fc1a8c75f8..37e4b85a4e 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -1,5 +1,5 @@ use crate::{ - DfgLut, LtcLuts, ScreenSpaceTransmission, ViewEnvironmentMapUniformOffset, + AreaLightLuts, DfgLut, ScreenSpaceTransmission, ViewEnvironmentMapUniformOffset, ViewFogUniformOffset, ViewLightProbesUniformOffset, ViewLightsUniformOffset, ViewScreenSpaceReflectionsUniformOffset, }; @@ -97,6 +97,7 @@ bitflags::bitflags! { const SCREEN_SPACE_TRANSMISSION = 1 << 13; const CONTACT_SHADOWS = 1 << 14; const DISTANCE_FOG = 1 << 15; + const AREA_LIGHT_LUTS = 1 << 16; } } @@ -150,6 +151,10 @@ impl From for MeshPipelineViewLayoutKey { result |= MeshPipelineViewLayoutKey::STBN; } + if cfg!(feature = "area_light_luts") { + result |= MeshPipelineViewLayoutKey::AREA_LIGHT_LUTS; + } + if value.contains(MeshPipelineKey::TONEMAP_IN_SHADER) { result |= MeshPipelineViewLayoutKey::TONEMAP_IN_SHADER; } @@ -462,25 +467,23 @@ fn layout_entries( ),)); } // LTC LUTs for area lights - entries = entries.extend_with_indices(( - ( - 36, - texture_2d(TextureSampleType::Float { filterable: true }), - ), - ( - 37, - texture_2d(TextureSampleType::Float { filterable: true }), - ), - (38, sampler(SamplerBindingType::Filtering)), - )); + if cfg!(feature = "area_light_luts") { + entries = entries.extend_with_indices(( + ( + 36, + texture_2d_array(TextureSampleType::Float { filterable: true }), + ), + (37, sampler(SamplerBindingType::Filtering)), + )); + } // DFG LUT if cfg!(feature = "dfg_lut") { entries = entries.extend_with_indices(( ( - 39, + 38, texture_2d(TextureSampleType::Float { filterable: true }), ), - (40, sampler(SamplerBindingType::Filtering)), + (39, sampler(SamplerBindingType::Filtering)), )); } @@ -678,7 +681,7 @@ pub fn prepare_mesh_view_bind_groups( atmosphere_buffer, atmosphere_sampler, blue_noise, - ltc_luts, + area_light_luts, dfg_lut, ): ( Res, @@ -686,7 +689,7 @@ pub fn prepare_mesh_view_bind_groups( Option>, Option>, Res, - Res, + Res, Res, ), // TODO: Figure out how to reuse the memory. `BindGroupEntry` is non-send on wasm with atomics. @@ -896,16 +899,16 @@ pub fn prepare_mesh_view_bind_groups( }; // LTC LUTs for area lights - let (ltc1_view, ltc_sampler) = images - .get(<c_luts.ltc_1) - .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))); + if cfg!(feature = "area_light_luts") { + let (ltc_view, ltc_sampler) = images + .get(&area_light_luts.image) + .map(|img| (&img.texture_view, &img.sampler)) + .unwrap_or(( + &fallback_image.d2_array.texture_view, + &fallback_image.d2_array.sampler, + )); + entries = entries.extend_with_indices(((36, ltc_view), (37, ltc_sampler))); + } // DFG LUT if cfg!(feature = "dfg_lut") { @@ -913,7 +916,7 @@ pub fn prepare_mesh_view_bind_groups( .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))); + entries = entries.extend_with_indices(((38, dfg_view), (39, dfg_sampler))); } let environment_map_bind_group_entries = diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl b/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl index f4a1efbbe4..93fc3af33e 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.wgsl @@ -121,16 +121,19 @@ const VISIBILITY_RANGE_UNIFORM_BUFFER_SIZE: u32 = 64u; @group(0) @binding(33) var atmosphere_transmittance_sampler: sampler; @group(0) @binding(34) var atmosphere: atmosphere_types::Atmosphere; #endif // ATMOSPHERE + #ifdef BLUE_NOISE_TEXTURE @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 AREA_LIGHT_LUTS +@group(0) @binding(36) var area_light_luts: texture_2d_array; +@group(0) @binding(37) var area_light_luts_sampler: sampler; +#endif + #ifdef DFG_LUT -@group(0) @binding(39) var dfg_lut: texture_2d; -@group(0) @binding(40) var dfg_lut_sampler: sampler; +@group(0) @binding(38) var dfg_lut: texture_2d; +@group(0) @binding(39) var dfg_lut_sampler: sampler; #endif // DFG_LUT #ifdef ENVIRONMENT_MAP diff --git a/crates/bevy_pbr/src/render/pbr_functions.wgsl b/crates/bevy_pbr/src/render/pbr_functions.wgsl index cf2df3a0b2..dc77a38361 100644 --- a/crates/bevy_pbr/src/render/pbr_functions.wgsl +++ b/crates/bevy_pbr/src/render/pbr_functions.wgsl @@ -657,6 +657,7 @@ fn apply_pbr_lighting( #endif } +#ifdef AREA_LIGHT_LUTS // Rect lights let n_rect_lights = view_bindings::lights.n_rect_lights; for (var i: u32 = 0u; i < n_rect_lights; i = i + 1u) { @@ -670,6 +671,7 @@ fn apply_pbr_lighting( transmitted_light += transmitted_light_contrib; #endif } +#endif #ifdef STANDARD_MATERIAL_DIFFUSE_TRANSMISSION // NOTE: We use the diffuse transmissive color, the second Lambertian lobe's calculated diff --git a/crates/bevy_pbr/src/render/pbr_lighting.wgsl b/crates/bevy_pbr/src/render/pbr_lighting.wgsl index 5f8b6e8f63..e9fb29ee34 100644 --- a/crates/bevy_pbr/src/render/pbr_lighting.wgsl +++ b/crates/bevy_pbr/src/render/pbr_lighting.wgsl @@ -84,7 +84,7 @@ struct LightingInput { // Specular reflectance at the normal incidence angle. F0_dielectric: vec3, F0_metallic: vec3, - + // Constants for the BRDF approximation. // // See `EnvBRDFApprox` in @@ -930,7 +930,7 @@ color *= (*light).color.rgb * texture_sample; // Sample atmosphere let transmittance = sample_transmittance_lut(r, mu_light); let sun_visibility = calculate_visible_sun_ratio(atmosphere, r, mu_light, (*light).sun_disk_angular_size); - + // Apply atmospheric effects color *= transmittance * sun_visibility; #endif @@ -983,12 +983,12 @@ fn ltc_integrate_quad( let a = L[i]; let b = L[(i + 1) % 4]; if (a.z >= 0.0) { - clipped[n_clipped] = a; + clipped[n_clipped] = a; n_clipped++; } if ((a.z >= 0.0) != (b.z >= 0.0)) { let t = a.z / (a.z - b.z); - clipped[n_clipped] = mix(a, b, t); + clipped[n_clipped] = mix(a, b, t); n_clipped++; } } @@ -1010,6 +1010,7 @@ fn ltc_integrate_quad( return sum; } +#ifdef AREA_LIGHT_LUTS fn rect_light( light_id: u32, input: ptr, @@ -1046,8 +1047,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::area_light_luts, view_bindings::area_light_luts_sampler, uv, 0, 0.0); + let t2 = textureSampleLevel(view_bindings::area_light_luts, view_bindings::area_light_luts_sampler, uv, 1, 0.0); // Reconstruct the GGX inverse-LTC matrix let Minv = mat3x3( @@ -1077,8 +1078,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::area_light_luts, view_bindings::area_light_luts_sampler, cc_uv, 0, 0.0); + let tc2 = textureSampleLevel(view_bindings::area_light_luts, view_bindings::area_light_luts_sampler, cc_uv, 1, 0.0); let Minv_cc = mat3x3( vec3(tc1.x, 0.0, tc1.y), vec3(0.0, 1.0, 0.0), @@ -1097,13 +1098,14 @@ fn rect_light( return (spec_weight * spec + diffuse_color * diff) * (*light).color.rgb * range_falloff; #endif } +#endif #ifdef ATMOSPHERE fn sample_transmittance_lut(r: f32, mu: f32) -> vec3 { let uv = transmittance_lut_r_mu_to_uv(view_bindings::atmosphere, r, mu); return textureSampleLevel( - view_bindings::atmosphere_transmittance_texture, + view_bindings::atmosphere_transmittance_texture, view_bindings::atmosphere_transmittance_sampler, uv, 0.0).rgb; } #endif // ATMOSPHERE diff --git a/crates/bevy_pbr/src/ssr/mod.rs b/crates/bevy_pbr/src/ssr/mod.rs index 817251f891..1de696857d 100644 --- a/crates/bevy_pbr/src/ssr/mod.rs +++ b/crates/bevy_pbr/src/ssr/mod.rs @@ -514,6 +514,9 @@ impl SpecializedRenderPipeline for ScreenSpaceReflectionsPipeline { if cfg!(feature = "dfg_lut") { shader_defs.push("DFG_LUT".into()); } + if cfg!(feature = "area_light_luts") { + shader_defs.push("AREA_LIGHT_LUTS".into()); + } #[cfg(not(target_arch = "wasm32"))] shader_defs.push("USE_DEPTH_SAMPLERS".into()); diff --git a/docs/cargo_features.md b/docs/cargo_features.md index 6d048d1a19..8dcf77c0ba 100644 --- a/docs/cargo_features.md +++ b/docs/cargo_features.md @@ -62,6 +62,7 @@ This is the complete `bevy` cargo feature list, without "profiles" or "collectio |accesskit_unix|Enable AccessKit on Unix backends (currently only works with experimental screen readers and forks.)| |android-game-activity|Android GameActivity support. Default, choose between this and `android-native-activity`.| |android-native-activity|Android NativeActivity support. Legacy, should be avoided for most new Android games.| +|area_light_luts|Include Look Up Tables that are required for area lights.| |asset_processor|Enables the built-in asset processor for processed assets.| |async-io|Use async-io's implementation of block_on instead of futures-lite's implementation. This is preferred if your application uses async-io.| |async_executor|Uses `async-executor` as a task execution backend.|