diff --git a/shaders/rust/computeparticles/particle.comp.spv b/shaders/rust/computeparticles/particle.comp.spv index 7081dc347..3218503ac 100644 Binary files a/shaders/rust/computeparticles/particle.comp.spv and b/shaders/rust/computeparticles/particle.comp.spv differ diff --git a/shaders/rust/computeparticles/particle/src/lib.rs b/shaders/rust/computeparticles/particle/src/lib.rs index a411c68d6..4a19a0241 100644 --- a/shaders/rust/computeparticles/particle/src/lib.rs +++ b/shaders/rust/computeparticles/particle/src/lib.rs @@ -1,8 +1,12 @@ #![cfg_attr(target_arch = "spirv", no_std)] #![allow(clippy::missing_safety_doc)] -use spirv_std::{spirv, glam::{vec2, vec4, Vec2, Vec4, UVec3}, Image, num_traits::Float}; use spirv_std::image::SampledImage; +use spirv_std::{ + glam::{vec2, vec4, UVec3, Vec2, Vec4}, + num_traits::Float, + spirv, Image, +}; #[repr(C)] #[derive(Copy, Clone)] @@ -39,8 +43,9 @@ fn repulsion(pos: Vec2, attract_pos: Vec2) -> Vec2 { #[spirv(compute(threads(256, 1, 1)))] pub fn main_cs( #[spirv(global_invocation_id)] global_id: UVec3, - #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] particles: &mut [Particle], - #[spirv(uniform, descriptor_set = 0, binding = 1)] ubo: &Ubo, + #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] particles_in: &[Particle], + #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] particles_out: &mut [Particle], + #[spirv(uniform, descriptor_set = 0, binding = 2)] ubo: &Ubo, ) { let index = global_id.x; if index >= ubo.particle_count as u32 { @@ -48,8 +53,9 @@ pub fn main_cs( } let idx = index as usize; - let mut vel = particles[idx].vel; - let mut pos = particles[idx].pos; + let mut vel = particles_in[idx].vel; + let mut pos = particles_in[idx].pos; + let g_pos = particles_in[idx].gradient_pos; let dest_pos = vec2(ubo.dest_x, ubo.dest_y); @@ -62,13 +68,13 @@ pub fn main_cs( if pos.x < -1.0 || pos.x > 1.0 || pos.y < -1.0 || pos.y > 1.0 { vel = (-vel * 0.1) + attraction(pos, dest_pos) * 12.0; } else { - particles[idx].pos = pos; + particles_out[idx].pos = pos; } - particles[idx].vel = vel; - particles[idx].gradient_pos.x += 0.02 * ubo.delta_t; - if particles[idx].gradient_pos.x > 1.0 { - particles[idx].gradient_pos.x -= 1.0; + particles_out[idx].vel = vel; + particles_out[idx].gradient_pos.x = g_pos.x + 0.02 * ubo.delta_t; + if particles_out[idx].gradient_pos.x > 1.0 { + particles_out[idx].gradient_pos.x -= 1.0; } } @@ -92,11 +98,22 @@ pub fn main_fs( _in_color: Vec4, in_gradient_pos: f32, #[spirv(point_coord)] point_coord: Vec2, - #[spirv(descriptor_set = 0, binding = 0)] sampler_color_map: &SampledImage, - #[spirv(descriptor_set = 0, binding = 1)] sampler_gradient_ramp: &SampledImage, + #[spirv(descriptor_set = 0, binding = 0)] sampler_color_map: &SampledImage< + Image!(2D, type=f32, sampled), + >, + #[spirv(descriptor_set = 0, binding = 1)] sampler_gradient_ramp: &SampledImage< + Image!(2D, type=f32, sampled), + >, out_frag_color: &mut Vec4, ) { - let color = sampler_gradient_ramp.sample(vec2(in_gradient_pos, 0.0)).truncate(); + let color = sampler_gradient_ramp + .sample(vec2(in_gradient_pos, 0.0)) + .truncate(); let tex_color = sampler_color_map.sample(point_coord).truncate(); - *out_frag_color = vec4(tex_color.x * color.x, tex_color.y * color.y, tex_color.z * color.z, 1.0); -} \ No newline at end of file + *out_frag_color = vec4( + tex_color.x * color.x, + tex_color.y * color.y, + tex_color.z * color.z, + 1.0, + ); +} diff --git a/shaders/rust/offscreen/mirror/src/lib.rs b/shaders/rust/offscreen/mirror/src/lib.rs index 6fd5b0978..f3c08adf5 100644 --- a/shaders/rust/offscreen/mirror/src/lib.rs +++ b/shaders/rust/offscreen/mirror/src/lib.rs @@ -1,8 +1,11 @@ #![cfg_attr(target_arch = "spirv", no_std)] #![allow(clippy::missing_safety_doc)] -use spirv_std::{spirv, glam::{vec2, vec4, Mat4, Vec3, Vec4}, Image}; use spirv_std::image::SampledImage; +use spirv_std::{ + glam::{vec2, vec4, Mat4, Vec3, Vec4}, + spirv, Image, +}; #[repr(C)] #[derive(Copy, Clone)] @@ -28,22 +31,29 @@ pub fn main_vs( pub fn main_fs( in_pos: Vec4, #[spirv(front_facing)] front_facing: bool, - #[spirv(descriptor_set = 0, binding = 1)] sampler_color: &SampledImage, + #[spirv(descriptor_set = 0, binding = 1)] sampler_color: &SampledImage< + Image!(2D, type=f32, sampled), + >, out_frag_color: &mut Vec4, ) { - let tmp = vec4(1.0 / in_pos.w, 1.0 / in_pos.w, 1.0 / in_pos.w, 1.0 / in_pos.w); + let tmp = vec4( + 1.0 / in_pos.w, + 1.0 / in_pos.w, + 1.0 / in_pos.w, + 1.0 / in_pos.w, + ); let proj_coord = in_pos * tmp; - + // Scale and bias let proj_coord = proj_coord + vec4(1.0, 1.0, 1.0, 1.0); let proj_coord = proj_coord * vec4(0.5, 0.5, 0.5, 0.5); - + // Slow single pass blur // For demonstration purposes only const BLUR_SIZE: f32 = 1.0 / 512.0; - + *out_frag_color = vec4(0.0, 0.0, 0.0, 1.0); - + if front_facing { // Only render mirrored scene on front facing (upper) side of mirror surface let mut reflection = vec4(0.0, 0.0, 0.0, 0.0); @@ -56,4 +66,4 @@ pub fn main_fs( } *out_frag_color = *out_frag_color + reflection; } -} \ No newline at end of file +} diff --git a/shaders/rust/offscreen/phong.vert.spv b/shaders/rust/offscreen/phong.vert.spv index 2a01ae6bf..a91b0d2f1 100644 Binary files a/shaders/rust/offscreen/phong.vert.spv and b/shaders/rust/offscreen/phong.vert.spv differ diff --git a/shaders/rust/offscreen/phong/src/lib.rs b/shaders/rust/offscreen/phong/src/lib.rs index 1b153f988..b3d874402 100644 --- a/shaders/rust/offscreen/phong/src/lib.rs +++ b/shaders/rust/offscreen/phong/src/lib.rs @@ -1,7 +1,11 @@ #![cfg_attr(target_arch = "spirv", no_std)] #![allow(clippy::missing_safety_doc)] -use spirv_std::{spirv, glam::{vec4, Mat4, Vec3, Vec4}, num_traits::Float}; +use spirv_std::{ + glam::{vec4, Mat4, Vec3, Vec4}, + num_traits::Float, + spirv, +}; #[repr(C)] #[derive(Copy, Clone)] @@ -31,9 +35,9 @@ pub fn main_vs( let eye_pos = ubo.view * ubo.model * vec4(in_pos.x, in_pos.y, in_pos.z, 1.0); *out_eye_pos = eye_pos.truncate(); *out_light_vec = (ubo.light_pos.truncate() - *out_eye_pos).normalize(); - + // Clip against reflection plane - let clip_plane = vec4(0.0, -1.0, 0.0, 0.0); + let clip_plane = vec4(0.0, 0.0, 0.0, 0.0); clip_distance[0] = vec4(in_pos.x, in_pos.y, in_pos.z, 1.0).dot(clip_plane); } @@ -47,16 +51,21 @@ pub fn main_fs( ) { let eye = (-in_eye_pos).normalize(); let reflected = (-in_light_vec).reflect(in_normal).normalize(); - + let i_ambient = vec4(0.1, 0.1, 0.1, 1.0); - let i_diffuse = vec4(in_normal.dot(in_light_vec).max(0.0), in_normal.dot(in_light_vec).max(0.0), in_normal.dot(in_light_vec).max(0.0), in_normal.dot(in_light_vec).max(0.0)); + let i_diffuse = vec4( + in_normal.dot(in_light_vec).max(0.0), + in_normal.dot(in_light_vec).max(0.0), + in_normal.dot(in_light_vec).max(0.0), + in_normal.dot(in_light_vec).max(0.0), + ); let specular = 0.75; let mut i_specular = vec4(0.0, 0.0, 0.0, 0.0); if in_eye_pos.dot(in_normal) < 0.0 { let spec_factor = reflected.dot(eye).max(0.0).powf(16.0) * specular; i_specular = vec4(0.5, 0.5, 0.5, 1.0) * spec_factor; } - + let color_vec4 = vec4(in_color.x, in_color.y, in_color.z, 1.0); *out_frag_color = (i_ambient + i_diffuse) * color_vec4 + i_specular; -} \ No newline at end of file +} diff --git a/shaders/rust/offscreen/quad/src/lib.rs b/shaders/rust/offscreen/quad/src/lib.rs index a03751315..b48917239 100644 --- a/shaders/rust/offscreen/quad/src/lib.rs +++ b/shaders/rust/offscreen/quad/src/lib.rs @@ -1,8 +1,11 @@ #![cfg_attr(target_arch = "spirv", no_std)] #![allow(clippy::missing_safety_doc)] -use spirv_std::{spirv, glam::{vec2, vec4, Vec2, Vec4}, Image}; use spirv_std::image::SampledImage; +use spirv_std::{ + glam::{vec2, vec4, Vec2, Vec4}, + spirv, Image, +}; #[spirv(vertex)] pub fn main_vs( @@ -19,8 +22,10 @@ pub fn main_vs( #[spirv(fragment)] pub fn main_fs( in_uv: Vec2, - #[spirv(descriptor_set = 0, binding = 1)] sampler_color: &SampledImage, + #[spirv(descriptor_set = 0, binding = 1)] sampler_color: &SampledImage< + Image!(2D, type=f32, sampled), + >, out_frag_color: &mut Vec4, ) { *out_frag_color = sampler_color.sample(in_uv); -} \ No newline at end of file +}