From 20ac933cc3c816dbe28323b5c3617ae2a38cae7f Mon Sep 17 00:00:00 2001 From: Piotrek Date: Sun, 18 Apr 2021 12:00:28 +0200 Subject: [PATCH] working 3d textures --- build.rs | 2 ++ src/main.rs | 2 +- src/renderer/buffers/node_buffer.rs | 38 ++++++++++++++++++---------- src/renderer/mod.rs | 5 ++-- src/shaders/bin/shader.frag.spv | Bin 8780 -> 1464 bytes src/shaders/shader.frag | 19 +++++++++----- 6 files changed, 42 insertions(+), 24 deletions(-) diff --git a/build.rs b/build.rs index 6d58d58..e3c2f29 100644 --- a/build.rs +++ b/build.rs @@ -53,6 +53,8 @@ fn main() { // Options let mut options = shaderc::CompileOptions::new().expect("Unable to create compile options"); options.set_include_callback(resolve_include); + options.set_source_language(shaderc::SourceLanguage::GLSL); + //options.set_optimization_level(shaderc::OptimizationLevel::Performance); // Compile all shaders let mut compiler = shaderc::Compiler::new().expect("Unable to create shader compiler"); diff --git a/src/main.rs b/src/main.rs index 1585d30..8e46219 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use std::sync::Arc; use winit::{ - event::{Event, WindowEvent, KeyboardInput, MouseButton, ElementState, VirtualKeyCode}, + event::{Event, WindowEvent}, event_loop::{ControlFlow, EventLoop}, window::WindowBuilder, dpi::LogicalSize diff --git a/src/renderer/buffers/node_buffer.rs b/src/renderer/buffers/node_buffer.rs index 64e0c8f..d3ca602 100644 --- a/src/renderer/buffers/node_buffer.rs +++ b/src/renderer/buffers/node_buffer.rs @@ -1,12 +1,13 @@ -pub const DATA: &[u8] = &[ +pub const DATA: &[u32] = &[ // z0 1,0, - 0,1, + 0,0, // z1 - 0,1, - 1,0, - ]; + 0,0, + 0,0, +]; + pub struct NodeBuffer { texture: wgpu::Texture, @@ -27,7 +28,7 @@ impl NodeBuffer { mip_level_count: 1, sample_count: 1, dimension: wgpu::TextureDimension::D3, - format: wgpu::TextureFormat::R8Uint, + format: wgpu::TextureFormat::R32Uint, usage: wgpu::TextureUsage::SAMPLED | wgpu::TextureUsage::COPY_DST, // STORAGE? label: Some("Node texture"), } @@ -57,12 +58,8 @@ impl NodeBuffer { // Bind group let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); let sampler = device.create_sampler(&wgpu::SamplerDescriptor { - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: wgpu::FilterMode::Nearest, - min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + address_mode_u: wgpu::AddressMode::ClampToEdge, address_mode_v: wgpu::AddressMode::ClampToEdge, address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, mipmap_filter: wgpu::FilterMode::Nearest, ..Default::default() }); let bind_group = device.create_bind_group( @@ -81,10 +78,23 @@ impl NodeBuffer { } pub fn write(&mut self, queue: &wgpu::Queue) { + // Convert 32 bit values to 8 bit + const LEN: usize = DATA.len(); + let mut bytes : [u8; LEN*4] = [0; LEN*4]; + for i in 0..LEN { + let idx = i * 4; + let byte = DATA[i].to_be_bytes(); + bytes[idx+0] = byte[0]; + bytes[idx+1] = byte[1]; + bytes[idx+2] = byte[2]; + bytes[idx+3] = byte[3]; + } + + // Write queue.write_texture( wgpu::TextureCopyView { texture: &self.texture, mip_level: 0, origin: wgpu::Origin3d::ZERO }, - DATA, - wgpu::TextureDataLayout { offset: 0, bytes_per_row: self.size.width, rows_per_image: self.size.height }, + &bytes, + wgpu::TextureDataLayout { offset: 0, bytes_per_row: 4*self.size.width, rows_per_image: self.size.height }, self.size ); } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 9bb8235..bc0fd47 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -1,5 +1,4 @@ use winit::{window::Window, dpi::PhysicalSize}; -use wgpu::util::DeviceExt; mod buffers; use buffers::{NodeBuffer, UniformBuffer, RasterBuffer, Vertex}; pub mod camera; use camera::Camera; @@ -28,7 +27,7 @@ impl Renderer { format: adapter.get_swap_chain_preferred_format(&surface), width: size.width, height: size.height, - present_mode: wgpu::PresentMode::Immediate, // Fifo = Vsync + present_mode: wgpu::PresentMode::Mailbox, // Fifo = Vsync }; let swapchain = device.create_swap_chain(&surface, &swapchain_desc); (swapchain_desc, swapchain) @@ -84,7 +83,7 @@ impl Renderer { pub async fn new(window: &Window) -> Self { // Create surface and pick device - let instance = wgpu::Instance::new(wgpu::BackendBit::DX11); + let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); let surface = unsafe { instance.create_surface(window) }; // Pick adapter (physical gpu) diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index d03815b129bd22641cc915c22626e1d41a9b4e04..22cca161c0d3b72c141b9fe8acdbd3262c3d1bce 100644 GIT binary patch literal 1464 zcmYk5%Wl(95Qa~iTWRTy-YFD^a&HJM03o4LHppE>sw!Y@MX@6pC3fUEq3rrRJO=CX zJhVs%{?GPNJ<)W|{PWMnXHF}#`we4e%)D7NFHJ71W>$zX3#Oh~xAUpf9;bf$)$5G1 zWGWdE&a!Eksw_I}h7kcr`b@ea9=IClR8du9ek!S|Zf?hOPfpyc-3s)X^^DeWSZqY7ycy*`*AWH>!_Qk8!%)V2H(74H%-Dbp^XgZE=EcGwZOeF znkrVyVtjY6JM>2JSV+aZpoqlPyv%oBO1|}*IwSaw>>iE;pL@0bv3xsIP55!q5AHsH zBxQ^}tYlc8N6&H|K6xLcHV^DN@A`Y-ol9MP4>RzM%*VI!J&5(2xog(Mg4fJmL!Pst zoVqZl;5hQ>hl1~z8~WvEa?8SO$gb+m%fcgn0Z;<=uJE~Mgnmo1j+Fc@`OC6kyy}A@ z&OIS5O+kEB3TBnOHTlfQ8zhhOh7_^>w$A?~>-zE?oj29xuB;=a2D`+k2D9IjWe#v= z$9JT5Hn>eGLJ$1nzK^WWZj3oUYUviK^FT@tJYuNjKGONu#l@lJJ}%hqqciO+iid!rmI^$_Y@ z3gP|2<-PE~k3E#n?iZ!(-IveXxK&`DSnO`Sz}PLd+3l$+vd2v+apb+aQ5%ff#J8ki xKg4IRw+oDY{}%s_Eb>QuV!P6ZQfB5%O-Gj9TnU3u433Sli*gLkU)}Iq>3@0wY}x<- literal 8780 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 AZ~y=R diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index 3478c82..b6d9cf9 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -12,8 +12,9 @@ layout(set=0, binding=0) uniform Uniforms vec3 cam_pos; }; -layout(set = 1, binding = 0) uniform texture3D node_tex; -layout(set = 1, binding = 1) uniform sampler node_sampl; +//layout(set = 1, binding = 0) uniform texture3D node_tex; +//layout(set = 1, binding = 1) uniform usampler3D node_sampl; +layout(set=1,binding=0) uniform usampler3D diffuseTex; // Defines #define PI 3.141592 @@ -27,9 +28,15 @@ layout(set = 1, binding = 1) uniform sampler node_sampl; void main() { + // Test + uint node = texelFetch(diffuseTex, ivec3(0, 0, 0), 0).r; + if(node == 4294967295) out_color = vec4(0.0, 0.5, 1.0, 1.0); + else out_color = vec4(1.0, 0.1, 0.0, 1.0); + + // Calculate ray direction - vec3 view_dir = (proj_matrix_inv * vec4(vert_uv, 0, 1)).xyz; - vec3 ray_dir = normalize(view_matrix * vec4(view_dir,0)).xyz; - // Calculate color - out_color = vec4(raymarch(cam_pos, ray_dir), 1); + // vec3 view_dir = (proj_matrix_inv * vec4(vert_uv, 0, 1)).xyz; + // vec3 ray_dir = normalize(view_matrix * vec4(view_dir,0)).xyz; + // // Calculate color + // out_color = vec4(raymarch(cam_pos, ray_dir), 1); } \ No newline at end of file