Files
UnrealEngine/Engine/Source/Runtime/Renderer/Private/PathTracingSpatialTemporalDenoising.h
2025-05-18 13:04:45 +08:00

90 lines
2.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "PathTracingDenoiser.h"
#include "RHIDefinitions.h"
#if RHI_RAYTRACING
#include "RenderGraphFwd.h"
#include "ScreenPass.h"
class FRDGBuilder;
class FScene;
class FViewInfo;
class FRDGTexture;
struct FPathTracingSpatialTemporalDenoisingContext
{
FRDGTexture* RadianceTexture = nullptr;
FRDGTexture* AlbedoTexture = nullptr;
FRDGTexture* NormalTexture = nullptr;
FRDGTexture* DepthTexture = nullptr;
FRDGBuffer* VarianceBuffer = nullptr;
FRDGTexture* LastDenoisedRadianceTexture = nullptr;
FRDGTexture* LastRadianceTexture = nullptr;
FRDGTexture* LastAlbedoTexture = nullptr;
FRDGTexture* LastNormalTexture = nullptr;
FRDGTexture* LastDepthTexture = nullptr;
FRDGBuffer* LastVarianceBuffer = nullptr;
// Custom path tracing spacial temporal denoiser result, used by plugins
TRefCountPtr<UE::Renderer::Private::IPathTracingSpatialTemporalDenoiser::IHistory> SpatialTemporalDenoiserHistory;
int FrameIndex;
static constexpr uint32 kNumberOfPixelShifts = 25;
static constexpr uint32 kNumberOfShiftsPerTexture = 4;
static constexpr uint32 kNumberOfPasses = 1;
static constexpr uint32 kNumberOfTexturesPerPass =
(kNumberOfPixelShifts + (kNumberOfShiftsPerTexture * kNumberOfPasses) - 1)
/ (kNumberOfShiftsPerTexture * kNumberOfPasses);
// Debug information
FRDGTexture* MotionVector = nullptr;
FRDGTexture* WarpedSource = nullptr;
// Utility texture
FRDGTexture* VarianceTexture = nullptr;
};
int GetPathTracingDenoiserMode(const FViewInfo& View);
bool IsPathTracingDenoiserEnabled(const FViewInfo& View);
bool ShouldEnablePathTracingDenoiserRealtimeDebug();
ETextureCreateFlags GetExtraTextureCreateFlagsForDenoiser();
// Calculate the variance per-pixel.
void PathTracingSpatialTemporalDenoisingPrePass(
FRDGBuilder& GraphBuilder,
const FViewInfo& View,
int IterationNumber,
int MaxSPP,
FPathTracingSpatialTemporalDenoisingContext& SpatialTemporalDenoisingContext
);
void PathTracingSpatialTemporalDenoising(FRDGBuilder& GraphBuilder,
const FViewInfo& View,
int DenoiserMode,
FRDGTexture*& SpatialTemporalDenoisedTexture,
FPathTracingSpatialTemporalDenoisingContext& SpatialTemporalDenoisingContext);
struct FVisualizePathTracingDenoisingInputs
{
// [Optional] Render to the specified output. If invalid, a new texture is created and returned.
FScreenPassRenderTarget OverrideOutput;
FRDGTextureRef SceneColor;
FRDGTextureRef DenoisedTexture;
FScreenPassTextureViewport Viewport;
FPathTracingSpatialTemporalDenoisingContext DenoisingContext;
TRDGUniformBufferRef<FSceneTextureUniformParameters> SceneTexturesUniformBuffer;
};
FScreenPassTexture AddVisualizePathTracingDenoisingPass(FRDGBuilder& GraphBuilder, const FViewInfo& View, const FVisualizePathTracingDenoisingInputs& Inputs);
#endif