UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
LightFunctionAtlas.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "LightSceneProxy.h"
7#include "RenderGraphFwd.h"
9
10class FViewFamilyInfo;
11class FViewInfo;
12class FScene;
14class FRDGBuilder;
15class FLightSceneInfo;
16class FRDGTexture;
17
21
22
23
24namespace LightFunctionAtlas
25{
26
27// This allows to not have to store more data per GPU light representation on GPU. The light only needs an index into the array.
28// Using a constant buffer also workaround the fact that we would otherwise need another SRV in forward shaders.
29// The light atlas texture itself already use 1 extra SRV. We could an extra SRV and have LightInfoDataXXX be in a buffer that scale with amount of light in the scene.
36
44
45struct FLightFunctionAtlas;
46
48{
54
56 {
57 SystemFlags |= 1u << uint32(In);
58 }
59
61 {
62 SystemFlags = 0;
63 }
64
66 bool UsesLightFunctionAtlas(ELightFunctionAtlasSystem In) const { return (SystemFlags & (1u<<uint32(In))) != 0; }
67 bool GetLightFunctionAtlasEnabled() const { return bLightFunctionAtlasEnabled; }
68
69private:
71 bool bLightFunctionAtlasEnabled = false;
72 uint32 SystemFlags = 0;
73};
74
76{
79
80 FLightFunctionAtlas* GetLightFunctionAtlas() const { return SceneData ? SceneData->GetLightFunctionAtlas() : nullptr; }
81 bool GetLightFunctionAtlasEnabled() const { return SceneData ? SceneData->GetLightFunctionAtlasEnabled() : false; }
82 bool UsesLightFunctionAtlas(ELightFunctionAtlasSystem In) const { return SceneData ? SceneData->UsesLightFunctionAtlas(In) : false; }
83 uint32 GetViewIndex() const { return ViewIndex; }
84
85private:
86 FLightFunctionAtlasSceneData* SceneData = nullptr;
87 uint32 ViewIndex = 0;
88};
89
91{
93
94 uint32 EffectiveLightFunctionSlotIndex = 0; // Not used to de-duplicate light function. It is the index of the effective lighting function for this frame in EffectiveLightFunctionSlotArray.
95
97
99
100 inline bool operator==(const FLightFunctionSlotKey& Other) const
101 {
102 return Other.LFMaterialUniqueID == LFMaterialUniqueID;
103 }
104};
105
107{
108 return ::GetTypeHash(Key.LFMaterialUniqueID);
109}
110
117
118#define LIGHT_FUNCTION_ATLAS_MAX_LIGHT_FUNCTION_COUNT 256
119
125
131
132
133
134// This class holds all data and resources related light function for a single scene, including multiple views.
136{
138 virtual ~FLightFunctionAtlas();
139
140 bool IsLightFunctionAtlasEnabled() const { return bLightFunctionAtlasEnabled; }
141
142 void ClearEmptySceneFrame(FViewInfo* View = nullptr, uint32 ViewIndex = 0, FLightFunctionAtlasSceneData* LightFunctionAtlasSceneData = nullptr);
143
144 void BeginSceneFrame(const FViewFamilyInfo& ViewFamily, TArray<FViewInfo>& Views, FLightFunctionAtlasSceneData& LightFunctionAtlasSceneData, bool bShouldRenderVolumetricFog);
145
146 void UpdateRegisterLightSceneInfo(FLightSceneInfo* LightSceneInfo);
147
149
150 void RenderLightFunctionAtlas(FRDGBuilder& GraphBuilder, TArray<FViewInfo>& Views);
151
152
154
157
160
161 bool IsOutOfSlots();
163
164private:
165
166 void AllocateAtlasSlots(const TArray<FViewInfo>& Views);
167
168 void AllocateTexture2DAtlas(FRDGBuilder& GraphBuilder);
169
170 void RenderAtlasSlots(FRDGBuilder& GraphBuilder, const TArray<FViewInfo>& Views);
171
172 bool bLightFunctionAtlasEnabled = false;
173
174 FRDGTextureRef RDGAtlasTexture2D = nullptr;
175 FRDGBufferRef RDGLightInfoDataBuffer = nullptr;
176
177 // All the lights that wants to sample light functions
178 TArray<FLightSceneInfo*> RegisteredLights;
179
180 // This set is used to de-duplicate light functions in the atlas. An alternative to set would be to use simple array with simple loops.
181 TSet<FLightFunctionSlotKey> LightFunctionsSet;
182
183 // The structure used to render light function and generate the associated constant buffer, containing UVs and transformation matrices.
184 struct EffectiveLightFunctionSlot
185 {
186 const FMaterialRenderProxy* LightFunctionMaterial = nullptr;
187 FIntPoint Min;
188 FIntPoint Max;
189 float MinU;
190 float MinV;
191 };
192 TArray<EffectiveLightFunctionSlot> EffectiveLightFunctionSlotArray;
193
194 struct EffectiveLocalLightSlot
195 {
196 FLightSceneInfo* LightSceneInfo = nullptr;
197 uint8 LightFunctionAtlasSlotIndex = 0;
198 };
199 TArray<EffectiveLocalLightSlot> EffectiveLocalLightSlotArray;
200
201 FLightFunctionAtlasGlobalParameters* DefaultLightFunctionAtlasGlobalParameters = nullptr;
202 TRDGUniformBufferRef<FLightFunctionAtlasGlobalParameters> DefaultLightFunctionAtlasGlobalParametersUB;
203
204 TArray<FLightFunctionAtlasGlobalParameters*> ViewLightFunctionAtlasGlobalParametersArray;
205 TArray<TRDGUniformBufferRef<FLightFunctionAtlasGlobalParameters>> ViewLightFunctionAtlasGlobalParametersUBArray;
206
207#if WITH_EDITOR
210#endif
211
212#if !UE_BUILD_SHIPPING
213 uint32 LightCountSkippedDueToMissingAtlasSlot = 0;
214 TSet<FLightFunctionSlotKey> SkippedLightFunctionsSet;
215#endif
216
217 FLightFunctionAtlasSetup AtlasSetup;
218};
219
220
223void OnRenderBegin(FLightFunctionAtlas& In, FScene& InScene, TArray<FViewInfo>& Views, const FViewFamilyInfo& ViewFamily);
224
225
228
229
230} // namespace LightFunctionAtlas
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#define SHADER_PARAMETER_RDG_TEXTURE(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1752
#define END_GLOBAL_SHADER_PARAMETER_STRUCT
Definition ShaderParameterMacros.h:1669
#define SHADER_PARAMETER_SAMPLER(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1740
#define BEGIN_GLOBAL_SHADER_PARAMETER_STRUCT
Definition ShaderParameterMacros.h:1663
#define SHADER_PARAMETER(MemberType, MemberName)
Definition ShaderParameterMacros.h:1684
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition LightSceneInfo.h:208
Definition MaterialRenderProxy.h:102
Definition RenderGraphResources.h:1321
Definition RenderGraphBuilder.h:49
Definition RenderGraphResources.h:571
Definition ScenePrivate.h:2875
Definition SceneRendering.h:1970
Definition SceneRendering.h:1132
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition RenderGraphResources.h:251
Definition LightFunctionAtlas.cpp:122
uint32 GetTypeHash(FLightFunctionSlotKey Key)
Definition LightFunctionAtlas.h:106
ELightFunctionAtlasSystem
Definition LightFunctionAtlas.h:38
bool IsEnabled(const FViewInfo &InView, ELightFunctionAtlasSystem In)
Definition LightFunctionAtlas.cpp:975
TRDGUniformBufferRef< FLightFunctionAtlasGlobalParameters > BindGlobalParameters(FRDGBuilder &GraphBuilder, const FViewInfo &InView)
Definition LightFunctionAtlas.cpp:990
void OnRenderBegin(FLightFunctionAtlas &In, FScene &InScene, TArray< FViewInfo > &InViews, const FViewFamilyInfo &InViewFamily)
Definition LightFunctionAtlas.cpp:985
FLightFunctionAtlasGlobalParameters * GetGlobalParametersStruct(FRDGBuilder &GraphBuilder, const FViewInfo &InView)
Definition LightFunctionAtlas.cpp:995
Definition ScreenPass.h:41
Definition LightSceneInfo.h:146
Definition RendererInterface.h:494
Definition LightFunctionAtlas.h:121
FMatrix44f Transform
Definition LightFunctionAtlas.h:123
FVector4f Parameters
Definition LightFunctionAtlas.h:122
Definition LightFunctionAtlas.h:48
void AddSystem(ELightFunctionAtlasSystem In)
Definition LightFunctionAtlas.h:55
FLightFunctionAtlas * GetLightFunctionAtlas() const
Definition LightFunctionAtlas.h:65
void ClearSystems()
Definition LightFunctionAtlas.h:60
bool GetLightFunctionAtlasEnabled() const
Definition LightFunctionAtlas.h:67
bool UsesLightFunctionAtlas(ELightFunctionAtlasSystem In) const
Definition LightFunctionAtlas.h:66
void SetData(FLightFunctionAtlas *InLightFunctionAtlas, bool bInLightFunctionAtlasEnabled)
Definition LightFunctionAtlas.h:49
Definition LightFunctionAtlas.h:127
uint32 SlotResolution
Definition LightFunctionAtlas.h:129
uint32 EdgeSize
Definition LightFunctionAtlas.h:128
Definition LightFunctionAtlas.h:76
uint32 GetViewIndex() const
Definition LightFunctionAtlas.h:83
bool GetLightFunctionAtlasEnabled() const
Definition LightFunctionAtlas.h:81
bool UsesLightFunctionAtlas(ELightFunctionAtlasSystem In) const
Definition LightFunctionAtlas.h:82
FLightFunctionAtlasViewData(FLightFunctionAtlasSceneData *InSceneData, uint32 InViewIndex)
Definition LightFunctionAtlas.h:78
FLightFunctionAtlasViewData()
Definition LightFunctionAtlas.h:77
FLightFunctionAtlas * GetLightFunctionAtlas() const
Definition LightFunctionAtlas.h:80
Definition LightFunctionAtlas.h:136
static FLightFunctionAtlasGlobalParameters * GetDefaultLightFunctionAtlasGlobalParametersStruct(FRDGBuilder &GraphBuilder)
Definition LightFunctionAtlas.cpp:560
FLightFunctionAtlasGlobalParameters * GetLightFunctionAtlasGlobalParametersStruct(FRDGBuilder &GraphBuilder, uint32 ViewIndex)
Definition LightFunctionAtlas.cpp:530
FScreenPassTexture AddDebugVisualizationPasses(FRDGBuilder &GraphBuilder, const FViewInfo &View, FScreenPassTexture &ScreenPassSceneColor) const
Definition LightFunctionAtlas.cpp:828
void UpdateLightFunctionAtlas(const TArray< FViewInfo > &Views)
Definition LightFunctionAtlas.cpp:333
void BeginSceneFrame(const FViewFamilyInfo &ViewFamily, TArray< FViewInfo > &Views, FLightFunctionAtlasSceneData &LightFunctionAtlasSceneData, bool bShouldRenderVolumetricFog)
Definition LightFunctionAtlas.cpp:276
TRDGUniformBufferRef< FLightFunctionAtlasGlobalParameters > GetDefaultLightFunctionAtlasGlobalParameters(FRDGBuilder &GraphBuilder)
Definition LightFunctionAtlas.cpp:570
bool IsLightFunctionAtlasEnabled() const
Definition LightFunctionAtlas.h:140
void UpdateRegisterLightSceneInfo(FLightSceneInfo *LightSceneInfo)
Definition LightFunctionAtlas.cpp:240
void RenderLightFunctionAtlas(FRDGBuilder &GraphBuilder, TArray< FViewInfo > &Views)
Definition LightFunctionAtlas.cpp:580
FLightFunctionAtlas()
Definition LightFunctionAtlas.cpp:231
virtual ~FLightFunctionAtlas()
Definition LightFunctionAtlas.cpp:236
FString GetOutOfSlotWarningMessage()
Definition LightFunctionAtlas.cpp:807
TRDGUniformBufferRef< FLightFunctionAtlasGlobalParameters > GetLightFunctionAtlasGlobalParameters(FRDGBuilder &GraphBuilder, uint32 ViewIndex)
Definition LightFunctionAtlas.cpp:545
void ClearEmptySceneFrame(FViewInfo *View=nullptr, uint32 ViewIndex=0, FLightFunctionAtlasSceneData *LightFunctionAtlasSceneData=nullptr)
Definition LightFunctionAtlas.cpp:255
bool IsOutOfSlots()
Definition LightFunctionAtlas.cpp:798
Definition LightFunctionAtlas.h:91
uint32 EffectiveLightFunctionSlotIndex
Definition LightFunctionAtlas.h:94
uint32 LFMaterialUniqueID
Definition LightFunctionAtlas.h:92
FLightFunctionSlotKey()
Definition LightFunctionAtlas.h:96
bool operator==(const FLightFunctionSlotKey &Other) const
Definition LightFunctionAtlas.h:100
Definition LightFunctionAtlas.h:112
const FMaterialRenderProxy * LightFunctionMaterial
Definition LightFunctionAtlas.h:113
FIntPoint Min
Definition LightFunctionAtlas.h:114
FIntPoint Max
Definition LightFunctionAtlas.h:115
Definition IntPoint.h:25