From 5e968d0a30d15a366ff4ec9eb901b84cabfed89e Mon Sep 17 00:00:00 2001 From: Piotrek Date: Mon, 19 Apr 2021 23:28:20 +0200 Subject: [PATCH] aspiojsanfopinaogpinhaeogfl --- src/renderer/buffers/brick_buffer.rs | 84 +++++++++++++++++++++++++++ src/renderer/buffers/mod.rs | 3 + src/renderer/buffers/node_buffer.rs | 39 +++---------- src/renderer/mod.rs | 3 +- src/shaders/bin/shader.frag.spv | Bin 4464 -> 5724 bytes src/shaders/raycasting.cginc | 6 +- src/shaders/shader.frag | 2 +- 7 files changed, 100 insertions(+), 37 deletions(-) create mode 100644 src/renderer/buffers/brick_buffer.rs diff --git a/src/renderer/buffers/brick_buffer.rs b/src/renderer/buffers/brick_buffer.rs new file mode 100644 index 0000000..8be2ba0 --- /dev/null +++ b/src/renderer/buffers/brick_buffer.rs @@ -0,0 +1,84 @@ + +const BRICK_SIZE : usize = 32; // 32x32x32 brick size +const BRICK_NUM : usize = 64; // 64 bricks in texture + + +pub struct BrickBuffer { + //bricks: [[u8; BRICK_SIZE*BRICK_SIZE*BRICK_SIZE];BRICK_NUM], + texture: wgpu::Texture, + size: wgpu::Extent3d, + pub bind_layout: wgpu::BindGroupLayout, + pub bind_group: wgpu::BindGroup +} + +impl BrickBuffer { + pub fn new(device: &wgpu::Device) -> Self { + + // Create texture + let size = wgpu::Extent3d { width: (BRICK_SIZE*BRICK_NUM) as u32, height: BRICK_SIZE as u32, depth: BRICK_SIZE as u32 }; + let texture = device.create_texture( + &wgpu::TextureDescriptor { + size: size, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D3, + format: wgpu::TextureFormat::R32Uint, + usage: wgpu::TextureUsage::SAMPLED | wgpu::TextureUsage::COPY_DST, // STORAGE? + label: Some("Brick texture"), + } + ); + + // Bind layout + let bind_layout = device.create_bind_group_layout( + &wgpu::BindGroupLayoutDescriptor { + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStage::FRAGMENT, + ty: wgpu::BindingType::Texture { multisampled: false, view_dimension: wgpu::TextureViewDimension::D3, sample_type: wgpu::TextureSampleType::Uint }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStage::FRAGMENT, + ty: wgpu::BindingType::Sampler { comparison: false, filtering: false }, + count: None, + }, + ], + label: Some("Node texture layout"), + } + ); + + // 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, + ..Default::default() + }); + let bind_group = device.create_bind_group( + &wgpu::BindGroupDescriptor { + layout: &bind_layout, + entries: &[ + wgpu::BindGroupEntry { binding: 0, resource: wgpu::BindingResource::TextureView(&view) }, + wgpu::BindGroupEntry { binding: 1, resource: wgpu::BindingResource::Sampler(&sampler) } + ], + label: Some("Brick texture group"), + } + ); + + // Data + // let mut bricks = [[0; BRICK_SIZE*BRICK_SIZE*BRICK_SIZE]; BRICK_NUM]; + // for x in 0..32 { + // for y in 0..16 { + // for z in 0..32 { + // let idx = x + BRICK_SIZE * (y + BRICK_SIZE * z); + // bricks[0][idx] = 1; + // } + // } + // } + + // Done + Self { texture, size, bind_layout, bind_group } + } +} \ No newline at end of file diff --git a/src/renderer/buffers/mod.rs b/src/renderer/buffers/mod.rs index 75cb1e7..48992e7 100644 --- a/src/renderer/buffers/mod.rs +++ b/src/renderer/buffers/mod.rs @@ -2,6 +2,9 @@ mod node_buffer; pub use node_buffer::NodeBuffer; +mod brick_buffer; +pub use brick_buffer::BrickBuffer; + mod uniform_buffer; pub use uniform_buffer::UniformBuffer; pub use uniform_buffer::UniformValues; diff --git a/src/renderer/buffers/node_buffer.rs b/src/renderer/buffers/node_buffer.rs index 3a90b46..b431310 100644 --- a/src/renderer/buffers/node_buffer.rs +++ b/src/renderer/buffers/node_buffer.rs @@ -1,31 +1,10 @@ -// pub const DATA: &[u32] = &[ -// // z0 -// 1,0, -// 0,1, -// // z1 -// 0,0, -// 0,0, -// ]; - -const MAX_NODE_NUM : usize = 16; -const TEXTURE_SIZE : u32 = 4; - -#[repr(C)] -#[derive(Default, Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] -struct Node { - data: [u32; 8] -} - -impl Node { - pub fn set(&mut self, x: usize, y: usize, z: usize, value: u32) { - let idx = x + 2 * (y + 2 * z); - self.data[idx] = value; - } -} +// 4x4x4 nodes +const WORLD_SIZE: u32 = 4; +const NUM_NODES: usize = (WORLD_SIZE*WORLD_SIZE*WORLD_SIZE) as usize; pub struct NodeBuffer { - nodes: [Node;MAX_NODE_NUM], + nodes: [u32;NUM_NODES], texture: wgpu::Texture, size: wgpu::Extent3d, pub bind_layout: wgpu::BindGroupLayout, @@ -36,10 +15,8 @@ impl NodeBuffer { pub fn new(device: &wgpu::Device) -> Self { - - // Create texture - let size = wgpu::Extent3d { width: TEXTURE_SIZE, height: TEXTURE_SIZE, depth: TEXTURE_SIZE }; + let size = wgpu::Extent3d { width: WORLD_SIZE, height: WORLD_SIZE, depth: WORLD_SIZE }; let texture = device.create_texture( &wgpu::TextureDescriptor { size: size, @@ -92,10 +69,8 @@ impl NodeBuffer { ); // Data - let mut nodes : [Node; MAX_NODE_NUM] = [Default::default(); MAX_NODE_NUM]; - nodes[0].set(0, 0, 0, 1); - nodes[1].set(0, 0, 0, 1); - nodes[1].set(1, 1, 1, 1); + let mut nodes : [u32; NUM_NODES] = [Default::default(); NUM_NODES]; + nodes[0] = 1; // Done Self { nodes, texture, size, bind_layout, bind_group } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 6c632ea..66ecfd7 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -1,6 +1,6 @@ use winit::{window::Window, dpi::PhysicalSize}; -mod buffers; use buffers::{NodeBuffer, UniformBuffer, RasterBuffer, Vertex}; +mod buffers; use buffers::{NodeBuffer, BrickBuffer, UniformBuffer, RasterBuffer, Vertex}; pub mod camera; use camera::Camera; @@ -107,6 +107,7 @@ impl Renderer { let raster_buffer = RasterBuffer::new(&device); let mut node_buffer = NodeBuffer::new(&device); node_buffer.write(&queue); + let mut brick_buffer = BrickBuffer::new(&device); // Pipeline let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout]); diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index 4995b4f8748a51b8f392e8d6f35944d52db61f79..6716f2d05dd8619fdace11b050d2369f88774f32 100644 GIT binary patch literal 5724 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 literal 4464 zcmZve>2nli5QhhHpd=zFpm-)A5>Qb&MLa;ophknDD2gs?vWbhyZfdhxgJ-<4N>RM; z`vmbmzWYacRcZM=v(scM<(uks_pk4scP43>y=+dB%u41aCnUcn&9fkx4U!}sNqfqB z`*!xN9(M~2~e1-$X(L!@qEy*EtkG=TZ8>L#k zFwsc$_tDv7+KRn-C#nM# zn>}h<<}c26s)UdCaDIw4r(>F|cF;Y9c3p#~(dr{Zkg?=1dOzLKu<1<-YIu9THPlA$U>dMg1 zO!efLer{9eu6hfSWCbJ^WUU@_ZRT5qz6#z2%}RMIwVHNu>&P#FJfW{cUIQ&;y7h4L zY=n0~9_w5Jw~qJ{Cb~3}-ADdd*K<1C@FmyJ_{#)2Vw*GFd*pG4Tj2KQ4%M%QTgz{W zeJXE*JfZJKwqEFaknJb-#p{>2)1a950GM&sc>(V3taB>A55mRN&&uwpnB@G<@)F!S z-Z5uU_l}8ae>szlvBqm~YlQuEWb2C?ul`1c8UGcsd$14f>W4EdW;lW#`Hp6?{cWIU zar^g}=T8vdDRX)M{2u8Wy5EGn?)#tDegD>nT*!Ci5IMBH3t2~>ekQS}_aJe}V=m{vg2|mzd-VMQ zvVC6wMc*GHi>sUOBgnYu`{N9Q9m77!Fl&Y1rx|ALnB_BMJTc4X$R9%bbh07m z`vNlOHb{HS_$9J7$&;VaXQ$m6kHWu!oYDIcGku%k?!;%S9=7k1&7sZbtiFkU+{F)2 zCuEGanDs|wZJxk>LKe&K^R>43TiZWmxCHVZ+k^EzenU6n=lz|V zlRJ>T-zUK1KF>ooHuMEE^u;suB{THpIlTvYWlr~ddVWs#ySOQ*+usd2-S}NOU3+nc zKAh?COio01M(>4l%!k~ovD)01Gm1yd$;j?vM;5aX+1&;m$o9DiOq>4ZaW`U-=M-e~ zMD0_Nt=$f3GsgXiN6cx+_7nQ)$oBtaR`U#GeZ-?b|Gvg|S^jwDdp5HE+9O{VvNaE8 zKHbP-`M9O%#%hbWWysF=bQX6GvVP*u;d2*L_L;B9WS@83OP{shi@&&ItKr@?`R{x$ zE`nbSd9<&AYnR)@D)?H+9N*K!diaJ6TL=FeAN30%a~Z2_>}L2CsXRT;mFVudf_)2o zD090_pQFcTn8Bcs)Gw)sTJXLm$ud_&Zxi7n98CJL8F36Ub4^T>3|@ z268_41DPJVC(*^E$ZM|1y&pMpn@j)L+k?o~*2lfMbFrxX5VBb447+@s6y3`@hD2Sz2rR diff --git a/src/shaders/raycasting.cginc b/src/shaders/raycasting.cginc index bc0357d..c592d6f 100644 --- a/src/shaders/raycasting.cginc +++ b/src/shaders/raycasting.cginc @@ -19,7 +19,7 @@ vec3 solve(vec3 point, vec3 view, vec3 normal) return (ambient + diffuse + specular) * object_color; } -vec3 raycast(vec3 origin, vec3 dir) +vec3 castNodes(vec3 origin, vec3 dir) { // Round input pos to nearest voxel vec3 pos = floor(origin); @@ -48,9 +48,9 @@ vec3 raycast(vec3 origin, vec3 dir) vec3 normal = -incAxis * raySign; // Get subnode - return step(vec3(0.5, 0.5, 0.5), point - pos); + //return step(vec3(0.5, 0.5, 0.5), point - pos); - //return solve(point, dir, normal); + return solve(point, dir, normal); } // Get new closest axis to increment diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index 1204900..e7adf88 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -33,5 +33,5 @@ void main() vec3 ray_dir = normalize(view_matrix * vec4(view_dir,0)).xyz; // Raycast - out_color = vec4(raycast(cam_pos, ray_dir), 1.0); + out_color = vec4(castNodes(cam_pos, ray_dir), 1.0); } \ No newline at end of file