diff --git a/Cargo.lock b/Cargo.lock index 023dbe0..7a98704 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -220,6 +220,20 @@ name = "bytemuck" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] [[package]] name = "bytes" @@ -1489,6 +1503,7 @@ name = "shrooms-vb-native" version = "0.1.0" dependencies = [ "anyhow", + "bytemuck", "cc", "clap", "imgui", diff --git a/Cargo.toml b/Cargo.toml index 2b1203f..8820305 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] anyhow = "1" +bytemuck = { version = "1", features = ["derive"] } clap = { version = "4", features = ["derive"] } imgui = "0.12" imgui-wgpu = { git = "https://github.com/Yatekii/imgui-wgpu-rs", rev = "2edd348" } diff --git a/src/anaglyph.wgsl b/src/anaglyph.wgsl index 796e7b1..0483665 100644 --- a/src/anaglyph.wgsl +++ b/src/anaglyph.wgsl @@ -41,9 +41,15 @@ var u_texture: texture_2d; @group(0) @binding(1) var u_sampler: sampler; +struct Colors { + left: vec4, + right: vec4, +}; +@group(0) @binding(2) +var colors: Colors; @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { - return textureSample(u_texture, u_sampler, in.tex_coords); - // return vec4(0.3, 0.2, 0.1, 1.0); + let brt = textureSample(u_texture, u_sampler, in.tex_coords); + return colors.left * brt[0] + colors.right * brt[1]; } diff --git a/src/app.rs b/src/app.rs index c196d8f..ae029ef 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,6 +3,7 @@ use imgui_wgpu::{Renderer, RendererConfig}; use imgui_winit_support::WinitPlatform; use pollster::block_on; use std::{sync::Arc, time::Instant}; +use wgpu::util::DeviceExt as _; #[cfg(target_os = "windows")] use winit::platform::windows::{CornerPreference, WindowAttributesExtWindows as _}; use winit::{ @@ -79,6 +80,15 @@ impl AppWindow { })); let eyes = eyes.create_view(&wgpu::TextureViewDescriptor::default()); let sampler = device.create_sampler(&wgpu::SamplerDescriptor::default()); + let colors = Colors { + left: [1.0, 0.0, 0.0, 1.0], + right: [0.0, 0.7734375, 0.9375, 1.0], + }; + let color_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("colors"), + contents: bytemuck::bytes_of(&colors), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); let texture_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: Some("texture bind group layout"), @@ -99,6 +109,16 @@ impl AppWindow { ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), count: None, }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, ], }); let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { @@ -113,6 +133,10 @@ impl AppWindow { binding: 1, resource: wgpu::BindingResource::Sampler(&sampler), }, + wgpu::BindGroupEntry { + binding: 2, + resource: color_buf.as_entire_binding(), + }, ], }); @@ -438,3 +462,10 @@ impl ApplicationHandler for App { ); } } + +#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +struct Colors { + left: [f32; 4], + right: [f32; 4], +}