diff --git a/res/shaders/lib/BRDF.slang b/res/shaders/lib/BRDF.slang index 8f61d4e..6e96e9c 100644 --- a/res/shaders/lib/BRDF.slang +++ b/res/shaders/lib/BRDF.slang @@ -5,6 +5,7 @@ interface IBRDF float3 evaluate(float3 viewDir_TS, float3 lightDir_TS, float3 lightColor); float3 evaluateAmbient(); float getAlpha(); + float3 getTangentNormal(); }; struct Phong : IBRDF @@ -40,6 +41,10 @@ struct Phong : IBRDF { return alpha; } + float3 getTangentNormal() + { + return normal; + } }; struct BlinnPhong : IBRDF @@ -75,6 +80,10 @@ struct BlinnPhong : IBRDF { return alpha; } + float3 getTangentNormal() + { + return normal; + } }; struct CelShading : IBRDF @@ -113,6 +122,10 @@ struct CelShading : IBRDF { return alpha; } + float3 getTangentNormal() + { + return normal; + } }; // https://learnopengl.com/PBR/Theory @@ -201,4 +214,8 @@ struct CookTorrance : IBRDF { return alpha; } + float3 getTangentNormal() + { + return normal; + } }; diff --git a/res/shaders/lib/MaterialParameter.slang b/res/shaders/lib/MaterialParameter.slang index 16b787f..3778da3 100644 --- a/res/shaders/lib/MaterialParameter.slang +++ b/res/shaders/lib/MaterialParameter.slang @@ -49,6 +49,11 @@ struct FragmentParameter result.normal_TS = mul(tbn, normal_WS); return result; } + float3x3 getTangentToWorld() + { + float3x3 tbn = float3x3(normalize(tangent_WS), normalize(biTangent_WS), normalize(normal_WS)); + return transpose(tbn); + } #endif static FragmentParameter interpolate(FragmentParameter f0, FragmentParameter f1, FragmentParameter f2, float3 barycentricCoords) { diff --git a/res/shaders/raytracing/ClosestHit.slang b/res/shaders/raytracing/ClosestHit.slang index a34afab..c8c2a02 100644 --- a/res/shaders/raytracing/ClosestHit.slang +++ b/res/shaders/raytracing/ClosestHit.slang @@ -53,6 +53,9 @@ void closestHit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttribu // gamma correction result = result / (result + float3(1.0)); result = pow(result, float3(1.0/2.2)); - + hitValue.color = result; + hitValue.alpha = brdf.getAlpha(); + hitValue.intersection_WS = WorldRayOrigin() + RayTCurrent() * WorldRayDirection(); + hitValue.normal_WS = mul(params.getTangentToWorld(), brdf.getTangentNormal()); } \ No newline at end of file diff --git a/res/shaders/raytracing/Miss.slang b/res/shaders/raytracing/Miss.slang index 97f6600..ce70e09 100644 --- a/res/shaders/raytracing/Miss.slang +++ b/res/shaders/raytracing/Miss.slang @@ -4,4 +4,7 @@ import RayTracingData; void miss(inout RayPayload p) { p.color = float3(0, 1, 0); + p.alpha = 1; + p.intersection_WS = float3(0, 0, 0); + p.normal_WS = float3(0, 0, 0); } \ No newline at end of file diff --git a/res/shaders/raytracing/RayGen.slang b/res/shaders/raytracing/RayGen.slang index 214ed7d..ea07ab6 100644 --- a/res/shaders/raytracing/RayGen.slang +++ b/res/shaders/raytracing/RayGen.slang @@ -17,10 +17,20 @@ void raygen() rayDesc.Direction = mul(pViewParams.inverseViewMatrix, float4(normalize(target.xyz), 0)).xyz; rayDesc.TMin = 0.001; rayDesc.TMax = 10000.0; + + const uint maxRays = 12; + float3 color = float3(0, 0, 0); + float alpha; + for(uint i = 0; i < maxRays; ++i) { + RayPayload payload; + TraceRay(pRayTracingParams.scene, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); + color = color.rgb * alpha + payload.color * payload.alpha; + alpha = alpha + payload.alpha; + rayDesc.Origin = payload.intersection_WS; + if(alpha > 0.9){ + break; + } + } - RayPayload payload; - payload.rayDirection = rayDesc.Direction; - TraceRay(pRayTracingParams.scene, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); - - pRayTracingParams.image[int2(LaunchID.xy)] = float4(payload.color, 1.0); + pRayTracingParams.image[int2(LaunchID.xy)] = float4(color, alpha); } diff --git a/res/shaders/raytracing/RayTracingData.slang b/res/shaders/raytracing/RayTracingData.slang index 03bfe0e..16ba583 100644 --- a/res/shaders/raytracing/RayTracingData.slang +++ b/res/shaders/raytracing/RayTracingData.slang @@ -17,6 +17,8 @@ struct CallablePayload struct RayPayload { - float3 rayDirection; float3 color; + float alpha; + float3 intersection_WS; + float3 normal_WS; }; \ No newline at end of file diff --git a/src/Engine/Asset/LevelAsset.h b/src/Engine/Asset/LevelAsset.h index 2029ff3..1d34ec5 100644 --- a/src/Engine/Asset/LevelAsset.h +++ b/src/Engine/Asset/LevelAsset.h @@ -1,5 +1,6 @@ #pragma once #include "Asset.h" +#include "TextureAsset.h" namespace Seele { class LevelAsset : public Asset { @@ -12,5 +13,6 @@ class LevelAsset : public Asset { virtual void load(ArchiveBuffer& buffer) override; private: + Array lightMaps; }; } // namespace Seele diff --git a/src/Engine/Component/PointLight.h b/src/Engine/Component/PointLight.h index c43e087..b6a3396 100644 --- a/src/Engine/Component/PointLight.h +++ b/src/Engine/Component/PointLight.h @@ -4,8 +4,8 @@ namespace Seele { namespace Component { struct PointLight { - Vector4 positionWS; - // Vector4 positionVS; + // give the lights a radius so that they are not actual points + Vector4 positionWSRadius; Vector4 colorRange; }; } // namespace Component