From 3ed3fbd38aea205ca0a256beb575580c8af81de9 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sun, 2 Nov 2025 12:29:00 -0500 Subject: [PATCH] wip skybox loading --- assets/sky-test.png | Bin 0 -> 30023 bytes assets/trace.wgsl | 3 ++- src/app.rs | 14 +++++++++-- src/components/rt.rs | 2 +- src/render/node.rs | 19 +++++++++------ src/render/pipeline.rs | 53 +++++++++++++++++++++++++---------------- 6 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 assets/sky-test.png diff --git a/assets/sky-test.png b/assets/sky-test.png new file mode 100644 index 0000000000000000000000000000000000000000..9a176f9002c8814c00f76f0261e31ffa2eb6e408 GIT binary patch literal 30023 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 @group(0) @binding(2) var config: TracerUniforms; - +@group(0) @binding(3) var skybox_texture: texture_cube; +@group(0) @binding(4) var skybox_sampler: sampler; struct View { view_proj: mat4x4, diff --git a/src/app.rs b/src/app.rs index 7eb749e..4a73909 100644 --- a/src/app.rs +++ b/src/app.rs @@ -36,7 +36,12 @@ impl Plugin for Blackhole { } } -fn setup(mut commands: Commands, mut images: ResMut>, window: Single<&Window, With>) { +fn setup( + mut commands: Commands, + mut images: ResMut>, + window: Single<&Window, With>, + asset_server: Res, +) { commands.spawn(( PerfUiRoot::default(), PerfUiEntryFPS::default(), @@ -70,6 +75,7 @@ fn setup(mut commands: Commands, mut images: ResMut>, window: Sing let img0 = images.add(image.clone()); let img1 = images.add(image); + let skybox = asset_server.load("sky-test.png"); commands.spawn(( Name::new("Render Sprite"), Sprite { @@ -97,5 +103,9 @@ fn setup(mut commands: Commands, mut images: ResMut>, window: Sing )) .insert(Camera { order: -1, ..default() }); - commands.insert_resource(TracerRenderTextures(img0, img1)); + commands.insert_resource(TracerRenderTextures { + main: img0, + secondary: img1, + skybox, + }); } diff --git a/src/components/rt.rs b/src/components/rt.rs index fed00f5..f6474ff 100644 --- a/src/components/rt.rs +++ b/src/components/rt.rs @@ -1,4 +1,4 @@ -use bevy::{prelude::*, render::render_resource::encase::private::ShaderType}; +use bevy::prelude::*; #[derive(Component)] pub struct RTCamera; diff --git a/src/render/node.rs b/src/render/node.rs index 1a16d3e..0e781ac 100644 --- a/src/render/node.rs +++ b/src/render/node.rs @@ -7,7 +7,7 @@ use bevy::{ }, }; -use crate::render::pipeline::{TracerImageBindGroups, TracerPipeline}; +use crate::render::pipeline::{TracerImageBindGroups, TracerPipeline, TracerRenderTextures}; use crate::{SHADER_ASSET_PATH, WORKGROUP_SIZE}; pub enum TracerState { @@ -36,16 +36,21 @@ impl render_graph::Node for TracerNode { // if the corresponding pipeline has loaded, transition to the next stage match self.state { TracerState::Loading => { - match pipeline_cache.get_compute_pipeline_state(pipeline.init_pipeline) { - CachedPipelineState::Ok(_) => { - self.state = TracerState::Init; - } + let shader_loaded = match pipeline_cache.get_compute_pipeline_state(pipeline.init_pipeline) { + CachedPipelineState::Ok(_) => true, // If the shader hasn't loaded yet, just wait. - CachedPipelineState::Err(PipelineCacheError::ShaderNotLoaded(_)) => {} + CachedPipelineState::Err(PipelineCacheError::ShaderNotLoaded(_)) => false, CachedPipelineState::Err(err) => { panic!("Initializing assets/{SHADER_ASSET_PATH}:\n{err}") } - _ => {} + _ => false, + }; + + let tex = world.resource::(); + let asset_server = world.resource::(); + let load_state = asset_server.get_load_state(tex.skybox.id()).unwrap(); + if load_state.is_loaded() && shader_loaded { + self.state = TracerState::Init; } } TracerState::Init => { diff --git a/src/render/pipeline.rs b/src/render/pipeline.rs index 1ccaf30..9f49e96 100644 --- a/src/render/pipeline.rs +++ b/src/render/pipeline.rs @@ -4,15 +4,14 @@ use bevy::{ prelude::*, render::{ Render, RenderApp, RenderSet, - camera::CameraProjection, extract_resource::{ExtractResource, ExtractResourcePlugin}, render_asset::RenderAssets, render_graph::{RenderGraph, RenderLabel}, render_resource::{ BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, CachedComputePipelineId, - ComputePipelineDescriptor, PipelineCache, ShaderStages, ShaderType, StorageTextureAccess, TextureFormat, - UniformBuffer, - binding_types::{texture_storage_2d, uniform_buffer}, + ComputePipelineDescriptor, PipelineCache, SamplerBindingType, ShaderStages, ShaderType, + StorageTextureAccess, TextureFormat, TextureSampleType, UniformBuffer, + binding_types::{sampler, texture_cube, texture_storage_2d, uniform_buffer}, }, renderer::{RenderDevice, RenderQueue}, texture::GpuImage, @@ -26,7 +25,11 @@ pub struct TracerLabel; #[derive(Resource, Reflect, ExtractResource, Clone)] #[reflect(Resource)] -pub struct TracerRenderTextures(pub Handle, pub Handle); +pub struct TracerRenderTextures { + pub main: Handle, + pub secondary: Handle, + pub skybox: Handle, +} #[derive(Resource, Clone, ExtractResource, ShaderType, Default)] pub struct TracerUniforms { @@ -64,10 +67,10 @@ impl Plugin for TracerPipelinePlugin { } fn switch_textures(images: Res, mut sprite: Single<&mut Sprite>) { - if sprite.image == images.0 { - sprite.image = images.1.clone(); + if sprite.image == images.main { + sprite.image = images.secondary.clone(); } else { - sprite.image = images.0.clone(); + sprite.image = images.main.clone(); } } @@ -90,6 +93,8 @@ impl FromWorld for TracerPipeline { texture_storage_2d(TextureFormat::Rgba32Float, StorageTextureAccess::ReadOnly), texture_storage_2d(TextureFormat::Rgba32Float, StorageTextureAccess::WriteOnly), uniform_buffer::(false), + texture_cube(TextureSampleType::Float { filterable: true }), + sampler(SamplerBindingType::Filtering), ), ), ); @@ -138,6 +143,8 @@ fn init_pipeline( texture_storage_2d(TextureFormat::Rgba32Float, StorageTextureAccess::ReadOnly), texture_storage_2d(TextureFormat::Rgba32Float, StorageTextureAccess::WriteOnly), uniform_buffer::(false), + texture_cube(TextureSampleType::Float { filterable: true }), + sampler(SamplerBindingType::Filtering), ), ), ); @@ -177,21 +184,12 @@ fn update_tracer_uniforms( rt_camera: Single<(&GlobalTransform, &Camera), With>, ) { let (transform, cam) = rt_camera.into_inner(); - /* - - let clip_from_view = cam.clip_from_view(); - let world_from_clip = clip_from_view.inverse() * transform.compute_matrix().inverse(); - */ let clip_from_view = cam.clip_from_view(); let world_from_clip = transform.compute_matrix() * clip_from_view.inverse(); - // cam.ndc_to_world(camera_transform, ndc) tracer_uniforms.world_from_clip = world_from_clip; tracer_uniforms.world_position = transform.translation(); - - // info!("clip_from_view = {:?}", clip_from_view); - // info!("world_from_clip = {:?}", world_from_clip); } fn prepare_bind_groups( @@ -203,8 +201,9 @@ fn prepare_bind_groups( render_device: Res, queue: Res, ) { - let view_a = gpu_images.get(&tracer_images.0).unwrap(); - let view_b = gpu_images.get(&tracer_images.1).unwrap(); + let view_a = gpu_images.get(&tracer_images.main).unwrap(); + let view_b = gpu_images.get(&tracer_images.secondary).unwrap(); + let skybox = gpu_images.get(&tracer_images.skybox).unwrap(); // Uniform buffer is used here to demonstrate how to set up a uniform in a compute shader // Alternatives such as storage buffers or push constants may be more suitable for your use case @@ -214,12 +213,24 @@ fn prepare_bind_groups( let bind_group_0 = render_device.create_bind_group( None, &pipeline.texture_bind_group_layout, - &BindGroupEntries::sequential((&view_a.texture_view, &view_b.texture_view, &uniform_buffer)), + &BindGroupEntries::sequential(( + &view_a.texture_view, + &view_b.texture_view, + &uniform_buffer, + &skybox.texture_view, + &skybox.sampler, + )), ); let bind_group_1 = render_device.create_bind_group( None, &pipeline.texture_bind_group_layout, - &BindGroupEntries::sequential((&view_b.texture_view, &view_a.texture_view, &uniform_buffer)), + &BindGroupEntries::sequential(( + &view_b.texture_view, + &view_a.texture_view, + &uniform_buffer, + &skybox.texture_view, + &skybox.sampler, + )), ); commands.insert_resource(TracerImageBindGroups([bind_group_0, bind_group_1])); }