From a666ca7d3ca2ec65ac5a5ee7b750e1e9c80eff9b Mon Sep 17 00:00:00 2001 From: saschawillems Date: Sun, 27 Mar 2016 23:45:41 +0200 Subject: [PATCH] Ray tracing shadows --- data/shaders/raytracing/raytracing.comp | 59 +++++++++++++------- data/shaders/raytracing/raytracing.comp.spv | Bin 10516 -> 11352 bytes raytracing/raytracing.cpp | 10 ++-- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/data/shaders/raytracing/raytracing.comp b/data/shaders/raytracing/raytracing.comp index f35e61a6..c66eda29 100644 --- a/data/shaders/raytracing/raytracing.comp +++ b/data/shaders/raytracing/raytracing.comp @@ -8,9 +8,11 @@ layout (local_size_x =16, local_size_y = 16) in; layout (binding = 0, rgba8) uniform image2D resultImage; +#define EPSILON 0.0001 #define MAXLEN 1000.0 #define PLANEID 1 #define SPHERECOUNT 3 +#define SHADOW 0.5 struct Camera { vec3 pos; @@ -97,13 +99,6 @@ int intersect(in vec3 rayO, in vec3 rayD, out float resT) int id = -1; resT = MAXLEN; - float tplane = planeIntersect(rayO, rayD); - if ((tplane > 0.0) && (tplane < resT)) - { - id = PLANEID; - resT = tplane; - } - for (int i = 0; i < SPHERECOUNT; i++) { float tSphere = sphereIntersect(rayO, rayD, spheres[i]); @@ -115,17 +110,38 @@ int intersect(in vec3 rayO, in vec3 rayD, out float resT) } } + float tplane = planeIntersect(rayO, rayD); + if ((tplane > 0.0) && (tplane < resT)) + { + id = PLANEID; + resT = tplane; + } + return id; } +float calcShadow(in vec3 rayO, in vec3 rayD, in int id) +{ + for (int i = 0; i < SPHERECOUNT; i++) + { + float tSphere = sphereIntersect(rayO, rayD, spheres[i]); + if (tSphere > EPSILON) + { + return SHADOW; + } + } + return 1.0; +} + vec3 fog(in float t, in vec3 color) { - return mix(color, ubo.fogColor.rgb, clamp(sqrt(t*t)/10.0, 0.0, 1.0)); + return mix(color, ubo.fogColor.rgb, clamp(sqrt(t*t)/20.0, 0.0, 1.0)); } void main() { // Scene setup + // todo : from ubo spheres[0].id = 2; spheres[0].pos = vec3(-2.25, 1.0, 0.0); spheres[0].r = 1.0; @@ -133,17 +149,17 @@ void main() spheres[0].material.specular = vec3(1.0, 1.0, 1.0); spheres[1].id = 3; - spheres[1].pos = vec3(2.25, 1.0, 0.0); + spheres[1].pos = vec3(0.0, 2.5, 0.0); spheres[1].r = 1.0; - spheres[1].material.diffuse = vec3(0.0, 1.0, 0.0); - spheres[1].material.specular = vec3(1.0, 1.0, 1.0); + spheres[1].material.diffuse = vec3(0.0, 0.0, 1.0); + spheres[1].material.specular = vec3(1.0, 1.0, 1.0); spheres[2].id = 4; - spheres[2].pos = vec3(0.0, 1.0, 0.0); + spheres[2].pos = vec3(2.25, 1.0, 0.0); spheres[2].r = 1.0; - spheres[2].material.diffuse = vec3(0.0, 0.0, 1.0); - spheres[2].material.specular = vec3(1.0, 1.0, 1.0); - + spheres[2].material.diffuse = vec3(0.0, 1.0, 0.0); + spheres[2].material.specular = vec3(1.0, 1.0, 1.0); + ivec2 pixelCoord = ivec2(gl_GlobalInvocationID.xy); ivec2 dim = imageSize(resultImage); vec2 uv = vec2(gl_GlobalInvocationID.xy)/dim; @@ -156,12 +172,13 @@ void main() int objectID = intersect(rayO, rayD, t); vec3 color = vec3(0.0); + + vec3 pos = rayO + t * rayD; + vec3 lightVec = normalize(ubo.lightPos - pos); if (objectID == PLANEID) { - vec3 pos = rayO + t * rayD; vec3 normal = planeNormal(pos); - vec3 lightVec = normalize(ubo.lightPos - pos); float diffuse = clamp(dot(normal, lightVec), 0.0, 1.0); color = vec3(1.0, 1.0, 1.0) * diffuse; } @@ -171,8 +188,6 @@ void main() { if (objectID == spheres[i].id) { - vec3 pos = rayO + t * rayD; - vec3 lightVec = normalize(ubo.lightPos - pos); vec3 normal = sphereNormal(pos, spheres[i]); float diffuse = lightDiffuse(normal, lightVec); float specular = lightSpecular(normal, lightVec); @@ -180,7 +195,11 @@ void main() } } } - + + // Shadows + color *= calcShadow(pos, lightVec, objectID); + + // Fog color = fog(t, color); imageStore(resultImage, ivec2(gl_GlobalInvocationID.xy), vec4(color, 0.0)); diff --git a/data/shaders/raytracing/raytracing.comp.spv b/data/shaders/raytracing/raytracing.comp.spv index 88cd271997c629bbc4da536b8d19b239d11912b6..91cb7a55405dfd3129df567caf5132f6bba0f2fe 100644 GIT binary patch literal 11352 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 literal 10516 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 Ar2qf` diff --git a/raytracing/raytracing.cpp b/raytracing/raytracing.cpp index 067e1041..188cb4a0 100644 --- a/raytracing/raytracing.cpp +++ b/raytracing/raytracing.cpp @@ -54,7 +54,7 @@ public: float aspectRatio; glm::vec4 fogColor = glm::vec4(0.025f, 0.025f, 0.025f, 0.0f); struct { - glm::vec3 pos = glm::vec3(0.0f, 1.0f, 4.0f); + glm::vec3 pos = glm::vec3(0.0f, 1.5f, 4.0f); glm::vec3 lookat = glm::vec3(0.0f, 0.5f, 0.0f); float fov = 10.0f; } camera; @@ -84,6 +84,7 @@ public: title = "Vulkan Example - Compute shader ray tracing"; uboCompute.aspectRatio = (float)width / (float)height; paused = true; + timerSpeed *= 0.5f; } ~VulkanExample() @@ -656,9 +657,10 @@ public: void updateUniformBuffers() { - uboCompute.lightPos.x = 0.0f; - uboCompute.lightPos.y = 1.0f; - uboCompute.lightPos.z = 1.5f; + uboCompute.lightPos.x = 0.0f + sin(glm::radians(timer * 360.0f)) * 2.0f; + uboCompute.lightPos.y = 5.0f; + uboCompute.lightPos.z = 1.0f; + uboCompute.lightPos.z = 0.0f + cos(glm::radians(timer * 360.0f)) * 2.0f; uint8_t *pData; vkTools::checkResult(vkMapMemory(device, uniformDataCompute.memory, 0, sizeof(uboCompute), 0, (void **)&pData)); memcpy(pData, &uboCompute, sizeof(uboCompute));