From 3e94e5d2cf6fd85da6ecbb011b8f2133e2e73968 Mon Sep 17 00:00:00 2001 From: Piotrek Date: Sun, 18 Apr 2021 13:08:56 +0200 Subject: [PATCH] basic phong lighting --- src/renderer/buffers/node_buffer.rs | 2 +- src/shaders/bin/shader.frag.spv | Bin 1464 -> 5424 bytes src/shaders/raycasting.cginc | 54 ++++++++++++++++++++++++++++ src/shaders/shader.frag | 17 ++++----- 4 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 src/shaders/raycasting.cginc diff --git a/src/renderer/buffers/node_buffer.rs b/src/renderer/buffers/node_buffer.rs index d3ca602..6c7d5a9 100644 --- a/src/renderer/buffers/node_buffer.rs +++ b/src/renderer/buffers/node_buffer.rs @@ -2,7 +2,7 @@ pub const DATA: &[u32] = &[ // z0 1,0, - 0,0, + 0,1, // z1 0,0, 0,0, diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index 22cca161c0d3b72c141b9fe8acdbd3262c3d1bce..d33f54ecb3ddcde3311272de8de8e274b87d4bde 100644 GIT binary patch literal 5424 zcmZveiIY@U6~-S7GhiSDvXGD%9D*!{NHBy=gg_PtbQB_>(Wp%`(?c41nRNF|K#WX` zk!VZ=jZ3-4eThp_<-TH6+=xru;{IQ_RcZPAy}k!tb@{3e=li~M&b{Z{cl$AY)0fQ5 zvT50Q+4n_?(%$rc^>0st;$%9^Uh`0KZ;ha@2^(aQGN`b`ps*O!`tJP zk%?M4tuv6FKx^(l=rY|V;P&w)eD9uLMcdn`jxj)x^P zR`Xz~tCy<0lmXVZ#``o(;quu}*H? zRxIk&&efee1M{Y^A?{wBi~V^X_UjWo`jvY|i}GkU?r%2uMVzkZyO=fowTl;k2JnN} zrPSMt-1s1T7G6zT%rwtPSY2C5j`Lu;s-GwXIO`K9rcAwupwdRFFx+;a|P3H#G7aR z^A&m2HYJ{afZ(3l7QDTAX7X)#_wqYt-{PAvAJ^N1w;#_f;9kV&J(lz9PHla%;AKb?-!VB-hvsA8Gi{jruh_SJPkMQjNXIa zVb19Nh?#z$bkD?hE05S8z^-A;_blH?Kc2-Ou{oGE#$wh#fsOfu_GhqK@l5`bwBnik z70r6{jr)Gx+xu?cRyuQHgXGekW0q-qvXdg1-nk{ zeHqxj2QXvS_`cMm=5nz81iu1o|M#Xnp9wZcJ^EV&zOrEVq}*qrnQuJS8w9)OLn&u5 zSk3yVy9#Wrv8Y=DcE0;k-Lt{wsXK@FOik<^Tb{7@YbEwC?(sEv@3a2ze3Mq;uf=?f zuf`kKyYCA8^Dx(VoPF2euTR=__**73|#6(*t00)Z?zc4IKL$cmIez zlwz0T&3h1w-rf#&e{<~ZI9^SB0)G;VKHdTLJcGXz>@0DI9|oJF9y#v z){u5wx z)FbDU;Nti7Q*iUtBj?j#XNvdm8L*nU_F+sd@;?hM_VFmZ*vIGK=BP)_=fQKa*y9Ue xHFMp=n4158UyJvh>aAaa{~~rZHpTBu{&>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<- diff --git a/src/shaders/raycasting.cginc b/src/shaders/raycasting.cginc new file mode 100644 index 0000000..a2bb3b5 --- /dev/null +++ b/src/shaders/raycasting.cginc @@ -0,0 +1,54 @@ + +vec3 raycast(vec3 origin, vec3 dir) +{ + // Round input pos to nearest voxel + vec3 pos = floor(origin); + // Inverse ray direction + vec3 rayInv = 1.0/dir; + // Sign of the ray direction, to know where to increment pos + vec3 raySign = sign(dir); + // Distance to next voxel in grid + vec3 dist = (pos-origin+0.5 + raySign*0.5) * rayInv; + + // Closest axis to increment in grid will be stored here (x=1 or y=1 or z=1) + vec3 incAxis = vec3(0,0,0); + + + for(int i=0;i<50;i++) + { + // Get node + uint node = texelFetch(diffuseTex, ivec3(pos), 0).r; + if(node != 0) + { + // 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; + // Normal vector (negate previous increment axis and mult by sign) + vec3 normal = -incAxis * raySign; + + // Lighting + vec3 light_color = vec3(1.0, 1.0, 1.0); + vec3 light_dir = normalize(point-vec3(0.0, 1.5, 4.0)); + + vec3 ambient = light_color * 0.1; + vec3 diffuse = light_color * max(1.0-dot(normal, light_dir), 0.0); + vec3 specular = light_color * pow(max(dot(dir, reflect(-light_dir, normal)), 0.0), 32); + + // Object color + vec3 object_color = vec3(0.0, 0.1, 0.5); + return (ambient + diffuse + specular) * object_color; + } + + // Get new closest axis to increment + incAxis = step(dist.xyz, dist.yzx) * step(dist.xyz, dist.zxy); + dist += incAxis * raySign * rayInv; + pos += incAxis * raySign; + + // if(pos.x < 0 || pos.y < 0 || pos.z < 0) { break; } + // if(pos.x > 1 || pos.y > 1 || pos.z > 1) { break; } + } + + // Not found + return vec3(0.0, 0.0, 0.0); +} \ No newline at end of file diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index b6d9cf9..1204900 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -24,19 +24,14 @@ layout(set=1,binding=0) uniform usampler3D diffuseTex; // Include #include "shapes.cginc" -#include "raymarching.cginc" +#include "raycasting.cginc" 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; + + // Raycast + out_color = vec4(raycast(cam_pos, ray_dir), 1.0); } \ No newline at end of file