Files
UnrealEngine/Engine/Plugins/Experimental/GPULightmass/Shaders/Private/StaticShadowDepthMap.usf
2025-05-18 13:04:45 +08:00

74 lines
2.6 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "/Engine/Private/RayTracing/RayTracingCommon.ush"
#include "LightmapCommon.ush"
RaytracingAccelerationStructure TLAS;
int StaticShadowDepthMapSuperSampleFactor;
int2 ShadowMapSize;
float4x4 LightToWorld;
float4x4 WorldToLight;
float3 LightSpaceImportanceBoundsMin;
float3 LightSpaceImportanceBoundsMax;
float MaxPossibleDistance;
RWTexture2D<half> DepthMapTexture;
[shader("raygeneration")]
void StaticShadowDepthMapTracingRG()
{
const float2 Fraction = float2(DispatchRaysIndex().xy) / ((ShadowMapSize - 1) * StaticShadowDepthMapSuperSampleFactor);
#if LIGHT_TYPE == 0
const float4 LightSpaceStartPosition = float4(
LightSpaceImportanceBoundsMin.xy + Fraction * (LightSpaceImportanceBoundsMax.xy - LightSpaceImportanceBoundsMin.xy),
LightSpaceImportanceBoundsMin.z,
1);
const float4 LightSpaceEndPosition = float4(LightSpaceStartPosition.x, LightSpaceStartPosition.y, LightSpaceImportanceBoundsMax.z, 1);
#elif LIGHT_TYPE == 1
const float4 LightSpaceStartPosition = float4(0, 0, 0, 1);
const float4 LightSpaceEndPosition = float4(
LightSpaceImportanceBoundsMin.xy + Fraction * (LightSpaceImportanceBoundsMax.xy - LightSpaceImportanceBoundsMin.xy),
LightSpaceImportanceBoundsMax.z,
1);
#else
const float Phi = Fraction.y * PI;
const float SinPhi = sin(Phi);
const float Theta = Fraction.x * 2 * PI;
const float3 Direction = normalize(float3(cos(Theta) * SinPhi, sin(Theta) * SinPhi, cos(Phi)));
const float4 LightSpaceStartPosition = float4(0, 0, 0, 1);
const float4 LightSpaceEndPosition = float4(Direction * MaxPossibleDistance, 1);
#endif
const float3 WorldSpaceStartPosition = mul(LightSpaceStartPosition, LightToWorld).xyz;
const float3 WorldSpaceEndPosition = mul(LightSpaceEndPosition, LightToWorld).xyz;
FRayDesc Ray;
Ray.Origin = WorldSpaceStartPosition;
Ray.Direction = normalize(WorldSpaceEndPosition - WorldSpaceStartPosition);
Ray.TMin = 0;
Ray.TMax = length(WorldSpaceEndPosition - WorldSpaceStartPosition);
const uint RayFlags = 0;
FMinimalPayload MinimalPayload = TraceLightmapVisibilityRay(
TLAS,
RayFlags,
Ray);
if (MinimalPayload.IsHit())
{
#if LIGHT_TYPE == 0 || LIGHT_TYPE == 2
DepthMapTexture[DispatchRaysIndex().xy] = MinimalPayload.HitT / MaxPossibleDistance;
#elif LIGHT_TYPE == 1
const float4 WorldSpaceHitPosition = float4(Ray.Origin + Ray.Direction * MinimalPayload.HitT, 1);
const float4 LightSpaceHitPosition = mul(WorldSpaceHitPosition, WorldToLight);
DepthMapTexture[DispatchRaysIndex().xy] = LightSpaceHitPosition.z / MaxPossibleDistance;
#endif
}
else
{
DepthMapTexture[DispatchRaysIndex().xy] = 1;
}
}