From 9718ea68dd66f497404db311768c793bcfffd3ed Mon Sep 17 00:00:00 2001 From: Piotrek Date: Sun, 25 Apr 2021 13:50:39 +0200 Subject: [PATCH] sampling in random hemisphere --- src/renderer/buffers/uniform_buffer.rs | 2 +- src/renderer/camera.rs | 6 +-- src/renderer/mod.rs | 2 +- src/shaders/bin/shader.frag.spv | Bin 11172 -> 15176 bytes src/shaders/raycasting.cginc | 4 +- src/shaders/shader.frag | 53 ++++++++++++++++++------- src/shaders/shading.cginc | 15 +++++-- 7 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/renderer/buffers/uniform_buffer.rs b/src/renderer/buffers/uniform_buffer.rs index f115ee0..ef12dc7 100644 --- a/src/renderer/buffers/uniform_buffer.rs +++ b/src/renderer/buffers/uniform_buffer.rs @@ -10,7 +10,7 @@ pub struct UniformValues { cam_pos: [f32; 3], padding: f32, sun_dir: [f32; 3], - padding2: f32, + //padding2: f32, time: f32 } diff --git a/src/renderer/camera.rs b/src/renderer/camera.rs index 5650760..8bbb243 100644 --- a/src/renderer/camera.rs +++ b/src/renderer/camera.rs @@ -14,8 +14,8 @@ impl Camera { pub fn new(aspect: f32, fov: f32) -> Self { Self { - position: (2.0, 1.0, -1.0).into(), - forward: (-0.66, -0.33, 0.66).into(), + position: (1.0, 2.0, 1.0).into(), + forward: (0.66, -0.25, 0.66).into(), up: Vector3::unit_y(), aspect, fovy: fov, @@ -33,6 +33,6 @@ impl Camera { } pub fn view_matrix(&self) -> Matrix4 { - return Matrix4::look_to_rh((0.0,0.0,0.0).into(), self.forward, self.up); + return Matrix4::look_to_rh((0.0,0.0,0.0).into(), self.forward.normalize(), self.up); } } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index c82f271..fb1619d 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -33,7 +33,7 @@ impl Renderer { format: adapter.get_swap_chain_preferred_format(&surface), width: size.width, height: size.height, - present_mode: wgpu::PresentMode::Mailbox, // Fifo = Vsync + present_mode: wgpu::PresentMode::Fifo, // Fifo = Vsync }; let swapchain = device.create_swap_chain(&surface, &swapchain_desc); (swapchain_desc, swapchain) diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index d625b253db117e5888cba26b0b64374d2edd4f23..541d11cefb4bd42d3b58c2479bcf0c23ab9c36b7 100644 GIT binary patch literal 15176 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 0) { - out_color = vec4(applyLighting(primary.pos, primaryRay.dir, primary.normal, primary.data), 1.0); + vec3 color = applyLighting(primary.pos, primaryRay.dir, primary.normal, primary.data); + vec3 hitPos = primary.pos-primaryRay.dir*0.000001; - Ray shadowRay = Ray(primary.pos-primaryRay.dir*0.000001, _SunDir); - HitResult shadow = castNodes(shadowRay); - if(shadow.data > 0) out_color *= 0.1; - } - else - { - float up = clamp(dot(primaryRay.dir, vec3(0, 1, 0)) + 0.1, 0, 1); - vec3 sky = vec3(0.176, 0.592, 0.901) * up; - out_color = vec4(sky, 1.0); + // Shadow ray + Ray shadowRay = Ray(hitPos, _SunDir); + HitResult shadow = castNodes(shadowRay, 50); + if(shadow.data > 0) color *= 0.1; + + // Secondary ray + Ray secondRay = Ray(hitPos, randomHemisphere(primary.normal)); + HitResult second = castNodes(secondRay, 25); + if(second.data > 0) color += getAlbedo(second.data) * 0.8; + + return color; } + + float up = clamp(dot(primaryRay.dir, vec3(0, 1, 0)) + 0.1, 0, 1); + return vec3(0.176, 0.592, 0.901) * up; +} + +void main() +{ + seed = 420 * vert_uv.x + 1337 * vert_uv.y + _Time * 1234; + out_color = vec4(solve(), 1); } \ No newline at end of file diff --git a/src/shaders/shading.cginc b/src/shaders/shading.cginc index 2d8c021..6208bba 100644 --- a/src/shaders/shading.cginc +++ b/src/shaders/shading.cginc @@ -1,18 +1,25 @@ +/* +* Returns material albedo for given voxel +*/ +vec3 getAlbedo(uint data) +{ + return _Materials[data-1].albedo.rgb; +} + /* point: Hit point view: View vector (camera ray) normal: Normal vector */ -vec3 applyLighting(vec3 hitPoint, vec3 view, vec3 normal, uint brick) +vec3 applyLighting(vec3 hitPoint, vec3 view, vec3 normal, uint data) { // Lighting - vec3 light_color = vec3(1.0, 1.0, 1.0); + vec3 light_color = vec3(1); vec3 ambient = light_color * 0.1; vec3 diffuse = light_color * max(1.0-dot(normal, _SunDir), 0.0); vec3 specular = light_color * pow(max(dot(view, reflect(_SunDir, normal)), 0.0), 32); // Combine colors - vec3 object_color = _Materials[brick-1].albedo.rgb;//vec3(0.0, 0.1, 0.5); - return (ambient + diffuse + specular) * object_color; + return (ambient + diffuse + specular) * getAlbedo(data); } \ No newline at end of file