From 3b0c831c8018c23e1384cd00c65e8f54038b29b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=CC=81te=CC=81=20Homolya?= Date: Mon, 2 Jun 2025 15:35:43 -0700 Subject: [PATCH] Fix CI and add back internal assets --- .../src/light_probe/environment_filter.wgsl | 6 +- crates/bevy_pbr/src/light_probe/generate.rs | 19 ++--- crates/bevy_pbr/src/light_probe/mod.rs | 71 +++++++++++++++++-- 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/crates/bevy_pbr/src/light_probe/environment_filter.wgsl b/crates/bevy_pbr/src/light_probe/environment_filter.wgsl index addc2c1e55..b750d9fbbd 100644 --- a/crates/bevy_pbr/src/light_probe/environment_filter.wgsl +++ b/crates/bevy_pbr/src/light_probe/environment_filter.wgsl @@ -276,14 +276,14 @@ fn generate_radiance_map(@builtin(global_invocation_id) global_id: vec3u) { // and golden angle to get a uniform distribution fn uniform_sample_sphere(i: u32, normal: vec3f) -> vec3f { // Get stratified sample index - let strat_i = i % constants.sample_count; + let index = i % constants.sample_count; let golden_angle = 2.4; let full_sphere = f32(constants.sample_count) * 2.0; - let z = 1.0 - (2.0 * f32(strat_i) + 1.0) / full_sphere; + let z = 1.0 - (2.0 * f32(index) + 1.0) / full_sphere; let r = fast_sqrt(1.0 - z * z); - let phi = f32(strat_i) * golden_angle; + let phi = f32(index) * golden_angle; // Create the direction vector let dir_uniform = vec3f( diff --git a/crates/bevy_pbr/src/light_probe/generate.rs b/crates/bevy_pbr/src/light_probe/generate.rs index dbff008e86..2f3a70e305 100644 --- a/crates/bevy_pbr/src/light_probe/generate.rs +++ b/crates/bevy_pbr/src/light_probe/generate.rs @@ -1,4 +1,4 @@ -use bevy_asset::{weak_handle, Assets, Handle}; +use bevy_asset::{load_embedded_asset, weak_handle, Assets, Handle}; use bevy_ecs::{ component::Component, entity::Entity, @@ -18,7 +18,7 @@ use bevy_render::{ binding_types::*, AddressMode, BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, CachedComputePipelineId, ComputePassDescriptor, ComputePipelineDescriptor, Extent3d, FilterMode, PipelineCache, Sampler, - SamplerBindingType, SamplerDescriptor, Shader, ShaderDefVal, ShaderStages, ShaderType, + SamplerBindingType, SamplerDescriptor, ShaderDefVal, ShaderStages, ShaderType, StorageTextureAccess, Texture, TextureAspect, TextureDescriptor, TextureDimension, TextureFormat, TextureSampleType, TextureUsages, TextureView, TextureViewDescriptor, TextureViewDimension, UniformBuffer, @@ -32,13 +32,6 @@ use bevy_render::{ use crate::light_probe::environment_map::EnvironmentMapLight; -/// Single Pass Downsampling (SPD) shader handle -pub const SPD_SHADER_HANDLE: Handle = weak_handle!("5dcf400c-bcb3-49b9-8b7e-80f4117eaf82"); - -/// Environment Filter shader handle -pub const ENVIRONMENT_FILTER_SHADER_HANDLE: Handle = - weak_handle!("3110b545-78e0-48fc-b86e-8bc0ea50fc67"); - /// Sphere Cosine Weighted Irradiance shader handle pub const STBN_SPHERE: Handle = weak_handle!("3110b545-78e0-48fc-b86e-8bc0ea50fc67"); pub const STBN_VEC2: Handle = weak_handle!("3110b545-78e0-48fc-b86e-8bc0ea50fc67"); @@ -271,7 +264,7 @@ impl FromWorld for GeneratorPipelines { label: Some("spd_first_pipeline".into()), layout: vec![layouts.spd.clone()], push_constant_ranges: vec![], - shader: SPD_SHADER_HANDLE, + shader: load_embedded_asset!(world, "spd.wgsl"), shader_defs: shader_defs.clone(), entry_point: "spd_downsample_first".into(), zero_initialize_workgroup_memory: false, @@ -282,7 +275,7 @@ impl FromWorld for GeneratorPipelines { label: Some("spd_second_pipeline".into()), layout: vec![layouts.spd.clone()], push_constant_ranges: vec![], - shader: SPD_SHADER_HANDLE, + shader: load_embedded_asset!(world, "spd.wgsl"), shader_defs, entry_point: "spd_downsample_second".into(), zero_initialize_workgroup_memory: false, @@ -293,7 +286,7 @@ impl FromWorld for GeneratorPipelines { label: Some("radiance_pipeline".into()), layout: vec![layouts.radiance.clone()], push_constant_ranges: vec![], - shader: ENVIRONMENT_FILTER_SHADER_HANDLE, + shader: load_embedded_asset!(world, "environment_filter.wgsl"), shader_defs: vec![], entry_point: "generate_radiance_map".into(), zero_initialize_workgroup_memory: false, @@ -304,7 +297,7 @@ impl FromWorld for GeneratorPipelines { label: Some("irradiance_pipeline".into()), layout: vec![layouts.irradiance.clone()], push_constant_ranges: vec![], - shader: ENVIRONMENT_FILTER_SHADER_HANDLE, + shader: load_embedded_asset!(world, "environment_filter.wgsl"), shader_defs: vec![], entry_point: "generate_irradiance_map".into(), zero_initialize_workgroup_memory: false, diff --git a/crates/bevy_pbr/src/light_probe/mod.rs b/crates/bevy_pbr/src/light_probe/mod.rs index f564f34e30..0a92b4f1ac 100644 --- a/crates/bevy_pbr/src/light_probe/mod.rs +++ b/crates/bevy_pbr/src/light_probe/mod.rs @@ -1,8 +1,11 @@ //! Light probes for baked global illumination. use bevy_app::{App, Plugin, Update}; -use bevy_asset::AssetId; -use bevy_core_pipeline::core_3d::{graph::{Core3d, Node3d}, Camera3d}; +use bevy_asset::{embedded_asset, load_internal_binary_asset, AssetId}; +use bevy_core_pipeline::core_3d::{ + graph::{Core3d, Node3d}, + Camera3d, +}; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::{ component::Component, @@ -18,7 +21,19 @@ use bevy_math::{Affine3A, FloatOrd, Mat4, Vec3A, Vec4}; use bevy_platform::collections::HashMap; use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ - extract_component::ExtractComponentPlugin, extract_instances::ExtractInstancesPlugin, load_shader_library, primitives::{Aabb, Frustum}, render_asset::RenderAssets, render_graph::RenderGraphApp, render_resource::{DynamicUniformBuffer, Sampler, ShaderType, TextureView}, renderer::{RenderAdapter, RenderDevice, RenderQueue}, settings::WgpuFeatures, sync_world::RenderEntity, texture::{FallbackImage, GpuImage}, view::{ExtractedView, Visibility}, Extract, ExtractSchedule, Render, RenderApp, RenderSystems + extract_component::ExtractComponentPlugin, + extract_instances::ExtractInstancesPlugin, + load_shader_library, + primitives::{Aabb, Frustum}, + render_asset::RenderAssets, + render_graph::RenderGraphApp, + render_resource::{DynamicUniformBuffer, Sampler, ShaderType, TextureView}, + renderer::{RenderAdapter, RenderDevice, RenderQueue}, + settings::WgpuFeatures, + sync_world::RenderEntity, + texture::{FallbackImage, GpuImage}, + view::{ExtractedView, Visibility}, + Extract, ExtractSchedule, Render, RenderApp, RenderSystems, }; use bevy_transform::{components::Transform, prelude::GlobalTransform}; use generate::{ @@ -30,7 +45,13 @@ use tracing::error; use core::{hash::Hash, ops::Deref}; -use crate::{generate::{GeneratorBindGroupLayouts, GeneratorNode, GeneratorSamplers, IrradianceMapNode, RadianceMapNode}, light_probe::environment_map::{EnvironmentMapIds, EnvironmentMapLight}}; +use crate::{ + generate::{ + GeneratorBindGroupLayouts, GeneratorNode, GeneratorSamplers, IrradianceMapNode, + RadianceMapNode, + }, + light_probe::environment_map::{EnvironmentMapIds, EnvironmentMapLight}, +}; use self::irradiance_volume::IrradianceVolume; @@ -337,6 +358,38 @@ impl Plugin for LightProbePlugin { load_shader_library!(app, "environment_map.wgsl"); load_shader_library!(app, "irradiance_volume.wgsl"); + embedded_asset!(app, "environment_filter.wgsl"); + embedded_asset!(app, "spd.wgsl"); + + load_internal_binary_asset!( + app, + STBN_SPHERE, + "noise/sphere_coshemi_gauss1_0.png", + |bytes, _: String| Image::from_buffer( + bytes, + bevy_image::ImageType::Format(bevy_image::ImageFormat::Png), + bevy_image::CompressedImageFormats::NONE, + false, + bevy_image::ImageSampler::Default, + bevy_asset::RenderAssetUsages::RENDER_WORLD, + ) + .expect("Failed to load sphere cosine weighted blue noise texture") + ); + load_internal_binary_asset!( + app, + STBN_VEC2, + "noise/vector2_uniform_gauss1_0.png", + |bytes, _: String| Image::from_buffer( + bytes, + bevy_image::ImageType::Format(bevy_image::ImageFormat::Png), + bevy_image::CompressedImageFormats::NONE, + false, + bevy_image::ImageSampler::Default, + bevy_asset::RenderAssetUsages::RENDER_WORLD, + ) + .expect("Failed to load vector2 uniform blue noise texture") + ); + app.register_type::() .register_type::() .register_type::() @@ -378,7 +431,15 @@ impl Plugin for LightProbePlugin { ) .add_systems( Render, - (upload_light_probes, prepare_environment_uniform_buffer) + prepare_generator_bind_groups.in_set(RenderSystems::PrepareBindGroups), + ) + .add_systems( + Render, + ( + upload_light_probes, + prepare_environment_uniform_buffer, + prepare_intermediate_textures, + ) .in_set(RenderSystems::PrepareResources), ); }