From 2f5631e46aed3e278377a678b9e49714bfd33968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Sun, 3 Dec 2023 07:06:38 +0100 Subject: [PATCH] path tracing: added support for non-shadow casting light and non-shadow receiver surface --- WickedEngine/shaders/raytraceCS.hlsl | 74 +++++++++++++++------------- WickedEngine/wiVersion.cpp | 2 +- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/WickedEngine/shaders/raytraceCS.hlsl b/WickedEngine/shaders/raytraceCS.hlsl index 5525bb15b1..b87244bf5a 100644 --- a/WickedEngine/shaders/raytraceCS.hlsl +++ b/WickedEngine/shaders/raytraceCS.hlsl @@ -308,51 +308,55 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) { float3 shadow = energy; - RayDesc newRay; - newRay.Origin = surface.P; - newRay.TMin = 0.001; - newRay.TMax = dist; - newRay.Direction = L + max3(surface.sss); + if(light.IsCastingShadow() && surface.IsReceiveShadow()) + { + RayDesc newRay; + newRay.Origin = surface.P; + newRay.TMin = 0.001; + newRay.TMax = dist; + newRay.Direction = L + max3(surface.sss); #ifdef RTAPI - uint flags = RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES | RAY_FLAG_CULL_FRONT_FACING_TRIANGLES; - if (bounce > ANYTHIT_CUTOFF_AFTER_BOUNCE_COUNT) - { - flags |= RAY_FLAG_FORCE_OPAQUE; - } + uint flags = RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES | RAY_FLAG_CULL_FRONT_FACING_TRIANGLES; + if (bounce > ANYTHIT_CUTOFF_AFTER_BOUNCE_COUNT) + { + flags |= RAY_FLAG_FORCE_OPAQUE; + } - q.TraceRayInline( - scene_acceleration_structure, // RaytracingAccelerationStructure AccelerationStructure - flags, // uint RayFlags - 0xFF, // uint InstanceInclusionMask - newRay // RayDesc Ray - ); - while (q.Proceed()) - { - PrimitiveID prim; - prim.primitiveIndex = q.CandidatePrimitiveIndex(); - prim.instanceIndex = q.CandidateInstanceID(); - prim.subsetIndex = q.CandidateGeometryIndex(); + q.TraceRayInline( + scene_acceleration_structure, // RaytracingAccelerationStructure AccelerationStructure + flags, // uint RayFlags + 0xFF, // uint InstanceInclusionMask + newRay // RayDesc Ray + ); + while (q.Proceed()) + { + PrimitiveID prim; + prim.primitiveIndex = q.CandidatePrimitiveIndex(); + prim.instanceIndex = q.CandidateInstanceID(); + prim.subsetIndex = q.CandidateGeometryIndex(); - Surface surface; - surface.init(); - surface.hit_depth = q.CandidateTriangleRayT(); - if (!surface.load(prim, q.CandidateTriangleBarycentrics())) - break; + Surface surface; + surface.init(); + surface.hit_depth = q.CandidateTriangleRayT(); + if (!surface.load(prim, q.CandidateTriangleBarycentrics())) + break; - shadow *= lerp(1, surface.albedo * surface.transmission, surface.opacity); + shadow *= lerp(1, surface.albedo * surface.transmission, surface.opacity); - [branch] - if (!any(shadow)) - { - q.CommitNonOpaqueTriangleHit(); + [branch] + if (!any(shadow)) + { + q.CommitNonOpaqueTriangleHit(); + } } - } - shadow = q.CommittedStatus() == COMMITTED_TRIANGLE_HIT ? 0 : shadow; + shadow = q.CommittedStatus() == COMMITTED_TRIANGLE_HIT ? 0 : shadow; #else - shadow = TraceRay_Any(newRay, xTraceUserData.y, rng, groupIndex) ? 0 : shadow; + shadow = TraceRay_Any(newRay, xTraceUserData.y, rng, groupIndex) ? 0 : shadow; #endif // RTAPI + } + if (any(shadow)) { lightColor *= shadow; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index f03c7f9ab9..c2553c8c58 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 354; + const int revision = 355; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);