From af5c2f2532ea61d20b587a0a2d5afcce4d301d4d Mon Sep 17 00:00:00 2001 From: Piotrek Date: Fri, 23 Apr 2021 15:27:04 +0200 Subject: [PATCH] working bricks ray traversing --- src/renderer/buffers/brick_buffer.rs | 6 ++- src/renderer/buffers/node_buffer.rs | 2 +- src/renderer/mod.rs | 1 + src/shaders/bin/shader.frag.spv | Bin 5800 -> 9608 bytes src/shaders/raycasting.cginc | 72 ++++++++++++++++++++++----- 5 files changed, 66 insertions(+), 15 deletions(-) diff --git a/src/renderer/buffers/brick_buffer.rs b/src/renderer/buffers/brick_buffer.rs index ab7594e..6c97c81 100644 --- a/src/renderer/buffers/brick_buffer.rs +++ b/src/renderer/buffers/brick_buffer.rs @@ -2,7 +2,7 @@ use wgpu::util::DeviceExt; use std::convert::TryInto; const BRICK_SIZE : usize = 32; // 32x32x32 brick size -const BRICK_NUM : usize = 1; // 64 bricks in texture +const BRICK_NUM : usize = 2; // x bricks in texture const BRICK_LEN : usize = BRICK_SIZE*BRICK_SIZE*BRICK_SIZE; const DATA_LEN : usize = BRICK_LEN * BRICK_NUM; @@ -98,9 +98,11 @@ impl BrickBuffer { for y in 0..16 { for z in 0..32 { bricks.set(0, x, y, z, 1); + bricks.set(1, y, x, z, 1); } } } + bricks.set(0, 0, 0, 0, 0); // Done Self { bricks, texture, size, bind_layout, bind_group } @@ -116,7 +118,7 @@ impl BrickBuffer { let brick_offset = offset*BRICK_LEN; let brick_bytes : [u8;BRICK_LEN] = self.bricks.data[brick_offset..brick_offset+BRICK_LEN].try_into().unwrap(); let brick_size = wgpu::Extent3d{ width: BRICK_SIZE as u32, height: BRICK_SIZE as u32, depth: BRICK_SIZE as u32 }; - let brick_origin = wgpu::Origin3d{ x:0, y:0, z: offset as u32 }; + let brick_origin = wgpu::Origin3d{ x:0, y:0, z: (offset*BRICK_SIZE) as u32 }; // Write queue.write_texture( diff --git a/src/renderer/buffers/node_buffer.rs b/src/renderer/buffers/node_buffer.rs index b431310..bf24347 100644 --- a/src/renderer/buffers/node_buffer.rs +++ b/src/renderer/buffers/node_buffer.rs @@ -70,7 +70,7 @@ impl NodeBuffer { // Data let mut nodes : [u32; NUM_NODES] = [Default::default(); NUM_NODES]; - nodes[0] = 1; + nodes[0] = 2; // Done Self { nodes, texture, size, bind_layout, bind_group } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 3333adb..0371774 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -112,6 +112,7 @@ impl Renderer { let mut brick_buffer = BrickBuffer::new(&device); brick_buffer.write(&queue, 0); + brick_buffer.write(&queue, 1); // Pipeline let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout, &brick_buffer.bind_layout]); diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index 32d518ee0a560a1c4596a21543c93f7ebb66d2fb..e828880e448914d7ead4573568031bce12b20612 100644 GIT binary patch literal 9608 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 literal 5800 zcmZ9Od6?B@6~})t%z!KcilS)>(n4WGiUJV=5eym#h88GtyEAhKFWk9zx_4%T${aHj zvnazBTZpKq%{JQ?dmgmCuzg>#Z13;3=c%X9=Xc)&Kkv`yaK7K~Iq!MTyWO#C;)2Op zHX)mu&B*?qwZGZfM3gL>mi6Smchj~_i(4ZDiknfV!xfWe+oG60`MgD)nyJ(z|JWsegF5)Ee1etCVWhdZjc_ZC3h6s$&)N zrWEq3_5RxEKrx}4jN-iA%rt{JT8-LRW#QQ1r7Od-%-pHOh8xxT2wpx7KUS^WjLZ3S ze7(^eD%a$bvoqlR<<`j6je$z*WW9FoEMkpjb+;?-W^J?Kv<~jh=74L}-8YSt`Wv-I zTbp}QGpk+WLVS6suUera`&j@Vs16Q}wkmm@Mex>erGKN{zKs6Iot<7weOR% z!^X?a@(|vAInu$8K8|;1$Kal$cL&Ir?(EC>>+01(jjEIyu+9 z%frpao>E&cRoT3rRL6VUUmhy8_qQwiszvzh&AUEUX^xae$8!DyID4PBVjsSP#^|ZT za?A;|;`$zY9Pi2g2JdTD`}Y<$wU=@3^+lMy2A>c1+ekdt*PZkB9vEBTKYSb0dc?j- z?{JK>W^tU{aci&`r*>*wyS{s4-Z<9FU9kr>`*WY{*DrYVD|hcM$fNDJdsXD_gX5!~ zJjS1isy?4NyHd{CpdRo%Y%cZfRc?G9dc$L?Ym|C#uQg~K79%E3qA8xpEdr4 z;%|YuzKdg6jFtNvSL7!;_+yE$rHX6)I_CP_*HzSX-QU2}<*xHM<{GbIjC=7&(r_oW z??0cB=n6rhI*z@->b(yr1sOKIalQUENRXiYxz0Y@#Y(MJ+YQwfSuc%>Fki}`z2=0 z^_cNkF&u1usmXa09(VD=PX}AKkmgJu`{p} zn6X&vpTNfaLi;mV&E7)$OVWya@>ev+n{V9nb#CvwvHwzGIp#gKhZ&gPY1lIIrr@U* z@U#M+4)(5}j*q)O2W*|-b36Ej9ehCtU(~^uC2r5w_HRb)Rbd?n~#}q&uWqXB(V9xpA2>{fO0fHITROMrfXz{loK;|JM$Q#r^VB0}HQ2fCNOjhL%~Ss$_gh|kBfe3; znOMA$Sp_^B?7KJ_9r7 zE76RZZyoniE$TcUY@L{U6WF{#vk_<73=)V8H+Anu z3Hvv9^2K=Xrv4xN7WCo!F+bx2c;k9|*om)T)_8#Z-;KX1X@mIxkRvZ+)^e=au|xP_ ztdY3)|0S6FTqoYdw~{shuYpG}$CP+2qxi9;nKv=l+kfw>;C+~JKiBDoY#ZRIfzBh8^G%En|}{@0=5uyyzz*=5gak+H`jg-;El!l?ghKg!QTX) zow&Wf8FNg$skea5QIGw8E7&^5oZ}E)Eo#0Eyd8_bi*E<3Mf@FL&nDjAJHh6tThHG~ zwa9-L*g1?H#>*r2Zm|6uJA#)->^)#>89R!XuSkE3-wU3BS?>sD+`mie-c|2x)OjCx zbAi7<@%Vq+55Uzl&tM|v=h;lge-Kk&f?3P_sQn>uvG)CmN9_;8)wHNQGIiCW%rnoPk2CJEC zAI8)o|1;oXAD@L6`}iE(9Q7FUdGI 32 || pos.y > 32 || pos.z > 32) { break; } + } + + return vec3(0.5,0.5,0.5); } +/* +* origin: Camera position +* dir: Ray coming from camera position going through currently drawn pixel +*/ vec3 castNodes(vec3 origin, vec3 dir) { // Round input pos to nearest voxel @@ -38,8 +86,8 @@ vec3 castNodes(vec3 origin, vec3 dir) // Closest axis to increment in grid will be stored here (x=1 or y=1 or z=1) vec3 incAxis = vec3(0,0,0); - float level = 1; - for(int i=0;i<50;i++) + // Iterate + for(int i=0;i<56;i++) { // Get node uint node = texelFetch(nodesTexture, ivec3(pos), 0).r; @@ -48,14 +96,13 @@ vec3 castNodes(vec3 origin, vec3 dir) // Hit point vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv; float len = max(mini.x, max(mini.y, mini.z)); - vec3 point = origin + dir * len; + vec3 hitPoint = origin + dir * len; // Normal vector (negate previous increment axis and mult by sign) - vec3 normal = -incAxis * raySign; - - // Get subnode - //return step(vec3(0.5, 0.5, 0.5), point - pos); + //vec3 normal = -incAxis * raySign; + //return solve(hitPoint, dir, normal); - return solve(point, dir, normal); + // Cast brick + return castBricks(pos, hitPoint, dir, node); //todo: continue if not hit } // Get new closest axis to increment @@ -63,6 +110,7 @@ vec3 castNodes(vec3 origin, vec3 dir) dist += incAxis * raySign * rayInv; pos += incAxis * raySign; + // Outside bounds // if(pos.x < 0 || pos.y < 0 || pos.z < 0) { break; } // if(pos.x > 1 || pos.y > 1 || pos.z > 1) { break; } }