From 8585f21c7025a2a52d58ace70898c5cdf84adcf6 Mon Sep 17 00:00:00 2001 From: Piotrek Date: Sat, 24 Apr 2021 23:33:33 +0200 Subject: [PATCH] HitResult and Ray structs. random function. --- src/shaders/bin/shader.frag.spv | Bin 11760 -> 11172 bytes src/shaders/raycasting.cginc | 17 +++++++++-------- src/shaders/shader.frag | 16 +++++++++++----- src/shaders/shading.cginc | 2 +- src/shaders/structs.cginc | 5 +++++ 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/shaders/bin/shader.frag.spv b/src/shaders/bin/shader.frag.spv index a00dcb0a9c37ddfcbe265655fd8e083be91331c3..d625b253db117e5888cba26b0b64374d2edd4f23 100644 GIT binary patch literal 11172 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 diff --git a/src/shaders/raycasting.cginc b/src/shaders/raycasting.cginc index 5218905..1c271ae 100644 --- a/src/shaders/raycasting.cginc +++ b/src/shaders/raycasting.cginc @@ -1,6 +1,7 @@ /* * origin: Point hit on the node +* start: Camera pos * dir: Camera view direction (ray direction) * incAxis: Last axis that was used to increment position * addr: Number given by node, brick offset in brick array @@ -54,16 +55,16 @@ HitResult castBricks(vec3 origin, vec3 start, vec3 dir, vec3 incAxis, uint addr) * origin: Camera position * dir: Ray coming from camera position going through currently drawn pixel */ -HitResult castNodes(vec3 origin, vec3 dir) +HitResult castNodes(Ray ray) { // Round input pos to nearest voxel - vec3 pos = floor(origin); + vec3 pos = floor(ray.origin); // Inverse ray direction - vec3 rayInv = 1.0/dir; + vec3 rayInv = 1.0/ray.dir; // Sign of the ray direction, to know where to increment pos - vec3 raySign = sign(dir); + vec3 raySign = sign(ray.dir); // Distance to next voxel in grid - vec3 dist = (pos-origin+0.5 + raySign*0.5) * rayInv; + vec3 dist = (pos-ray.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); @@ -76,12 +77,12 @@ HitResult castNodes(vec3 origin, vec3 dir) if(node != 0) { // Hit point - vec3 mini = (pos-origin+0.5 - raySign*0.5) * rayInv; + vec3 mini = (pos-ray.origin+0.5 - raySign*0.5) * rayInv; float len = max(0.0, max(mini.x, max(mini.y, mini.z))); - vec3 hitPoint = origin + dir * len; + vec3 hitPoint = ray.origin + ray.dir * len; // Cast brick - HitResult result = castBricks(pos, hitPoint, dir, incAxis, node); + HitResult result = castBricks(pos, hitPoint, ray.dir, incAxis, node); if(result.data > 0) return result; } diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index bd02893..267be7e 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -32,6 +32,10 @@ layout(set=3, binding=0) uniform Materials { #include "shading.cginc" #include "raycasting.cginc" +float seed; +float random(float s) { + return fract(sin(seed++ + s)*43758.5453123); +} void main() { @@ -40,20 +44,22 @@ void main() // Calculate ray direction vec3 view_dir = (_ProjMatrixInv * vec4(vert_uv, 0, 1)).xyz; - vec3 ray_dir = normalize(_ViewMatrix * vec4(view_dir,0)).xyz; + vec3 rayDir = normalize(_ViewMatrix * vec4(view_dir,0)).xyz; + Ray primaryRay = Ray(_CamPos, rayDir); // Raycast - HitResult primary = castNodes(_CamPos, ray_dir); + HitResult primary = castNodes(primaryRay); if(primary.data > 0) { - out_color = vec4(applyLighting(primary.pos, ray_dir, primary.normal, primary.data), 1.0); + out_color = vec4(applyLighting(primary.pos, primaryRay.dir, primary.normal, primary.data), 1.0); - HitResult shadow = castNodes(primary.pos-ray_dir*0.000001, _SunDir); + 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(ray_dir, vec3(0, 1, 0)) + 0.1, 0, 1); + 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); } diff --git a/src/shaders/shading.cginc b/src/shaders/shading.cginc index 212436f..2d8c021 100644 --- a/src/shaders/shading.cginc +++ b/src/shaders/shading.cginc @@ -10,7 +10,7 @@ vec3 applyLighting(vec3 hitPoint, vec3 view, vec3 normal, uint brick) 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); + 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); diff --git a/src/shaders/structs.cginc b/src/shaders/structs.cginc index 101e9cc..15229ad 100644 --- a/src/shaders/structs.cginc +++ b/src/shaders/structs.cginc @@ -1,4 +1,9 @@ +struct Ray { + vec3 origin; + vec3 dir; +}; + struct HitResult { uint data; // Voxel data vec3 pos; // Position in world