Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified shaders/rust/computeparticles/particle.comp.spv
Binary file not shown.
47 changes: 32 additions & 15 deletions shaders/rust/computeparticles/particle/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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)]
Expand Down Expand Up @@ -39,17 +43,19 @@ 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 {
return;
}

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);

Expand All @@ -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;
}
}

Expand All @@ -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<Image!(2D, type=f32, sampled)>,
#[spirv(descriptor_set = 0, binding = 1)] sampler_gradient_ramp: &SampledImage<Image!(2D, type=f32, sampled)>,
#[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);
}
*out_frag_color = vec4(
tex_color.x * color.x,
tex_color.y * color.y,
tex_color.z * color.z,
1.0,
);
}
26 changes: 18 additions & 8 deletions shaders/rust/offscreen/mirror/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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)]
Expand All @@ -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<Image!(2D, type=f32, sampled)>,
#[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);
Expand All @@ -56,4 +66,4 @@ pub fn main_fs(
}
*out_frag_color = *out_frag_color + reflection;
}
}
}
Binary file modified shaders/rust/offscreen/phong.vert.spv
Binary file not shown.
23 changes: 16 additions & 7 deletions shaders/rust/offscreen/phong/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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)]
Expand Down Expand Up @@ -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);
}

Expand All @@ -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;
}
}
11 changes: 8 additions & 3 deletions shaders/rust/offscreen/quad/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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<Image!(2D, type=f32, sampled)>,
#[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);
}
}
Loading