Files
UnrealEngine/Engine/Shaders/Private/Lumen/LumenSceneDebugHardwareRayTracing.usf
2025-05-18 13:04:45 +08:00

129 lines
4.3 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "/Engine/Shared/RayTracingTypes.h"
#include "../Common.ush"
#include "../MonteCarlo.ush"
#include "../MortonCode.ush"
#include "../SceneTextureParameters.ush"
#include "LumenCardCommon.ush"
#include "LumenTracingCommon.ush"
//#include "LumenReflectionCommon.ush"
#ifndef LUMEN_HARDWARE_RAYTRACING
#define LUMEN_HARDWARE_RAYTRACING 0
#endif // LUMEN_HARDWARE_RAYTRACING
#ifndef LUMEN_HARDWARE_INLINE_RAYTRACING
#define LUMEN_HARDWARE_INLINE_RAYTRACING 0
#endif // LUMEN_HARDWARE_INLINE_RAYTRACING
#if LUMEN_HARDWARE_RAYTRACING || LUMEN_HARDWARE_INLINE_RAYTRACING
#include "LumenHardwareRayTracingCommon.ush"
#endif // LUMEN_HARDWARE_RAYTRACING || LUMEN_HARDWARE_INLINE_RAYTRACING
#include "LumenCardTile.ush"
#include "../ShaderPrint.ush"
#if LUMEN_HARDWARE_RAYTRACING || LUMEN_HARDWARE_INLINE_RAYTRACING
RaytracingAccelerationStructure TLAS;
#if LUMEN_HARDWARE_INLINE_RAYTRACING
StructuredBuffer<FHitGroupRootConstants> HitGroupData;
StructuredBuffer<FRayTracingSceneMetadataRecord> RayTracingSceneMetadata;
FLumenTraceRayInlineCallback InitLumenTraceRayInlineCallback()
{
FLumenTraceRayInlineCallback Callback;
Callback.HitGroupData = HitGroupData;
Callback.bShadowRay = true;
return Callback;
}
#endif // LUMEN_HARDWARE_INLINE_RAYTRACING
#if SHADER_DEBUG_SCENE
float ResolutionScale;
RWStructuredBuffer<uint> RWDebugData;
LUMEN_HARDWARE_RAY_TRACING_ENTRY(LumenSceneDebugHardwareRayTracing)
{
ResolvedView = ResolveView();
if (all(DispatchThreadIndex == 0))
{
FShaderPrintContext Ctx = InitShaderPrintContext(true, uint2(800, 50));
const int2 PixelCoord = int2(ResolutionScale * GetCursorPos(Ctx));
if (all(PixelCoord >= 0))
{
const float2 BufferUV = (PixelCoord + 0.5f) * View.BufferSizeAndInvSize.zw;
FRayDesc Ray = CreatePrimaryRay(BufferUV);
FRayCone RayCone = (FRayCone)0;
uint2 DummyCoordInCardTile = 0;
uint MaxTraversalIterations = 1;
uint MeshSectionVisibilityTest = 0;
FRayTracedLightingContext Context = CreateRayTracedLightingContext(
RayCone,
DummyCoordInCardTile,
DummyCoordInCardTile.x, // dummy coordinate
RAY_FLAG_CULL_BACK_FACING_TRIANGLES,
MaxTraversalIterations,
MeshSectionVisibilityTest != 0);
Context.bAcceptFirstHitAndEndSearch = true;
Context.InstanceMask = RAY_TRACING_MASK_OPAQUE;
Context.bIsShadowRay = false;
#if LUMEN_HARDWARE_INLINE_RAYTRACING
{
Context.HitGroupData = HitGroupData;
Context.RayTracingSceneMetadata = RayTracingSceneMetadata;
}
#endif
FLumenMinimalRayResult Result = TraceLumenMinimalRay(TLAS, Ray, Context);
if (Result.bHit)
{
float Epsilon = 0.01f;
const float3 TranslatedWorldSpacePosition = Ray.Origin + Ray.Direction * Result.HitT + Result.HitNormal * Epsilon;
const float3 AbsoluteWorldSpacePosition = TranslatedWorldSpacePosition - DFHackToFloat(PrimaryView.PreViewTranslation);
const float3 WorldSpaceNormal = Result.HitNormal;
const uint MeshCardsIndex = GetMeshCardsIndexFromSceneInstanceIndex(Result.SceneInstanceIndex);
FCardSampleAccumulator CardSampleAccumulator;
InitCardSampleAccumulator(CardSampleAccumulator);
SampleLumenMeshCards(
MeshCardsIndex,
AbsoluteWorldSpacePosition,
WorldSpaceNormal,
10.f /*SampleRadius*/,
20.0f /*SurfaceCacheBias*/,
false /*bHiResSurface*/,
CardSampleAccumulator);
FLumenSceneDebugData OutDebugData = InitLumenSceneDebugData();
if (CardSampleAccumulator.CardSample.bValid)
{
OutDebugData.MeshIndex = MeshCardsIndex;
OutDebugData.CardIndex = CardSampleAccumulator.CardSample.CardIndex;
OutDebugData.CardPageIndex = CardSampleAccumulator.CardSample.CardPageIndex;
OutDebugData.PhysicalAtlasUV = CardSampleAccumulator.CardSample.PhysicalAtlasUV;
}
WriteDebugData(OutDebugData, RWDebugData);
// Intersection detail
#if 0
const float3 RayStart = Ray.Origin + Ray.Direction * Ray.TMin;
const float3 RayEnd = Ray.Origin + Ray.Direction * (Result.bHit ? Result.HitT : Ray.TMax);
AddLineTWS(Ctx, RayStart, RayEnd, ColorGreen);
AddCrossTWS(Ctx, TranslatedWorldSpacePosition, 30.f, ColorRed);
AddLineTWS(Ctx, RayEnd, RayEnd + WorldSpaceNormal * 100.f, ColorBlue);
#endif
}
}
}
}
#endif // SHADER_DEBUG_SCENE
#endif // LUMEN_HARDWARE_RAYTRACING