diff --git a/assets/sky-array.png b/assets/sky-array.png new file mode 100644 index 0000000..ca0721e Binary files /dev/null and b/assets/sky-array.png differ diff --git a/assets/trace.wgsl b/assets/trace.wgsl index cfe4f76..539843e 100644 --- a/assets/trace.wgsl +++ b/assets/trace.wgsl @@ -41,27 +41,21 @@ fn update(@builtin(global_invocation_id) invocation_id: vec3) { let ndc = loc * 2.0f - 1.0f; var ray = createCameraRay(ndc); - // var result = vec3(0.0); - - // for (var i: i32 = 0; i < 1; i++){ - // var hit = trace(ray); - // result += ray.energy * shade(&ray, hit); - // if !any(ray.energy != vec3(0.0)) - // { - // break; - // } - // } let hit_data = trace(ray); var final_color = hit_data.color; - // Simple fog/distance visualization - let distance_factor = clamp(hit_data.distance / 50.0, 0.0, 1.0); - final_color = mix(final_color * (f32(hit_data.steps)/ 100.0), vec3(0.1), distance_factor); // Fog: mix object color with dark gray + let step_factor = f32(hit_data.steps)/100.0; + final_color = final_color * step_factor; - let color = vec4(final_color, 1.0); + + var color = vec4(final_color, 1.0); + if hit_data.distance == 100.0 { + color = config.sky_color; + // color = textureSampleLevel(skybox_texture, skybox_sampler, vec3(0.0, 0.0, 1.0), 0, 0u); + } let location = vec2(i32(invocation_id.x), i32(invocation_id.y)); textureStore(output, location, color); @@ -139,25 +133,6 @@ struct Ray { energy: vec3, } - -struct RayHit { - distance: f32, - position: vec3, - normal: vec3, - albedo: vec3, - specular: vec3 -} - -fn createRayHit() -> RayHit { - var hit: RayHit; - hit.position = vec3(0.0, 0.0, 0.0); - hit.distance = -999999999.0f; - hit.normal = vec3(0.0, 0.0, 0.0); - hit.albedo = vec3(0.0, 0.0, 0.0); - hit.specular = vec3(0.0, 0.0, 0.0); - return hit; -} - fn createRay(origin: vec3, direction: vec3) -> Ray { var ray: Ray; @@ -197,6 +172,7 @@ struct Hit { hit_pos: vec3, normal: vec3, color: vec3, + direction: vec3, steps: i32, }; @@ -223,7 +199,7 @@ fn trace(ray: Ray) -> Hit { // Check for a hit if (distance_to_scene < min_hit_distance) { // A hit occurred! - return Hit(total_distance, current_pos, vec3(0.0), vec3(1.0, 0.0, 0.0), i); // Return red color for now + return Hit(total_distance, current_pos, vec3(0.0), vec3(1.0, 0.0, 0.0), ray.direction, i); // Return red color for now } // Check if we marched too far @@ -236,5 +212,5 @@ fn trace(ray: Ray) -> Hit { } // No hit found - return Hit(max_distance, vec3(0.0), vec3(0.0), vec3(0.0, 0.0, 0.0), 0); // Return black for background + return Hit(max_distance, vec3(0.0), vec3(0.0), vec3(0.0, 0.0, 0.0), ray.direction, max_steps); // Return black for background } diff --git a/src/app.rs b/src/app.rs index ca522cc..501131d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,7 +2,9 @@ use bevy::{ asset::RenderAssetUsages, prelude::*, render::{ - render_resource::{Extent3d, TextureDimension, TextureFormat, TextureUsages, TextureViewDimension}, + render_resource::{ + Extent3d, TextureDimension, TextureFormat, TextureUsages, TextureViewDescriptor, TextureViewDimension, + }, view::RenderLayers, }, window::PrimaryWindow, @@ -93,19 +95,24 @@ fn setup( let mut skybox_render_image = Image::new_fill( Extent3d { - width: 1024, - height: 768, + width: 256, + height: 1536, ..Default::default() }, - TextureDimension::D3, + TextureDimension::D2, &[255; PIXEL_SIZE], PIXEL_FORMAT, RenderAssetUsages::RENDER_WORLD, ); + skybox_render_image.reinterpret_stacked_2d_as_array(6); skybox_render_image.texture_descriptor.usage = TextureUsages::TEXTURE_BINDING | TextureUsages::RENDER_ATTACHMENT; + skybox_render_image.texture_view_descriptor = Some(TextureViewDescriptor { + dimension: Some(TextureViewDimension::Cube), + ..default() + }); let skybox_render_image_handle = images.add(skybox_render_image); - let skybox_asset = asset_server.load("sky-test.png"); + let skybox_asset = asset_server.load("sky-array.png"); commands.spawn(( Name::new("Render Sprite"), Sprite { @@ -165,9 +172,10 @@ fn prepare_skybox( .expect("Skybox asset image does not exist") .clone(); skybox_image.reinterpret_stacked_2d_as_array(skybox_image.height() / skybox_image.width()); - let mut desc = skybox_image.texture_view_descriptor.unwrap(); - desc.dimension = Some(TextureViewDimension::Cube); - skybox_image.texture_view_descriptor = Some(desc); + skybox_image.texture_view_descriptor = Some(TextureViewDescriptor { + dimension: Some(TextureViewDimension::Cube), + ..default() + }); image_assets.insert(tracer_textures.skybox.id(), skybox_image.clone()); } diff --git a/src/render/node.rs b/src/render/node.rs index 218b26d..9bc9d73 100644 --- a/src/render/node.rs +++ b/src/render/node.rs @@ -36,22 +36,24 @@ impl render_graph::Node for TracerNode { // if the corresponding pipeline has loaded, transition to the next stage match self.state { TracerState::Loading => { - let shader_loaded = match pipeline_cache.get_compute_pipeline_state(pipeline.init_pipeline) { - CachedPipelineState::Ok(_) => true, + match pipeline_cache.get_compute_pipeline_state(pipeline.init_pipeline) { + CachedPipelineState::Ok(_) => { + self.state = TracerState::Init; + } // If the shader hasn't loaded yet, just wait. - CachedPipelineState::Err(PipelineCacheError::ShaderNotLoaded(_)) => false, + CachedPipelineState::Err(PipelineCacheError::ShaderNotLoaded(_)) => (), 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; - } + // let tex = world.resource::(); + // let asset_server = world.resource::(); + // let load_state = asset_server.get_load_state(tex.skybox.id()).expect(); + // if load_state.is_loaded() && shader_loaded { + // self.state = TracerState::Init; + // } } TracerState::Init => { if let CachedPipelineState::Ok(_) = pipeline_cache.get_compute_pipeline_state(pipeline.update_pipeline)