Files
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

380 lines
14 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "RendererPrivate.h"
#include "BlueNoise.h"
#include "MegaLightsDefinitions.h"
#include "StochasticLighting/StochasticLighting.h"
BEGIN_SHADER_PARAMETER_STRUCT(FMegaLightsParameters, )
SHADER_PARAMETER_STRUCT_REF(FViewUniformShaderParameters, ViewUniformBuffer)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FHairStrandsViewUniformParameters, HairStrands)
SHADER_PARAMETER_STRUCT_INCLUDE(ShaderPrint::FShaderParameters, ShaderPrintUniformBuffer)
SHADER_PARAMETER_STRUCT_INCLUDE(FSceneTextureParameters, SceneTextures)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSceneUniformParameters, Scene)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSceneTextureUniformParameters, SceneTexturesStruct)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSubstrateGlobalUniformParameters, Substrate)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FForwardLightUniformParameters, ForwardLightStruct)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(LightFunctionAtlas::FLightFunctionAtlasGlobalParameters, LightFunctionAtlas)
SHADER_PARAMETER_STRUCT_INCLUDE(FSceneLightingChannelParameters, LightingChannelParameters)
SHADER_PARAMETER_STRUCT_REF(FBlueNoise, BlueNoise)
SHADER_PARAMETER_TEXTURE(Texture2D, PreIntegratedGF)
SHADER_PARAMETER_SAMPLER(SamplerState, PreIntegratedGFSampler)
SHADER_PARAMETER(FIntPoint, SampleViewMin)
SHADER_PARAMETER(FIntPoint, SampleViewSize)
SHADER_PARAMETER(FIntPoint, DownsampledViewMin)
SHADER_PARAMETER(FIntPoint, DownsampledViewSize)
SHADER_PARAMETER(FIntPoint, NumSamplesPerPixel)
SHADER_PARAMETER(FIntPoint, NumSamplesPerPixelDivideShift)
SHADER_PARAMETER(FVector2f, DownsampledBufferInvSize)
SHADER_PARAMETER(FIntPoint, DownsampleFactor)
SHADER_PARAMETER(uint32, MegaLightsStateFrameIndex)
SHADER_PARAMETER(uint32, StochasticLightingStateFrameIndex)
SHADER_PARAMETER(float, MinSampleWeight)
SHADER_PARAMETER(float, MaxShadingWeight)
SHADER_PARAMETER(int32, TileDataStride)
SHADER_PARAMETER(int32, DownsampledTileDataStride)
SHADER_PARAMETER(int32, DebugMode)
SHADER_PARAMETER(FIntPoint, DebugCursorPosition)
SHADER_PARAMETER(int32, DebugLightId)
SHADER_PARAMETER(int32, DebugVisualizeLight)
SHADER_PARAMETER(int32, UseIESProfiles)
SHADER_PARAMETER(int32, UseLightFunctionAtlas)
SHADER_PARAMETER(FMatrix44f, UnjitteredClipToTranslatedWorld)
SHADER_PARAMETER(FMatrix44f, UnjitteredTranslatedWorldToClip)
SHADER_PARAMETER(FMatrix44f, UnjitteredPrevTranslatedWorldToClip)
SHADER_PARAMETER_STRUCT_INCLUDE(FHZBParameters, HZBParameters)
SHADER_PARAMETER(FIntPoint, VisibleLightHashViewMinInTiles)
SHADER_PARAMETER(FIntPoint, VisibleLightHashViewSizeInTiles)
SHADER_PARAMETER_RDG_TEXTURE(Texture2D<float>, DownsampledSceneDepth)
SHADER_PARAMETER_RDG_TEXTURE(Texture2D<UNORM float3>, DownsampledSceneWorldNormal)
END_SHADER_PARAMETER_STRUCT()
BEGIN_SHADER_PARAMETER_STRUCT(FMegaLightsVolumeParameters, )
SHADER_PARAMETER(float, VolumeMinSampleWeight)
SHADER_PARAMETER(float, VolumeMaxShadingWeight)
SHADER_PARAMETER(int32, VolumeDownsampleFactorMultShift)
SHADER_PARAMETER(int32, VolumeDebugMode)
SHADER_PARAMETER(int32, VolumeDebugSliceIndex)
SHADER_PARAMETER(FIntVector, NumSamplesPerVoxel)
SHADER_PARAMETER(FIntVector, NumSamplesPerVoxelDivideShift)
SHADER_PARAMETER(FIntVector, DownsampledVolumeViewSize)
SHADER_PARAMETER(FIntVector, VolumeViewSize)
SHADER_PARAMETER(FIntVector, VolumeSampleViewSize)
SHADER_PARAMETER(FVector3f, VolumeInvBufferSize)
SHADER_PARAMETER(FVector3f, MegaLightsVolumeZParams)
SHADER_PARAMETER(uint32, MegaLightsVolumePixelSize)
SHADER_PARAMETER(FVector3f, VolumeFrameJitterOffset)
SHADER_PARAMETER(float, VolumePhaseG)
SHADER_PARAMETER(float, VolumeInverseSquaredLightDistanceBiasScale)
SHADER_PARAMETER(float, LightSoftFading)
SHADER_PARAMETER(uint32, TranslucencyVolumeCascadeIndex)
SHADER_PARAMETER(float, TranslucencyVolumeInvResolution)
SHADER_PARAMETER(uint32, UseHZBOcclusionTest)
SHADER_PARAMETER(uint32, IsUnifiedVolume)
SHADER_PARAMETER(FIntVector, ResampleVolumeViewSize)
SHADER_PARAMETER(FVector3f, ResampleVolumeInvBufferSize)
SHADER_PARAMETER(FVector3f, ResampleVolumeZParams)
END_SHADER_PARAMETER_STRUCT()
enum class EMegaLightsInput : uint8
{
GBuffer,
HairStrands,
Count
};
// Internal functions, don't use outside of the MegaLights
namespace MegaLights
{
void RayTraceLightSamples(
const FSceneViewFamily& ViewFamily,
const FViewInfo& View, int32 ViewIndex,
FRDGBuilder& GraphBuilder,
const FSceneTextures& SceneTextures,
const FVirtualShadowMapArray* VirtualShadowMapArray,
const TArrayView<FRDGTextureRef> NaniteShadingMasks,
const FIntPoint SampleBufferSize,
FRDGTextureRef LightSamples,
FRDGTextureRef LightSampleRays,
FIntVector VolumeSampleBufferSize,
FRDGTextureRef VolumeLightSamples,
FRDGTextureRef VolumeLightSampleRays,
FIntVector TranslucencyVolumeSampleBufferSize,
TArrayView<FRDGTextureRef> TranslucencyVolumeLightSamples,
TArrayView<FRDGTextureRef> TranslucencyVolumeLightSampleRays,
const FMegaLightsParameters& MegaLightsParameters,
const FMegaLightsVolumeParameters& MegaLightsVolumeParameters,
const FMegaLightsVolumeParameters& MegaLightsTranslucencyVolumeParameters,
EMegaLightsInput InputType,
bool bDebug
);
void MarkVSMPages(
const FViewInfo& View, int32 ViewIndex,
FRDGBuilder& GraphBuilder,
const FVirtualShadowMapArray& VirtualShadowMapArray,
const FIntPoint SampleBufferSize,
FRDGTextureRef LightSamples,
FRDGTextureRef LightSampleRays,
const FMegaLightsParameters& MegaLightsParameters,
EMegaLightsInput InputType);
bool UseWaveOps(EShaderPlatform ShaderPlatform);
EPixelFormat GetLightingDataFormat();
bool IsDebugEnabledForShadingPass(int32 ShadingPassIndex, EShaderPlatform InPlatform);
int32 GetDebugMode(EMegaLightsInput Input);
FIntPoint GetNumSamplesPerPixel2d(EMegaLightsInput InputType);
FIntPoint GetNumSamplesPerPixel2d(int32 NumSamplesPerPixel1d);
FIntVector GetNumSamplesPerVoxel3d(int32 NumSamplesPerVoxel1d);
bool SupportsSpatialFilter(EMegaLightsInput InputType);
bool UseSpatialFilter();
bool UseTemporalFilter();
void ModifyCompilationEnvironment(EShaderPlatform Platform, FShaderCompilerEnvironment& OutEnvironment);
// Keep in sync with TILE_TYPE_* in shaders
enum class ETileType : uint8
{
SimpleShading = TILE_MODE_SIMPLE_SHADING,
ComplexShading = TILE_MODE_COMPLEX_SHADING,
SimpleShading_Rect = TILE_MODE_SIMPLE_SHADING_RECT,
ComplexShading_Rect = TILE_MODE_COMPLEX_SHADING_RECT,
SimpleShading_Rect_Textured = TILE_MODE_SIMPLE_SHADING_RECT_TEXTURED,
ComplexShading_Rect_Textured = TILE_MODE_COMPLEX_SHADING_RECT_TEXTURED,
SHADING_MAX_LEGACY = TILE_MODE_EMPTY,
Empty = TILE_MODE_EMPTY,
MAX_LEGACY = TILE_MODE_MAX_LEGACY,
SHADING_MIN_SUBSTRATE = TILE_MODE_SINGLE_SHADING,
SingleShading = TILE_MODE_SINGLE_SHADING,
ComplexSpecialShading = TILE_MODE_COMPLEX_SPECIAL_SHADING,
SingleShading_Rect = TILE_MODE_SINGLE_SHADING_RECT,
ComplexSpecialShading_Rect = TILE_MODE_COMPLEX_SPECIAL_SHADING_RECT,
SingleShading_Rect_Textured = TILE_MODE_SINGLE_SHADING_RECT_TEXTURED,
ComplexSpecialShading_Rect_Textured = TILE_MODE_COMPLEX_SPECIAL_SHADING_RECT_TEXTURED,
SHADING_MAX_SUBSTRATE = TILE_MODE_MAX,
MAX_SUBSTRATE = TILE_MODE_MAX
};
bool IsRectLightTileType(ETileType TileType);
bool IsTexturedLightTileType(ETileType TileType);
bool IsComplexTileType(ETileType TileType);
TArray<int32> GetShadingTileTypes(EMegaLightsInput InputType);
const TCHAR* GetTileTypeString(ETileType TileType);
};
namespace MegaLightsVolume
{
int32 GetDebugMode();
bool UsesLightFunction();
};
namespace MegaLightsTranslucencyVolume
{
int32 GetDebugMode();
bool UsesLightFunction();
};
BEGIN_SHADER_PARAMETER_STRUCT(FMegaLightsVolumeData, )
SHADER_PARAMETER(FIntVector, ViewGridSizeInt)
SHADER_PARAMETER(FVector3f, ViewGridSize)
SHADER_PARAMETER(FIntVector, ResourceGridSizeInt)
SHADER_PARAMETER(FVector3f, ResourceGridSize)
SHADER_PARAMETER(FVector3f, GridZParams)
SHADER_PARAMETER(FVector2f, SVPosToVolumeUV)
SHADER_PARAMETER(FIntPoint, FogGridToPixelXY)
SHADER_PARAMETER(float, MaxDistance)
END_SHADER_PARAMETER_STRUCT()
class FMegaLightsViewContext
{
public:
FMegaLightsViewContext(
FRDGBuilder& InGraphBuilder,
const int32 InViewIndex,
const FViewInfo& InView,
const FSceneViewFamily& InViewFamily,
const FScene* InScene,
const FSceneTextures& InSceneTextures,
bool bInUseVSM);
FRDGTextureRef TileClassificationMark(uint32 ShadingPassIndex);
void Setup(
FRDGTextureRef LightingChannelsTexture,
const FLumenSceneFrameTemporaries& LumenFrameTemporaries,
const bool bInShouldRenderVolumetricFog,
const bool bInShouldRenderTranslucencyVolume,
TUniformBufferRef<FBlueNoise> BlueNoiseUniformBuffer,
EMegaLightsInput InInputType);
void GenerateSamples(
FRDGTextureRef LightingChannelsTexture,
uint32 ShadingPassIndex);
void MarkVSMPages(
const FVirtualShadowMapArray& VirtualShadowMapArray);
void RayTrace(
const FVirtualShadowMapArray& VirtualShadowMapArray,
const TArrayView<FRDGTextureRef> NaniteShadingMasks,
uint32 ShadingPassIndex);
void Resolve(
FRDGTextureRef OutputColorTarget,
FMegaLightsVolume* MegaLightsVolume,
uint32 ShadingPassIndex);
void DenoiseLighting(FRDGTextureRef OutputColorTarget);
bool AreSamplesGenerated()
{
return bSamplesGenerated;
}
uint32 GetReferenceShadingPassCount() const { return ReferenceShadingPassCount; }
private:
FRDGBuilder& GraphBuilder;
const int32 ViewIndex;
const FViewInfo& View;
const FSceneViewFamily& ViewFamily;
const FScene* Scene;
const FSceneTextures& SceneTextures;
const bool bUseVSM;
bool bSamplesGenerated = false;
EMegaLightsInput InputType;
bool bUnifiedVolume;
bool bVolumeEnabled;
bool bGuideByHistory = true;
bool bGuideAreaLightsByHistory = true;
bool bVolumeGuideByHistory;
bool bTranslucencyVolumeGuideByHistory;
bool bDebug;
bool bVolumeDebug;
bool bTranslucencyVolumeDebug;
bool bUseLightFunctionAtlas;
bool bSpatial;
bool bTemporal;
bool bSubPixelShading;
bool bShouldRenderVolumetricFog;
bool bShouldRenderTranslucencyVolume;
int32 DebugTileClassificationMode = 0;
int32 VisualizeLightLoopIterationsMode = 0;
FMegaLightsParameters MegaLightsParameters;
FMegaLightsVolumeParameters MegaLightsVolumeParameters;
FMegaLightsVolumeParameters MegaLightsTranslucencyVolumeParameters;
FMegaLightsVolumeData VolumeParameters;
FVolumetricFogGlobalData VolumetricFogParamaters;
FIntPoint DownsampleFactor;
FIntPoint SampleBufferSize;
FIntPoint DonwnsampledSampleBufferSize;
FIntPoint NumSamplesPerPixel2d;
FIntVector NumSamplesPerVoxel3d;
FIntVector NumSamplesPerTranslucencyVoxel3d;
FIntPoint ViewSizeInTiles;
uint32 VisibleLightHashBufferSize;
FIntPoint VisibleLightHashSizeInTiles;
FIntPoint VisibleLightHashViewMinInTiles;
FIntPoint VisibleLightHashViewSizeInTiles;
uint32 VolumeDownsampleFactor;
FIntVector VolumeBufferSize;
FIntVector VolumeSampleBufferSize;
FIntVector VolumeViewSize;
FRDGTextureRef VolumeLightSamples = nullptr;
FRDGTextureRef VolumeLightSampleRays = nullptr;
uint32 VolumeVisibleLightHashBufferSize;
FIntVector VolumeVisibleLightHashTileSize;
FIntVector VolumeVisibleLightHashSizeInTiles;
FIntVector VolumeVisibleLightHashViewSizeInTiles;
FIntVector VolumeDownsampledViewSize;
uint32 TranslucencyVolumeDownsampleFactor;
FIntVector TranslucencyVolumeBufferSize;
FIntVector TranslucencyVolumeSampleBufferSize;
FIntVector TranslucencyVolumeDownsampledBufferSize;
TArray<FRDGTextureRef, TInlineAllocator<TVC_MAX>> TranslucencyVolumeLightSamples;
TArray<FRDGTextureRef, TInlineAllocator<TVC_MAX>> TranslucencyVolumeLightSampleRays;
uint32 TranslucencyVolumeVisibleLightHashBufferSize;
FIntVector TranslucencyVolumeVisibleLightHashTileSize;
FIntVector TranslucencyVolumeVisibleLightHashSizeInTiles;
FRDGTextureRef SceneDepth = nullptr;
FRDGTextureRef SceneWorldNormal = nullptr;
FRDGTextureRef DownsampledSceneDepth = nullptr;
FRDGTextureRef DownsampledSceneWorldNormal = nullptr;
FRDGBufferRef TileIndirectArgs = nullptr;
FRDGBufferRef TileAllocator = nullptr;
FRDGBufferRef TileData = nullptr;
FRDGBufferRef DownsampledTileIndirectArgs = nullptr;
FRDGBufferRef DownsampledTileAllocator = nullptr;
FRDGBufferRef DownsampledTileData = nullptr;
FRDGTextureRef LightSamples = nullptr;
FRDGTextureRef LightSampleRays = nullptr;
TArray<int32> ShadingTileTypes;
StochasticLighting::FHistoryScreenParameters HistoryScreenParameters;
FIntPoint HistoryVisibleLightHashViewMinInTiles = 0;
FIntPoint HistoryVisibleLightHashViewSizeInTiles = 0;
FRDGTextureRef DiffuseLightingHistory = nullptr;
FRDGTextureRef SpecularLightingHistory = nullptr;
FRDGTextureRef LightingMomentsHistory = nullptr;
FRDGTextureRef SceneDepthHistory = nullptr;
FRDGTextureRef SceneNormalAndShadingHistory = nullptr;
FRDGTextureRef NumFramesAccumulatedHistory = nullptr;
FRDGBufferRef VisibleLightHashHistory = nullptr;
FRDGBufferRef VisibleLightMaskHashHistory = nullptr;
FIntVector HistoryVolumeVisibleLightHashViewSizeInTiles = FIntVector::ZeroValue;
FRDGBufferRef VolumeVisibleLightHashHistory = nullptr;
FIntVector HistoryTranslucencyVolumeVisibleLightHashSizeInTiles = FIntVector::ZeroValue;
FRDGBufferRef TranslucencyVolumeVisibleLightHashHistory[TVC_MAX] = {};
// State for the shading loop; much of this gets lazily created in the loop
// This should perhaps be moved to a separate context structure in the future
uint32 ReferenceShadingPassCount;
bool bReferenceMode;
uint32 FirstPassStateFrameIndex;
EPixelFormat AccumulatedRGBLightingDataFormat;
EPixelFormat AccumulatedRGBALightingDataFormat;
EPixelFormat AccumulatedConfidenceDataFormat;
FRDGTextureRef ResolvedDiffuseLighting = nullptr;
FRDGTextureRef ResolvedSpecularLighting = nullptr;
FRDGTextureRef ShadingConfidence = nullptr;
FRDGTextureRef VolumeResolvedLighting = nullptr;
FRDGBufferRef VisibleLightHash = nullptr;
FRDGBufferRef VisibleLightMaskHash = nullptr;
FRDGBufferRef VolumeVisibleLightHash = nullptr;
FRDGTextureRef TranslucencyVolumeResolvedLightingAmbient[TVC_MAX] = {};
FRDGTextureRef TranslucencyVolumeResolvedLightingDirectional[TVC_MAX] = {};
FRDGBufferRef TranslucencyVolumeVisibleLightHash[TVC_MAX] = {};
};