UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
LumenSceneDirectLightingStochastic.inl
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3static TAutoConsoleVariable<int32> CVarLumenDirectLightingStochastic(
4 TEXT("r.LumenScene.DirectLighting.Stochastic"),
5 0,
6 TEXT("Whether to enable stochastic lighting for Lumen scene (experimental)."),
8
9static TAutoConsoleVariable<int32> CVarLumenDirectLightingStochasticTemporal(
10 TEXT("r.LumenScene.DirectLighting.Stochastic.Temporal"),
11 1,
12 TEXT("Enable temporal filtering."),
14);
15
16static TAutoConsoleVariable<int32> CVarLumenDirectLightingStochasticTemporalMaxFramesAccumulated(
17 TEXT("r.LumenScene.DirectLighting.Stochastic.Temporal.MaxFramesAccumulated"),
18 12,
19 TEXT("Max history length when accumulating frames. Lower values have less ghosting, but more noise."),
21);
22
23static TAutoConsoleVariable<float> CVarLumenDirectLightingStochasticTemporalNeighborhoodClampScale(
24 TEXT("r.LumenScene.DirectLighting.Stochastic.Temporal.NeighborhoodClampScale"),
25 2.0f,
26 TEXT("Scales how permissive is neighborhood clamp. Higher values cause more ghosting, but allow smoother temporal accumulation."),
28);
29
30static TAutoConsoleVariable<int32> CVarLumenDirectLightingStochasticDebug(
31 TEXT("r.LumenScene.DirectLighting.Stochastic.Debug"),
32 0,
33 TEXT("Enable debug print for Lumen stochastic pipeline."),
35);
36
37static TAutoConsoleVariable<int32> CVarLumenDirectLightingStochasticSamplePerTexel(
38 TEXT("r.LumenScene.DirectLighting.Stochastic.SamplePerTexel"),
39 1,
40 TEXT("Number of light sample per texel for Lumen direct lighting with stochastic selection."),
42);
43
44static TAutoConsoleVariable<float> CVarLumenDirectLightingStochasticMinWeight(
45 TEXT("r.LumenScene.DirectLighting.Stochastic.MinWeight"),
46 0.001f,
47 TEXT("Determines minimal sample influence on final texels. Used to skip samples which would have minimal impact to the final image even if light is fully visible."),
49);
50
51static uint32 GetLumenStochasticNumSamplesPerTexel()
52{
53 const int32 NumSamples = FMath::Clamp(CVarLumenDirectLightingStochasticSamplePerTexel.GetValueOnRenderThread(), 1, 4);
54 return NumSamples > 2 ? 4 : NumSamples;
55}
56
58{
59 return CVarLumenDirectLightingStochastic.GetValueOnRenderThread() > 0 && Lumen::UseHardwareRayTracedDirectLighting(ViewFamily);
60}
61
63
65{
68
77
79
80 static int32 GetGroupSize()
81 {
82 return 8;
83 }
84
85 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
86 {
87 return DoesPlatformSupportLumenGI(Parameters.Platform);
88 }
89
90 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
91 {
93 //ShaderPrint::ModifyCompilationEnvironment(Parameters.Platform, OutEnvironment);
94 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
95 OutEnvironment.SetDefine(TEXT("SHADER_STANDALONE_COMPACT_OFFSET"), 1);
96 OutEnvironment.CompilerFlags.Add(CFLAG_WaveOperations);
97 }
98};
99
100IMPLEMENT_GLOBAL_SHADER(FLumenSceneCompactLightOffsetCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "MainCS", SF_Compute);
101
103
138
139IMPLEMENT_GLOBAL_SHADER(FLumenSceneCompactLightListCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "MainCS", SF_Compute);
140
142// Only used for light with non-atlased light function
143
145{
147
150 {
151 Bindings.BindForLegacyShaderParameters(
152 this,
153 Initializer.PermutationId,
154 Initializer.ParameterMap,
155 *FParameters::FTypeInfo::GetStructMetadata(),
156 // Don't require full bindings, we use FMaterialShader::SetParameters
157 false);
158 }
160
161 BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
164 SHADER_PARAMETER(uint32, LightIndex)
165 SHADER_PARAMETER(uint32, ViewIndex)
166 SHADER_PARAMETER_ARRAY(FVector4f, PreViewTranslationHigh, [LUMEN_MAX_VIEWS])
167 SHADER_PARAMETER_ARRAY(FVector4f, PreViewTranslationLow, [LUMEN_MAX_VIEWS])
170 SHADER_PARAMETER_STRUCT_INCLUDE(LumenSceneDirectLighting::FLightDataParameters, LumenLightData)
179
180 class FCloudTransmittance : SHADER_PERMUTATION_BOOL("USE_CLOUD_TRANSMITTANCE");
181 using FPermutationDomain = TShaderPermutationDomain<FCloudTransmittance>;
182
183 static int32 GetGroupSize()
184 {
185 return 8;
186 }
187
188 static bool ShouldCompilePermutation(const FMaterialShaderPermutationParameters& Parameters)
189 {
191 return Parameters.MaterialParameters.MaterialDomain == EMaterialDomain::MD_LightFunction && DoesPlatformSupportLumenGI(Parameters.Platform);
192 }
193
194 static void ModifyCompilationEnvironment(const FMaterialShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
195 {
197 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
198 OutEnvironment.SetDefine(TEXT("SHADER_STANDALONE_EVALUATE"), 1);
199 OutEnvironment.SetDefine(TEXT("LIGHT_FUNCTION"), 1);
200 OutEnvironment.SetDefine(TEXT("USE_IES_PROFILE"), 1); // To avoid extra permutation
201 OutEnvironment.SetDefine(TEXT("USE_RECT_LIGHT"), 1); // To avoid extra permutation
202 OutEnvironment.SetDefine(TEXT("USE_LIGHT_FUNCTION_ATLAS"), 0);
203 OutEnvironment.SetDefine(TEXT("SUBSTRATE_INLINE_SHADING"), 1);
204 OutEnvironment.CompilerFlags.Add(CFLAG_WaveOperations);
205 }
206};
207
208IMPLEMENT_MATERIAL_SHADER_TYPE(, FLumenSceneEvaluateStandaloneLightMaterialCS, TEXT("/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf"), TEXT("MainCS"), SF_Compute);
209
211
212// Only used for direct light with cloud transmittance
214{
217
218 class FCloudTransmittance : SHADER_PERMUTATION_BOOL("USE_CLOUD_TRANSMITTANCE");
219 using FPermutationDomain = TShaderPermutationDomain<FCloudTransmittance>;
220
221 BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
222 RDG_BUFFER_ACCESS(IndirectArgs, ERHIAccess::IndirectArgs)
223 SHADER_PARAMETER_STRUCT_REF(FViewUniformShaderParameters, ViewUniformBuffer)
224 SHADER_PARAMETER(uint32, LightIndex)
225 SHADER_PARAMETER(uint32, ViewIndex)
226 SHADER_PARAMETER_ARRAY(FVector4f, PreViewTranslationHigh, [LUMEN_MAX_VIEWS])
227 SHADER_PARAMETER_ARRAY(FVector4f, PreViewTranslationLow, [LUMEN_MAX_VIEWS])
228 SHADER_PARAMETER(FVector2f, ViewExposure)
229 SHADER_PARAMETER_STRUCT_INCLUDE(FLightCloudTransmittanceParameters, LightCloudTransmittanceParameters)
230 SHADER_PARAMETER_STRUCT_INCLUDE(LumenSceneDirectLighting::FLightDataParameters, LumenLightData)
231 SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer<uint>, CardTilePerLightCounters)
232 SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer<uint>, CardTilePerLightOffsets)
233 SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer<uint>, CardTilePerLightDatas)
234 SHADER_PARAMETER_RDG_TEXTURE(Texture2D<float4>, LumenSceneData)
235 SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2DArray<uint>, RWLightSamples)
236 SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2DArray<float4>, RWSampleDiffuseLighting)
238
239 static int32 GetGroupSize()
240 {
241 return 8;
242 }
243
244 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
245 {
246 return DoesPlatformSupportLumenGI(Parameters.Platform);
247 }
248
249 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
250 {
252 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
253 OutEnvironment.SetDefine(TEXT("SHADER_STANDALONE_EVALUATE"), 1);
254 OutEnvironment.SetDefine(TEXT("LIGHT_FUNCTION"), 0);
255 OutEnvironment.SetDefine(TEXT("USE_IES_PROFILE"), 0); // Directional light does not support IES profile
256 OutEnvironment.SetDefine(TEXT("USE_RECT_LIGHT"), 0); // Directional light
257 OutEnvironment.SetDefine(TEXT("USE_LIGHT_FUNCTION_ATLAS"), 0); // Directional light does not use light function atlas
258 OutEnvironment.SetDefine(TEXT("SUBSTRATE_INLINE_SHADING"), 1);
259 OutEnvironment.CompilerFlags.Add(CFLAG_WaveOperations);
260 }
261};
262
263IMPLEMENT_GLOBAL_SHADER(FLumenSceneEvaluateStandaloneLightCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "MainCS", SF_Compute);
264
266
283 SHADER_PARAMETER(uint32, NumViews)
285 SHADER_PARAMETER_ARRAY(FMatrix44f, FrustumTranslatedWorldToClip, [LUMEN_MAX_VIEWS])
286 SHADER_PARAMETER_ARRAY(FVector4f, PreViewTranslationHigh, [LUMEN_MAX_VIEWS])
287 SHADER_PARAMETER_ARRAY(FVector4f, PreViewTranslationLow, [LUMEN_MAX_VIEWS])
290
292
294{
297
298 BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
301 SHADER_PARAMETER_STRUCT_INCLUDE(LumenSceneDirectLighting::FLightDataParameters, LumenLightData)
314
315 class FIESProfile : SHADER_PERMUTATION_BOOL("USE_IES_PROFILE");
316 class FRectLight : SHADER_PERMUTATION_BOOL("USE_RECT_LIGHT");
317 class FLightFunctionAtlas : SHADER_PERMUTATION_BOOL("USE_LIGHT_FUNCTION_ATLAS");
318 class FNumSamplesPerPixel1d : SHADER_PERMUTATION_SPARSE_INT("NUM_SAMPLES_PER_PIXEL_1D", 1, 2, 4);
319 using FPermutationDomain = TShaderPermutationDomain<FIESProfile, FRectLight, FLightFunctionAtlas, FNumSamplesPerPixel1d>;
320
321 static int32 GetGroupSize()
322 {
323 return 8;
324 }
325
326 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
327 {
328 return DoesPlatformSupportLumenGI(Parameters.Platform);
329 }
330
331 static EShaderPermutationPrecacheRequest ShouldPrecachePermutation(const FGlobalShaderPermutationParameters& Parameters)
332 {
335 }
336
337 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
338 {
340 //ShaderPrint::ModifyCompilationEnvironment(Parameters.Platform, OutEnvironment);
341 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
342 OutEnvironment.SetDefine(TEXT("SHADER_GENERATE_SAMPLE"), 1);
343 OutEnvironment.CompilerFlags.Add(CFLAG_WaveOperations);
344 }
345};
346
347IMPLEMENT_GLOBAL_SHADER(FLumenSceneGenerateLightSamplesCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "GenerateLightSamplesCS", SF_Compute);
348
350
352{
355
356 BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
370 SHADER_PARAMETER_RDG_TEXTURE(Texture2D, IndirectLightingAtlas)
371 SHADER_PARAMETER_SAMPLER(SamplerState, BilinearClampedSampler)
376 SHADER_PARAMETER_STRUCT_INCLUDE(ShaderPrint::FShaderParameters, ShaderPrintUniformBuffer)
378
379 class FUseLightSamples : SHADER_PERMUTATION_BOOL("USE_LIGHT_SAMPLES");
380 using FPermutationDomain = TShaderPermutationDomain<FUseLightSamples>;
381
382 static int32 GetGroupSize()
383 {
384 return 8;
385 }
386 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
387 {
388 return DoesPlatformSupportLumenGI(Parameters.Platform);
389 }
390 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
391 {
393 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
394 OutEnvironment.SetDefine(TEXT("SHADER_SHADING"), 1);
395 }
396
397};
398
399IMPLEMENT_GLOBAL_SHADER(FLumenSceneShadeLightSamplesCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "ShadeLightSamplesCS", SF_Compute);
400
402
404{
407
408 BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
414 SHADER_PARAMETER_STRUCT_INCLUDE(ShaderPrint::FShaderParameters, ShaderPrintUniformBuffer)
416
417 static int32 GetGroupSize()
418 {
419 return 16; // TODO, could we reduce that to 8, so that we can load tile directly? and dispatch indirect?
420 }
421
422 class FWaveOps : SHADER_PERMUTATION_BOOL("WAVE_OPS");
424
425 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
426 {
427 return DoesPlatformSupportLumenGI(Parameters.Platform);
428 }
429
430 FORCENOINLINE static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
431 {
433 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
434 OutEnvironment.SetDefine(TEXT("SHADER_COMPACTION"), 1);
435
437 if (PermutationVector.Get<FWaveOps>())
438 {
439 OutEnvironment.CompilerFlags.Add(CFLAG_WaveOperations);
440 }
441 }
442};
443
444IMPLEMENT_GLOBAL_SHADER(FLumenSceneCompactLightSampleTracesCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "CompactLightSampleTracesCS", SF_Compute);
445
447
449{
452
453 BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
466
471 SHADER_PARAMETER_RDG_TEXTURE(Texture2D, IndirectLightingAtlas)
472 SHADER_PARAMETER_SAMPLER(SamplerState, BilinearClampedSampler)
477
478 class FValidHistory : SHADER_PERMUTATION_BOOL("VALID_HISTORY");
479 using FPermutationDomain = TShaderPermutationDomain<FValidHistory>;
480
481 static int32 GetGroupSize()
482 {
483 return 8;
484 }
485
486 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
487 {
488 return DoesPlatformSupportLumenGI(Parameters.Platform);
489 }
490
491 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
492 {
494 OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), GetGroupSize());
495 OutEnvironment.SetDefine(TEXT("SHADER_TEMPORAL_DENOISER"), 1);
496 OutEnvironment.CompilerFlags.Add(CFLAG_AllowTypedUAVLoads);
497 OutEnvironment.CompilerFlags.Add(CFLAG_Wave32);
498 }
499};
500
501IMPLEMENT_GLOBAL_SHADER(FLumenSceneDenoiserTemporalCS, "/Engine/Private/Lumen/LumenSceneDirectLightingStochastic.usf", "DenoiserTemporalCS", SF_Compute);
502
504
505static void CompactLumenSceneLightsTraces(
506 const FViewInfo& View,
507 FRDGBuilder& GraphBuilder,
508 FRDGTextureRef LightSamples,
511{
512 // Compact light sample traces before tracing
513 FLumenSceneCompactLightSampleTracesCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneCompactLightSampleTracesCS::FParameters>();
514 PassParameters->RWCompactedTraceTexelData = GraphBuilder.CreateUAV(CompactedTraceTexelData);
515 PassParameters->RWCompactedTraceTexelAllocator = GraphBuilder.CreateUAV(CompactedTraceTexelAllocator);
516 PassParameters->LightSamples = LightSamples;
517 PassParameters->NumSamplesPerPixel1d = LightSamples->Desc.ArraySize;
518 PassParameters->SampleViewSize = LightSamples->Desc.Extent;
519 ShaderPrint::SetParameters(GraphBuilder, View.ShaderPrintData, PassParameters->ShaderPrintUniformBuffer);
520
521 const bool bWaveOps = Lumen::UseWaveOps(View.GetShaderPlatform()) &&
522 GRHIMinimumWaveSize <= 32 &&
524
526 PermutationVector.Set<FLumenSceneCompactLightSampleTracesCS::FWaveOps>(bWaveOps);
528
529 FIntVector GroupCount = FComputeShaderUtils::GetGroupCount(LightSamples->Desc.Extent, FLumenSceneCompactLightSampleTracesCS::GetGroupSize());
530 GroupCount.Z = PassParameters->NumSamplesPerPixel1d;
531
533 GraphBuilder,
534 RDG_EVENT_NAME("CompactLightSampleTraces%s", bWaveOps ? TEXT("(WaveOps)") : TEXT("")),
537 GroupCount);
538}
539
541
542static void ComputeStochasticLighting(
543 FRDGBuilder& GraphBuilder,
544 FScene* Scene,
545 const FViewInfo& View,
549 ERDGPassFlags ComputePassFlags,
550 const LumenSceneDirectLighting::FLightDataParameters& LumenLightData)
551{
552 FLumenSceneData& LumenSceneData = *Scene->GetLumenSceneData(View);// TODO Views[x]?
553
554 const int32 NumViewOrigins = FrameTemporaries.ViewOrigins.Num();
555 const bool bDebug = CVarLumenDirectLightingStochasticDebug.GetValueOnRenderThread() > 0;
556 const uint32 NumSamplesPerPixel1d = GetLumenStochasticNumSamplesPerTexel();
557 const FGlobalShaderMap* GlobalShaderMap = View.ShaderMap;
558 const bool bTemporal = CVarLumenDirectLightingStochasticTemporal.GetValueOnRenderThread() > 0;
560
563
564 // Common parameters
566 {
567 CommonParameters.ViewUniformBuffer = View.ViewUniformBuffer;
568 CommonParameters.BlueNoise = BlueNoiseUniformBuffer;
569 CommonParameters.NumSamplesPerPixel1d = NumSamplesPerPixel1d;
570 CommonParameters.StateFrameIndex = View.ViewState ? View.ViewState->GetFrameIndex() : 0;
571 CommonParameters.MaxCompositeTiles = CardUpdateContext.MaxUpdateTiles;
572 CommonParameters.SamplingMinWeight = FMath::Max(CVarLumenDirectLightingStochasticMinWeight.GetValueOnRenderThread(), 0.0f);
573 CommonParameters.TemporalMaxFramesAccumulated = FMath::Max(CVarLumenDirectLightingStochasticTemporalMaxFramesAccumulated.GetValueOnRenderThread(), 0.0f);
574 CommonParameters.TemporalNeighborhoodClampScale = CVarLumenDirectLightingStochasticTemporalNeighborhoodClampScale.GetValueOnRenderThread();
575 CommonParameters.TemporalAdvanceFrame = View.ViewState && !View.bStatePrevViewInfoIsReadOnly ? 1 : 0;
576 CommonParameters.DebugLightId = INDEX_NONE;
577 CommonParameters.DummyZeroForFixingShaderCompilerBug = 0;
578 CommonParameters.NumLights = LightingTaskData->GatheredLights.Num();
579 CommonParameters.NumStandaloneLights = LightingTaskData->StandaloneLightIndices.Num();
580 CommonParameters.NumViews = NumViewOrigins;
581 CommonParameters.DiffuseColorBoost = 1.0f / FMath::Max(View.FinalPostProcessSettings.LumenDiffuseColorBoost, 1.0f);
582 if (bUseLightFunctionAtlas)
583 {
584 CommonParameters.LightFunctionAtlas = LightFunctionAtlas::BindGlobalParameters(GraphBuilder, View);
585 }
586
587 check(NumViewOrigins <= CommonParameters.FrustumTranslatedWorldToClip.Num());
589 {
590 const FLumenViewOrigin& ViewOrigin = FrameTemporaries.ViewOrigins[OriginIndex];
591
593 CommonParameters.PreViewTranslationHigh[OriginIndex] = ViewOrigin.PreViewTranslationDF.High;
594 CommonParameters.PreViewTranslationLow[OriginIndex] = ViewOrigin.PreViewTranslationDF.Low;
595 CommonParameters.ViewExposure[OriginIndex] = ViewOrigin.LastEyeAdaptationExposure;
596 }
597
598 if (true || bDebug)
599 {
602 ShaderPrint::SetParameters(GraphBuilder, View.ShaderPrintData, CommonParameters.ShaderPrintUniformBuffer);
603 }
604 }
605
606 const uint32 MaxLightTiles = CardUpdateContext.MaxUpdateTiles;
607 const uint32 NumLights = LightingTaskData->GatheredLights.Num();
608 const uint32 NumStandaloneLights = LightingTaskData->StandaloneLightIndices.Num();
609 const uint32 NumLightsRoundedUp = FMath::RoundUpToPowerOfTwo(FMath::Max(LightingTaskData->GatheredLights.Num(), 1)) * NumViewOrigins;
610 const uint32 MaxLightsPerTile = FMath::RoundUpToPowerOfTwo(FMath::Clamp(CVarLumenDirectLightingMaxLightsPerTile.GetValueOnRenderThread(), 1, 32));
611 const uint32 MaxCulledCardTiles = MaxLightsPerTile * MaxLightTiles;
612 const bool bHasStandaloneLight = LightingTaskData->StandaloneLightIndices.Num() > 0;
613
614
615 // 0. Splice card pages into tiles
617 {
618 RDG_EVENT_SCOPE(GraphBuilder, "SpliceCardPageIntoToTiles");
619
620 Lumen::SpliceCardPagesIntoTiles(GraphBuilder, GlobalShaderMap, CardUpdateContext, FrameTemporaries.LumenCardSceneUniformBuffer, CardTileUpdateContext, ComputePassFlags);
621 }
622
623 // 0. Early out if no lights
624 if (NumLights == 0)
625 {
626 RDG_EVENT_SCOPE(GraphBuilder, "Shading");
627
628 FLumenSceneShadeLightSamplesCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneShadeLightSamplesCS::FParameters>();
629 PassParameters->DummyZeroForFixingShaderCompilerBug = 0;
630 PassParameters->IndirectArgsBuffer = CardTileUpdateContext.DispatchCardTilesIndirectArgs;
632 PassParameters->LumenCardScene = FrameTemporaries.LumenCardSceneUniformBuffer;
633 PassParameters->DiffuseColorBoost = 1.0f / FMath::Max(View.FinalPostProcessSettings.LumenDiffuseColorBoost, 1.0f);
634 PassParameters->NumSamplesPerPixel1d = CommonParameters.NumSamplesPerPixel1d;
635 PassParameters->AlbedoAtlas = FrameTemporaries.AlbedoAtlas;
636 PassParameters->OpacityAtlas = FrameTemporaries.OpacityAtlas;
637 PassParameters->EmissiveAtlas = FrameTemporaries.EmissiveAtlas;
638 PassParameters->IndirectLightingAtlas = FrameTemporaries.IndirectLightingAtlas;
640 PassParameters->RWFinalLightingAtlas = GraphBuilder.CreateUAV(FrameTemporaries.FinalLightingAtlas);
641 PassParameters->RWDirectLightingAtlas = GraphBuilder.CreateUAV(FrameTemporaries.DirectLightingAtlas);
643 PassParameters->IndirectLightingAtlasHalfTexelSize = FVector2f(0.5f / IndirectLightingAtlasSize.X, 0.5f / IndirectLightingAtlasSize.Y);
644 PassParameters->TileAllocator = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTileAllocator);
645 PassParameters->TileData = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTiles);
646 ShaderPrint::SetParameters(GraphBuilder, View.ShaderPrintData, PassParameters->ShaderPrintUniformBuffer);
647
649 PermutationVector.Set<FLumenSceneShadeLightSamplesCS::FUseLightSamples>(false);
651
653 GraphBuilder,
654 RDG_EVENT_NAME("CombineLighting CS"),
655 ComputePassFlags,
658 CardTileUpdateContext.DispatchCardTilesIndirectArgs,
660 return;
661 }
662
663 {
664 // Transient atlas for storing position and normal to avoid loading surface cache data
666 const FIntPoint AtlasResolution = AtlasTileCount * Lumen::CardTileSize;
668
669 // Transient texture for shading
670 FRDGTextureRef LightSamples = GraphBuilder.CreateTexture(
671 FRDGTextureDesc::Create2DArray(AtlasResolution, PF_R32_UINT, FClearValueBinding::Black, TexCreate_ShaderResource | TexCreate_UAV, CommonParameters.NumSamplesPerPixel1d),
672 TEXT("LumenScene.DirectLighting.LightSamples"));
673
676 TEXT("LumenScene.DirectLighting.SampleLuminanceSum"));
677
680 TEXT("LumenScene.DirectLighting.SceneAlbedo"));
681
682 // Each texel can select a light, so there is at max 64 unique lights per 8x8 card (i.e., == AltasResolution)
685 TEXT("LumenScene.DirectLighting.UniqueLightIndices"));
686
690 TEXT("LumenScene.DirectLighting.UniqueLightCount"));
691
693 FRDGTextureDesc::Create2DArray(AtlasResolution, PF_FloatRGBA, FClearValueBinding::Black, TexCreate_ShaderResource | TexCreate_UAV, CommonParameters.NumSamplesPerPixel1d),
694 TEXT("LumenScene.DirectLighting.SampleDiffuseLighting"));
695
696 // When using temporal filtering, allocate an intermediate storage for direct lighting for spatially filtering neighborhood
698 if (bTemporal)
699 {
700 ResolvedDirectLightingAtlas = GraphBuilder.CreateTexture(FrameTemporaries.DirectLightingAtlas->Desc, TEXT("LumenScene.DirectLighting.TemporaryDirectLightingAtlas"));
701 }
702
703 // Store position, normal, and view index at the sample position to avoid the loading of the cards data during the tracing.
704 FRDGTextureRef SceneData = GraphBuilder.CreateTexture(
706 TEXT("LumenScene.DirectLighting.SceneData"));
707
708 FRDGBufferRef CompactedLightSampleData = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredDesc(sizeof(uint32), AtlasResolution.X * AtlasResolution.Y), TEXT("LumenScene.DirectLighting.CompactedLightSampleData"));
709 FRDGBufferRef CompactedLightSampleAllocator = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredDesc(sizeof(uint32), 1), TEXT("LumenScene.DirectLighting.CompactedLightSampleAllocator"));
710
712
713 FRDGBufferRef CardTilePerLightCounters = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredDesc(4u, NumLights), TEXT("LumenScene.DirectLighting.CardTilePerLightCounters"));
714 FRDGBufferRef CardTilePerLightOffsets = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredDesc(4u, NumLights), TEXT("LumenScene.DirectLighting.CardTilePerLightOffsets"));
715 FRDGBufferRef CardTilePerLightDatas = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredDesc(4u, MaxCulledCardTiles), TEXT("LumenScene.DirectLighting.CardTilePerLightDatas"));
716
717 {
718 AddClearUAVPass(GraphBuilder, GraphBuilder.CreateUAV(CompactedLightSampleAllocator), 0);
720 {
721 AddClearUAVPass(GraphBuilder, GraphBuilder.CreateUAV(CardTilePerLightCounters), 0u);
722 }
723 AddClearUAVPass(GraphBuilder,GraphBuilder.CreateUAV(SampleLuminanceSum), 0.f);
724 AddClearUAVPass(GraphBuilder,GraphBuilder.CreateUAV(LightSamples), 0u); // Needed as trace/sample compaction is dispatch on the entire resource, and we need which samples are valid or not
725
726 // Only for debug
727 AddClearUAVPass(GraphBuilder,GraphBuilder.CreateUAV(UniqueLightIndices), 0u); // Remove - Not needed just for debugging
728 AddClearUAVPass(GraphBuilder,GraphBuilder.CreateUAV(UniqueLightCount), 0u); // Remove - Not needed just for debugging
729 }
730
731 // 1.1 Sample light
732 {
733 RDG_EVENT_SCOPE(GraphBuilder, "Generate Sample");
734
735 FLumenSceneGenerateLightSamplesCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneGenerateLightSamplesCS::FParameters>();
736 PassParameters->CommonParameters = CommonParameters;
737
738 PassParameters->RWSampleLuminanceSum = SampleLuminanceSumUAV;
739 PassParameters->RWLightSamples = GraphBuilder.CreateUAV(LightSamples);
740 PassParameters->LumenLightData = LumenLightData;
741 PassParameters->LumenCardScene = FrameTemporaries.LumenCardSceneUniformBuffer;
742 PassParameters->TileAllocator = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTileAllocator);
743 PassParameters->TileData = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTiles);
744 PassParameters->IndirectArgs = CardTileUpdateContext.DispatchCardTilesIndirectArgs;
745 PassParameters->RWUniqueLightIndices = GraphBuilder.CreateUAV(UniqueLightIndices);
746 PassParameters->RWUniqueLightCount = GraphBuilder.CreateUAV(UniqueLightCount);
747 PassParameters->RWSampleDiffuseLighting = GraphBuilder.CreateUAV(SampleDiffuseLighting);
748 PassParameters->RWSceneData = GraphBuilder.CreateUAV(SceneData);
749 PassParameters->LumenSceneDebugData = FrameTemporaries.DebugData;
750 PassParameters->RWCardTilePerLightCounters = GraphBuilder.CreateUAV(CardTilePerLightCounters);
751
753 PermutationVector.Set<FLumenSceneGenerateLightSamplesCS::FIESProfile>(LightingTaskData->bHasIESLights);
754 PermutationVector.Set<FLumenSceneGenerateLightSamplesCS::FRectLight>(LightingTaskData->bHasRectLights);
755 PermutationVector.Set<FLumenSceneGenerateLightSamplesCS::FLightFunctionAtlas>(bUseLightFunctionAtlas);
756 PermutationVector.Set<FLumenSceneGenerateLightSamplesCS::FNumSamplesPerPixel1d>(CommonParameters.NumSamplesPerPixel1d);
758
760 GraphBuilder,
761 RDG_EVENT_NAME("GenerateSamples(SamplesPerTexel:%d)", CommonParameters.NumSamplesPerPixel1d),
764 CardTileUpdateContext.DispatchCardTilesIndirectArgs,
765 1u * sizeof(FRHIDispatchIndirectParameters)); // Dispatch 1 group per card tile
766 }
767
768 // 1.2 Evaluate lighting for standalone lights
770 {
771 // Indirect args buffer of tiles for each standalong line + all tiles covered by standalone lights
772 FRDGBufferRef CardTilePerLightArgs = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateIndirectDesc<FRHIDispatchIndirectParameters>(NumLights + 1u),TEXT("LumenScene.DirectLighting.IndirectTileListArgsBuffer"));
773
774 // Compute offset and Build indirect arts
775 {
776 RDG_EVENT_SCOPE(GraphBuilder, "Compact Offset & Args");
777
778 FLumenSceneCompactLightOffsetCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneCompactLightOffsetCS::FParameters>();
779 PassParameters->NumLights = NumLights;
780 PassParameters->NumStandaloneLights = NumStandaloneLights;
781 PassParameters->NumSamplesPerPixel1d = NumSamplesPerPixel1d;
782 PassParameters->CardTilePerLightCounters = GraphBuilder.CreateSRV(CardTilePerLightCounters);
783 PassParameters->RWCardTilePerLightOffsets = GraphBuilder.CreateUAV(CardTilePerLightOffsets);
784 PassParameters->RWCardTilePerLightArgs = GraphBuilder.CreateUAV(CardTilePerLightArgs);
787
789 GraphBuilder,
790 RDG_EVENT_NAME("StandaloneLight::CompactOffset"),
793 FIntVector(1,1,1));
794 }
795
796 // Compute list of tiles
797 {
798 RDG_EVENT_SCOPE(GraphBuilder, "Compact List");
799
800 FRDGBufferRef CardTilePerLightCountersForInsertion = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredDesc(4u, NumLights), TEXT("LumenScene.DirectLighting.CardTilePerLightCountersForInsertion"));
803
804 FLumenSceneCompactLightListCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneCompactLightListCS::FParameters>();
805 PassParameters->IndirectArgs = CardTilePerLightArgs;
806 PassParameters->CardTilePerLightOffsets = GraphBuilder.CreateSRV(CardTilePerLightOffsets);
807 PassParameters->UniqueLightIndices = UniqueLightIndices;
808 PassParameters->UniqueLightCount = UniqueLightCount;
809 PassParameters->RWCardTilePerLightCounters = RWCardTilePerLightCountersForInsertion;
810 PassParameters->RWCardTilePerLightDatas = GraphBuilder.CreateUAV(CardTilePerLightDatas);
811
814
816 GraphBuilder,
817 RDG_EVENT_NAME("StandaloneLight::CompactList"),
822 }
823
824 // Evaluate light
827 for (const int32 StandaloneLightIndex : LightingTaskData->StandaloneLightIndices)
828 {
831 //check(Light.NeedsShadowMask());
832
833 // Two possible cases:
834 // * Directional/Local Light with material light functions
835 // * Directional light with cloud transmittance
836 if (const FMaterialRenderProxy* LightFunctionMaterialProxy = Light.LightFunctionMaterialProxy)
837 {
838 FLumenSceneEvaluateStandaloneLightMaterialCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneEvaluateStandaloneLightMaterialCS::FParameters>();
839 PassParameters->IndirectArgs = CardTilePerLightArgs;
841 PassParameters->ViewIndex = 0; // TODO ViewIndex;
842 PassParameters->CardTilePerLightCounters = GraphBuilder.CreateSRV(CardTilePerLightCounters);
843 PassParameters->CardTilePerLightOffsets = GraphBuilder.CreateSRV(CardTilePerLightOffsets);
844 PassParameters->CardTilePerLightDatas = GraphBuilder.CreateSRV(CardTilePerLightDatas);
845 PassParameters->LumenSceneData = SceneData;
847 PassParameters->RWSampleDiffuseLighting = SampleDiffuseLightingUAVSkipBarrier;
848 PassParameters->LumenLightData = LumenLightData;
849 PassParameters->ViewUniformBuffer = View.ViewUniformBuffer;
851 GraphBuilder,
852 Scene,
853 View,
854 bMayUseCloudTransmittance ? Light.LightSceneInfo : nullptr,
856 SetupLightFunctionParameters(View, Light.LightSceneInfo, 1.0f, PassParameters->LightFunctionParameters);
857
859 {
860 const FLumenViewOrigin& ViewOrigin = FrameTemporaries.ViewOrigins[OriginIndex];
861
862 PassParameters->PreViewTranslationHigh[OriginIndex] = ViewOrigin.PreViewTranslationDF.High;
863 PassParameters->PreViewTranslationLow[OriginIndex] = ViewOrigin.PreViewTranslationDF.Low;
864 PassParameters->ViewExposure[OriginIndex] = ViewOrigin.LastEyeAdaptationExposure;
865 }
866
868 //PermutationVector.Set<FLumenSceneEvaluateStandaloneLightMaterialCS::FThreadGroupSize32>(Lumen::UseThreadGroupSize32());
869 PermutationVector.Set<FLumenSceneEvaluateStandaloneLightMaterialCS::FCloudTransmittance>(bUseCloudTransmittance);
870
871 const FMaterial& Material = LightFunctionMaterialProxy->GetMaterialWithFallback(Scene->GetFeatureLevel(), LightFunctionMaterialProxy);
872 const FMaterialShaderMap* MaterialShaderMap = Material.GetRenderingThreadShaderMap();
874
877
878 GraphBuilder.AddPass(
879 RDG_EVENT_NAME("StandaloneLight::Evaluate(LF,%s)", *Light.Name),
881 ComputePassFlags,
883 {
884 CardTilePerLightArgs->MarkResourceAsUsed();
885 FComputeShaderUtils::ValidateIndirectArgsBuffer(CardTilePerLightArgs, DispatchIndirectArgOffset);
886 FRHIComputeShader* ShaderRHI = ComputeShader.GetComputeShader();
887 SetComputePipelineState(RHICmdList, ShaderRHI);
888 SetShaderParameters(RHICmdList, ComputeShader, ShaderRHI, *PassParameters);
889 ComputeShader->SetParameters(RHICmdList, ShaderRHI, LightFunctionMaterialProxy, Material, View);
890 RHICmdList.DispatchIndirectComputeShader(CardTilePerLightArgs->GetIndirectRHICallBuffer(), DispatchIndirectArgOffset);
891 UnsetShaderUAVs(RHICmdList, ComputeShader, ShaderRHI);
892 });
893 }
894 else
895 {
896 FLumenSceneEvaluateStandaloneLightCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneEvaluateStandaloneLightCS::FParameters>();
897 PassParameters->IndirectArgs = CardTilePerLightArgs;
899 PassParameters->ViewIndex = 0; // TODO ViewIndex;
900 PassParameters->CardTilePerLightCounters = GraphBuilder.CreateSRV(CardTilePerLightCounters);
901 PassParameters->CardTilePerLightOffsets = GraphBuilder.CreateSRV(CardTilePerLightOffsets);
902 PassParameters->CardTilePerLightDatas = GraphBuilder.CreateSRV(CardTilePerLightDatas);
903 PassParameters->LumenSceneData = SceneData;
905 PassParameters->RWSampleDiffuseLighting = SampleDiffuseLightingUAVSkipBarrier;
906 PassParameters->LumenLightData = LumenLightData;
907 PassParameters->ViewUniformBuffer = View.ViewUniformBuffer;
908
910 GraphBuilder,
911 Scene,
912 View,
913 bMayUseCloudTransmittance ? Light.LightSceneInfo : nullptr,
915
917 {
918 const FLumenViewOrigin& ViewOrigin = FrameTemporaries.ViewOrigins[OriginIndex];
919
920 PassParameters->PreViewTranslationHigh[OriginIndex] = ViewOrigin.PreViewTranslationDF.High;
921 PassParameters->PreViewTranslationLow[OriginIndex] = ViewOrigin.PreViewTranslationDF.Low;
922 PassParameters->ViewExposure[OriginIndex] = ViewOrigin.LastEyeAdaptationExposure;
923 }
924
926 PermutationVector.Set<FLumenSceneEvaluateStandaloneLightCS::FCloudTransmittance>(bUseCloudTransmittance);
928
930 GraphBuilder,
931 RDG_EVENT_NAME("StandaloneLight::Evaluate(%s)", *Light.Name),
936 }
937 }
938 }
939
940 // 2. Trace compaction
941 {
942 RDG_EVENT_SCOPE(GraphBuilder, "Compact Traces");
943
944 CompactLumenSceneLightsTraces(
945 View,
946 GraphBuilder,
947 LightSamples,
948 CompactedLightSampleData,
949 CompactedLightSampleAllocator);
950 }
951
952 // 3. HW Trace
953 {
954 RDG_EVENT_SCOPE(GraphBuilder, "HWRT Trace");
955
957 {
958 const FViewInfo& LocalView = *FrameTemporaries.ViewOrigins[OriginIndex].ReferenceView;
959
961 StochasticData.CompactedLightSampleData = CompactedLightSampleData;
962 StochasticData.CompactedLightSampleAllocator = CompactedLightSampleAllocator;
963 StochasticData.LightSamples = LightSamples;
964 StochasticData.SceneDataTexture = SceneData;
965
967 GraphBuilder,
968 Scene,
969 LocalView,
974 nullptr,
975 nullptr,
976 nullptr,
977 nullptr,
978 nullptr,
979 nullptr,
980 ComputePassFlags);
981 }
982 }
983
984 // 4. Shading
985 FRDGTextureRef ResolvedDiffuseLighting = nullptr;
986 {
987 RDG_EVENT_SCOPE(GraphBuilder, "Shading");
988
989 FLumenSceneShadeLightSamplesCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneShadeLightSamplesCS::FParameters>();
990 PassParameters->DummyZeroForFixingShaderCompilerBug = 0;
991 PassParameters->IndirectArgsBuffer = CardTileUpdateContext.DispatchCardTilesIndirectArgs;
993 PassParameters->LumenCardScene = FrameTemporaries.LumenCardSceneUniformBuffer;
994 PassParameters->DiffuseColorBoost = 1.0f / FMath::Max(View.FinalPostProcessSettings.LumenDiffuseColorBoost, 1.0f);
995 PassParameters->NumSamplesPerPixel1d = CommonParameters.NumSamplesPerPixel1d;
996 PassParameters->AlbedoAtlas = FrameTemporaries.AlbedoAtlas;
997 PassParameters->OpacityAtlas = FrameTemporaries.OpacityAtlas;
998 PassParameters->EmissiveAtlas = FrameTemporaries.EmissiveAtlas;
999 PassParameters->IndirectLightingAtlas = FrameTemporaries.IndirectLightingAtlas;
1001 PassParameters->RWFinalLightingAtlas = GraphBuilder.CreateUAV(FrameTemporaries.FinalLightingAtlas);
1002 PassParameters->RWDirectLightingAtlas = GraphBuilder.CreateUAV(ResolvedDirectLightingAtlas);
1004 PassParameters->IndirectLightingAtlasHalfTexelSize = FVector2f(0.5f / IndirectLightingAtlasSize.X, 0.5f / IndirectLightingAtlasSize.Y);
1005 PassParameters->TileAllocator = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTileAllocator);
1006 PassParameters->TileData = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTiles);
1007 PassParameters->LightSamples = LightSamples;
1008 PassParameters->SampleDiffuseLighting = SampleDiffuseLighting;
1009 PassParameters->LumenSceneDebugData = FrameTemporaries.DebugData;
1010 ShaderPrint::SetParameters(GraphBuilder, View.ShaderPrintData, PassParameters->ShaderPrintUniformBuffer);
1011
1013 PermutationVector.Set<FLumenSceneShadeLightSamplesCS::FUseLightSamples>(true);
1015
1017 GraphBuilder,
1018 RDG_EVENT_NAME("CombineLighting CS"),
1019 ComputePassFlags,
1022 CardTileUpdateContext.DispatchCardTilesIndirectArgs,
1024 }
1025
1026 // 5. Temporal accumulation
1027 if (bTemporal)
1028 {
1029 RDG_EVENT_SCOPE(GraphBuilder, "Temporal Filtering");
1030
1031 const FIntPoint Resolution = FrameTemporaries.DirectLightingAtlas->Desc.Extent;
1034 TEXT("Lumen.SceneLighting.DiffuseLightingAndSecondMoment"));
1035
1036 FRDGTextureRef NumFramesAccumulated = GraphBuilder.CreateTexture(
1038 TEXT("Lumen.SceneLighting.NumFramesAccumulated"));
1039
1040 FLumenSceneDenoiserTemporalCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FLumenSceneDenoiserTemporalCS::FParameters>();
1041 PassParameters->IndirectArgsBuffer = CardTileUpdateContext.DispatchCardTilesIndirectArgs;
1042 PassParameters->CommonParameters = CommonParameters;
1043 PassParameters->LumenCardScene = FrameTemporaries.LumenCardSceneUniformBuffer;
1044 PassParameters->SampleLuminanceSumTexture = SampleLuminanceSum;
1045 PassParameters->ResolvedDirectLightingAtlas = ResolvedDirectLightingAtlas;
1046 PassParameters->DiffuseLightingAndSecondMomentHistoryTexture = FrameTemporaries.DiffuseLightingAndSecondMomentHistoryAtlas; // DiffuseLightingAndSecondMomentHistory;
1047 PassParameters->NumFramesAccumulatedHistoryTexture = FrameTemporaries.NumFramesAccumulatedHistoryAtlas;// NumFramesAccumulatedHistory;
1048 PassParameters->PrevSceneColorPreExposureCorrection = View.PreExposure / View.PrevViewInfo.SceneColorPreExposure;
1049 PassParameters->RWDiffuseLightingAndSecondMoment = GraphBuilder.CreateUAV(DiffuseLightingAndSecondMoment);
1050 PassParameters->RWNumFramesAccumulated = GraphBuilder.CreateUAV(NumFramesAccumulated);
1051 PassParameters->TileAllocator = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTileAllocator);
1052 PassParameters->TileData = GraphBuilder.CreateSRV(CardTileUpdateContext.CardTiles);
1053
1055 PassParameters->IndirectLightingAtlasHalfTexelSize = FVector2f(0.5f / IndirectLightingAtlasSize.X, 0.5f / IndirectLightingAtlasSize.Y);
1056 PassParameters->AlbedoAtlas = FrameTemporaries.AlbedoAtlas;
1057 PassParameters->OpacityAtlas = FrameTemporaries.OpacityAtlas;
1058 PassParameters->EmissiveAtlas = FrameTemporaries.EmissiveAtlas;
1059 PassParameters->IndirectLightingAtlas = FrameTemporaries.IndirectLightingAtlas;
1061 PassParameters->RWFinalLightingAtlas = GraphBuilder.CreateUAV(FrameTemporaries.FinalLightingAtlas);
1062 PassParameters->RWDirectLightingAtlas = GraphBuilder.CreateUAV(FrameTemporaries.DirectLightingAtlas);
1063
1065 PermutationVector.Set<FLumenSceneDenoiserTemporalCS::FValidHistory>(FrameTemporaries.DiffuseLightingAndSecondMomentHistoryAtlas != nullptr && bTemporal);
1067
1068 const FIntVector GroupCount = FComputeShaderUtils::GetGroupCount(View.ViewRect.Size(), FLumenSceneDenoiserTemporalCS::GetGroupSize());
1069
1071 GraphBuilder,
1072 RDG_EVENT_NAME("TemporalAccumulation"),
1075 CardTileUpdateContext.DispatchCardTilesIndirectArgs,
1077
1078
1080 if (DiffuseLightingAndSecondMoment && NumFramesAccumulated && bTemporal && NonCstFrameTemporaries)
1081 {
1083 NonCstFrameTemporaries->NumFramesAccumulatedHistoryAtlas = NumFramesAccumulated;
1084 }
1085 else
1086 {
1087 NonCstFrameTemporaries->DiffuseLightingAndSecondMomentHistoryAtlas = nullptr;
1088 NonCstFrameTemporaries->NumFramesAccumulatedHistoryAtlas = nullptr;
1089 }
1090 }
1091
1092 // Draw direct lighting stats & Lumen cards/tiles
1093 if (GetLumenLightingStatMode() == 3)
1094 {
1095 AddLumenSceneDirectLightingStatsPass(
1096 GraphBuilder,
1097 Scene,
1098 View,
1103 CompactedLightSampleAllocator,
1104 ComputePassFlags);
1105 }
1106 }
1107}
1108
1109
#define FORCENOINLINE
Definition AndroidPlatform.h:142
#define check(expr)
Definition AssertionMacros.h:314
FBlueNoise GetBlueNoiseGlobalParameters()
Definition BlueNoise.cpp:58
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_GLOBAL_SHADER(ShaderClass)
Definition GlobalShader.h:408
#define IMPLEMENT_GLOBAL_SHADER(ShaderClass, SourceFilename, FunctionName, Frequency)
Definition GlobalShader.h:410
@ ECVF_Scalability
Definition IConsoleManager.h:93
@ ECVF_RenderThreadSafe
Definition IConsoleManager.h:88
void TraceLumenHardwareRayTracedDirectLightingShadows(FRDGBuilder &GraphBuilder, const FScene *Scene, const FViewInfo &View, int32 ViewIndex, const FLumenSceneFrameTemporaries &FrameTemporaries, const FLumenDirectLightingStochasticData &StochasticData, const LumenSceneDirectLighting::FLightDataParameters &LumenLightData, FRDGBufferRef ShadowTraceIndirectArgs, FRDGBufferRef ShadowTraceAllocator, FRDGBufferRef ShadowTraces, FRDGBufferRef LightTileAllocator, FRDGBufferRef LightTiles, FRDGBufferUAVRef ShadowMaskTilesUAV, ERDGPassFlags ComputePassFlags)
Definition LumenSceneDirectLightingHardwareRayTracing.cpp:361
void SetupLightFunctionParameters(const FViewInfo &View, const FLightSceneInfo *LightSceneInfo, float ShadowFadeFraction, FLightFunctionParameters &OutParameters)
Definition LumenSceneDirectLighting.cpp:933
uint32 GetLumenLightingStatMode()
Definition LumenSceneLighting.cpp:70
int32 GLumenDirectLightingCloudTransmittance
Definition LumenSceneDirectLighting.cpp:56
#define IMPLEMENT_MATERIAL_SHADER_TYPE(TemplatePrefix, ShaderClass, SourceFilename, FunctionName, Frequency)
Definition MaterialShaderType.h:13
UE::Math::TVector2< float > FVector2f
Definition MathFwd.h:74
FInt32Vector3 FIntVector
Definition MathFwd.h:115
FInt32Point FIntPoint
Definition MathFwd.h:124
const bool
Definition NetworkReplayStreaming.h:178
@ PF_FloatRGBA
Definition PixelFormat.h:27
@ PF_R16F
Definition PixelFormat.h:38
@ PF_A2B10G10R10
Definition PixelFormat.h:35
@ PF_R32_UINT
Definition PixelFormat.h:45
@ PF_G8
Definition PixelFormat.h:20
@ PF_A32B32G32R32F
Definition PixelFormat.h:18
@ SF_Compute
Definition RHIDefinitions.h:208
@ UniformBuffer_SingleDraw
Definition RHIDefinitions.h:538
#define TexCreate_UAV
Definition RHIDefinitions.h:1209
#define TexCreate_ShaderResource
Definition RHIDefinitions.h:1195
#define GRHIMinimumWaveSize
Definition RHIGlobals.h:868
#define GRHIMaximumWaveSize
Definition RHIGlobals.h:869
ERDGPassFlags
Definition RenderGraphDefinitions.h:128
#define RDG_EVENT_SCOPE(...)
Definition RenderGraphEvent.h:531
#define RDG_EVENT_NAME(...)
Definition RenderGraphEvent.h:529
void AddClearUAVPass(FRDGBuilder &GraphBuilder, FRDGBufferUAVRef BufferUAV, uint32 Value, ERDGPassFlags ComputePassFlags)
Definition RenderGraphUtils.cpp:402
void ClearUnusedGraphResources(const TShaderRef< TShaderClass > &Shader, const FShaderParametersMetadata *ParametersMetadata, typename TShaderClass::FParameters *InoutParameters, std::initializer_list< FRDGResourceRef > ExcludeList={})
Definition RenderGraphUtils.h:195
bool DoesPlatformSupportLumenGI(EShaderPlatform Platform, bool bSkipProjectCheck)
Definition RenderUtils.cpp:2358
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#define SHADER_PARAMETER_RDG_TEXTURE(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1752
#define SHADER_PARAMETER_ARRAY(MemberType, MemberName, ArrayDecl)
Definition ShaderParameterMacros.h:1696
#define SHADER_PARAMETER_SAMPLER(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1740
#define RDG_BUFFER_ACCESS(MemberName, Access)
Definition ShaderParameterMacros.h:1923
#define SHADER_PARAMETER_RDG_BUFFER_UAV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1812
#define BEGIN_SHADER_PARAMETER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1482
#define SHADER_PARAMETER_STRUCT_REF(StructType, MemberName)
Definition ShaderParameterMacros.h:1909
#define SHADER_PARAMETER_RDG_TEXTURE_UAV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1788
#define SHADER_PARAMETER_STRUCT_INCLUDE(StructType, MemberName)
Definition ShaderParameterMacros.h:1895
#define SHADER_PARAMETER_RDG_UNIFORM_BUFFER(StructType, MemberName)
Definition ShaderParameterMacros.h:1823
#define END_SHADER_PARAMETER_STRUCT()
Definition ShaderParameterMacros.h:1485
#define SHADER_PARAMETER(MemberType, MemberName)
Definition ShaderParameterMacros.h:1684
#define SHADER_USE_PARAMETER_STRUCT(ShaderClass, ShaderParentClass)
Definition ShaderParameterStruct.h:62
#define SHADER_PERMUTATION_BOOL(InDefineName)
Definition ShaderPermutation.h:482
#define SHADER_PERMUTATION_SPARSE_INT(InDefineName,...)
Definition ShaderPermutation.h:506
#define DECLARE_SHADER_TYPE(ShaderClass, ShaderMetaTypeShortcut,...)
Definition Shader.h:1688
EShaderPermutationPrecacheRequest
Definition Shader.h:807
TUniformBufferRef< TBufferStruct > CreateUniformBufferImmediate(const TBufferStruct &Value, EUniformBufferUsage Usage, EUniformBufferValidation Validation=EUniformBufferValidation::ValidateResources)
Definition UniformBuffer.h:20
bool SetupLightCloudTransmittanceParameters(FRDGBuilder &GraphBuilder, const FScene *Scene, const FViewInfo &View, const FLightSceneInfo *LightSceneInfo, FLightCloudTransmittanceParameters &OutParameters)
Definition VolumetricCloudRendering.cpp:3173
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition GlobalShader.h:173
RENDERCORE_API TShaderRef< FShader > GetShader(FShaderType *ShaderType, int32 PermutationId=0) const
Definition GlobalShader.cpp:608
Definition GlobalShader.h:269
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters &Parameters, FShaderCompilerEnvironment &Environment)
Definition GlobalShader.h:289
Definition LumenSceneLighting.h:26
Definition LumenSceneDirectLighting.cpp:143
bool bMayCastCloudTransmittance
Definition LumenSceneDirectLighting.cpp:224
Definition LumenSceneDirectLightingStochastic.inl:105
Definition LumenSceneDirectLightingStochastic.inl:65
Definition LumenSceneDirectLightingStochastic.inl:404
Definition LumenSceneData.h:1002
FIntPoint GetRadiosityAtlasSize() const
Definition LumenRadiosity.cpp:268
Definition LumenSceneDirectLightingStochastic.inl:449
Definition LumenSceneDirectLightingStochastic.inl:214
Definition LumenSceneDirectLightingStochastic.inl:145
Definition LumenSceneDirectLightingStochastic.inl:294
Definition LumenSceneDirectLightingStochastic.inl:352
Definition MaterialRenderProxy.h:102
Definition MaterialShared.h:1518
TShaderRef< FShader > GetShader(FShaderType *ShaderType, int32 PermutationId=0) const
Definition MaterialShared.h:1568
Definition MaterialShader.h:56
RENDERER_API FMaterialShader()
Definition MaterialShared.h:2058
Definition RenderGraphResources.h:1452
Definition RenderGraphResources.h:1321
Definition RenderGraphBuilder.h:49
FRDGTextureUAVRef CreateUAV(const FRDGTextureUAVDesc &Desc, ERDGUnorderedAccessViewFlags Flags=ERDGUnorderedAccessViewFlags::None)
Definition RenderGraphBuilder.inl:118
FRDGBufferRef CreateBuffer(const FRDGBufferDesc &Desc, const TCHAR *Name, ERDGBufferFlags Flags=ERDGBufferFlags::None)
Definition RenderGraphBuilder.inl:65
FRDGTextureRef CreateTexture(const FRDGTextureDesc &Desc, const TCHAR *Name, ERDGTextureFlags Flags=ERDGTextureFlags::None)
Definition RenderGraphBuilder.inl:41
ParameterStructType * AllocParameters()
Definition RenderGraphBuilder.inl:170
FRDGPassRef AddPass(FRDGEventName &&Name, const ParameterStructType *ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType &&ExecuteLambda)
FRDGTextureSRVRef CreateSRV(const FRDGTextureSRVDesc &Desc)
Definition RenderGraphBuilder.inl:102
Definition RenderGraphResources.h:905
Definition RenderGraphResources.h:571
const FRDGTextureDesc Desc
Definition RenderGraphResources.h:575
Definition RHICommandList.h:2735
Definition SceneView.h:2212
uint32 GetFrameIndex(uint32 Pow2Modulus) const
Definition ScenePrivate.h:1161
TUniformBufferRef< FViewUniformShaderParameters > ViewUniformBuffer
Definition SceneView.h:1432
FFinalPostProcessSettings FinalPostProcessSettings
Definition SceneView.h:1772
ENGINE_API EShaderPlatform GetShaderPlatform() const
Definition SceneView.cpp:2489
Definition ScenePrivate.h:2875
static void ModifyCompilationEnvironment(const FShaderPermutationParameters &, FShaderCompilerEnvironment &)
Definition Shader.h:854
Definition SceneRendering.h:1132
FPreviousViewInfo & PrevViewInfo
Definition SceneRendering.h:1407
FGlobalShaderMap * ShaderMap
Definition SceneRendering.h:1474
FShaderPrintData ShaderPrintData
Definition SceneRendering.h:1499
FIntRect ViewRect
Definition SceneRendering.h:1137
uint32 bStatePrevViewInfoIsReadOnly
Definition SceneRendering.h:1351
FSceneViewState * ViewState
Definition SceneRendering.h:1143
float PreExposure
Definition SceneRendering.h:1413
Definition IConsoleManager.h:1792
T GetValueOnRenderThread() const
Definition IConsoleManager.h:1849
Definition Shader.h:1021
static RHIParamRefType GetRHI()
Definition RHIStaticStates.h:57
Definition ShaderParameterMacros.h:136
FRDGPassRef AddPass(FRDGBuilder &GraphBuilder, FRDGEventName &&PassName, ERDGPassFlags PassFlags, const TShaderRef< TShaderClass > &ComputeShader, const FShaderParametersMetadata *ParametersMetadata, typename TShaderClass::FParameters *Parameters, FIntVector GroupCount)
Definition RenderGraphUtils.h:550
FIntVector GetGroupCount(const int32 ThreadCount, const int32 GroupSize)
Definition RenderGraphUtils.h:349
Definition LightFunctionAtlas.cpp:122
bool IsEnabled(const FViewInfo &InView, ELightFunctionAtlasSystem In)
Definition LightFunctionAtlas.cpp:975
TRDGUniformBufferRef< FLightFunctionAtlasGlobalParameters > BindGlobalParameters(FRDGBuilder &GraphBuilder, const FViewInfo &InView)
Definition LightFunctionAtlas.cpp:990
bool UseStochasticLighting(const FSceneViewFamily &ViewFamily)
Definition LumenSceneDirectLightingStochastic.inl:57
constexpr uint32 CardTileSize
Definition Lumen.h:45
bool UseHardwareRayTracedDirectLighting(const FSceneViewFamily &ViewFamily)
Definition LumenSceneDirectLightingHardwareRayTracing.cpp:63
void SpliceCardPagesIntoTiles(FRDGBuilder &GraphBuilder, const FGlobalShaderMap *GloablShaderMap, const FLumenCardUpdateContext &CardUpdateContext, const TRDGUniformBufferRef< FLumenCardScene > &LumenCardSceneUniformBuffer, FLumenCardTileUpdateContext &OutCardTileUpdateContext, ERDGPassFlags ComputePassFlags)
Definition LumenSceneDirectLighting.cpp:306
bool UseWaveOps(EShaderPlatform ShaderPlatform)
Definition Lumen.cpp:94
Definition ShaderPrint.cpp:22
void SetEnabled(bool bInEnabled)
Definition ShaderPrint.cpp:317
void SetParameters(FRDGBuilder &GraphBuilder, const FShaderPrintData &InData, FShaderParameters &OutParameters)
Definition ShaderPrint.cpp:265
void RequestSpaceForLines(uint32 InCount)
Definition ShaderPrint.cpp:348
static RHI_API const FClearValueBinding Black
Definition RHIResources.h:359
FVector3f Low
Definition DoubleFloat.h:113
FVector3f High
Definition DoubleFloat.h:112
Definition GlobalShader.h:73
Definition LumenSceneLighting.h:175
Definition LumenSceneLighting.h:158
FRDGBufferRef CompactedLightSampleData
Definition LumenSceneLighting.h:161
Definition LumenSceneDirectLighting.cpp:1889
Definition LumenSceneData.h:895
FRDGTextureRef DiffuseLightingAndSecondMomentHistoryAtlas
Definition LumenSceneData.h:912
Definition LumenSceneData.h:833
FDFVector3 PreViewTranslationDF
Definition LumenSceneData.h:845
float LastEyeAdaptationExposure
Definition LumenSceneData.h:853
FMatrix44f FrustumTranslatedWorldToClip
Definition LumenSceneData.h:849
EMaterialDomain MaterialDomain
Definition MaterialShared.h:1064
Definition MaterialShader.h:45
FMaterialShaderParameters MaterialParameters
Definition MaterialShader.h:46
Definition MaterialShaderType.h:98
static constexpr UE_FORCEINLINE_HINT T DivideAndRoundUp(T Dividend, T Divisor)
Definition UnrealMathUtility.h:694
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
float LumenDiffuseColorBoost
Definition Scene.h:1750
float SceneColorPreExposure
Definition SceneRendering.h:983
Definition RenderGraphDefinitions.h:103
static FRDGBufferDesc CreateStructuredDesc(uint32 BytesPerElement, uint32 NumElements)
Definition RenderGraphResources.h:993
static FRDGTextureDesc Create2DArray(FIntPoint Size, EPixelFormat Format, FClearValueBinding ClearValue, ETextureCreateFlags Flags, uint16 ArraySize, uint8 NumMips=1, uint8 NumSamples=1, uint32 ExtData=0)
Definition RenderGraphDefinitions.h:643
static FRDGTextureDesc Create2D(FIntPoint Size, EPixelFormat Format, FClearValueBinding ClearValue, ETextureCreateFlags Flags, uint8 NumMips=1, uint8 NumSamples=1, uint32 ExtData=0)
Definition RenderGraphDefinitions.h:628
Definition RHI.h:560
uint16 ArraySize
Definition RHIResources.h:1862
FIntPoint Extent
Definition RHIResources.h:1856
Definition ShaderCore.h:544
const int32 PermutationId
Definition ShaderPermutation.h:32
const EShaderPlatform Platform
Definition ShaderPermutation.h:29
Definition ShaderPermutation.h:229
void Set(typename DimensionToSet::Type)
Definition ShaderPermutation.h:252
Definition IntPoint.h:25
IntType Y
Definition IntPoint.h:37
IntType X
Definition IntPoint.h:34
IntPointType Size() const
Definition IntRect.h:449