UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SubsurfaceTiles.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 SubsurfaceTiles.h: Screenspace subsurface scattering tile buffer implementation.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "RendererInterface.h"
12#include "GlobalShader.h"
14#include "ScreenPass.h"
15#include "SceneRendering.h"
16
17// Adapted from FHairStrandsTile
19{
20 // Support two types of acceleration. It is independent of SSS profile
21 // AFIS: adaptive filtered importance sampling
22 // SEPARABLE: two pass separable filter
23 // PASSTHROUGH: directly pass through because of subpixel SSS
24 // AllNonPassthrough: all subsurface tiles but without passthrough tiles
27
29 static const uint32 GroupSize = 64;
30
31 // Define the size of subsurface tile. @TODO: Set to 16 to use LDS.
32 static const uint32 TileSize = 8;
33
37 bool bRectPrimitive = false;
38
39 // Buffers per tile types
42
45
49
51
54
55 bool IsValid() const { return TileCount > 0 && TileDataBuffer[uint32(ETileType::All)];}
58};
59
62
82
95
96
98
99template <typename FSubsurfacePassPS, typename FSubsurfacePassVS>
101 FRDGBuilder& GraphBuilder,
103 const FViewInfo& View,
104 typename FSubsurfacePassPS::FParameters* PassParameters,
107 FRHIBlendState* BlendState,
108 FRHIDepthStencilState* DepthStencilState,
109 const FScreenPassTextureViewport SceneViewport,
111 const bool bShouldFallbackToFullScreenPass = false)
112{
114 {
116 AddDrawScreenPass(GraphBuilder,
118 View,
119 SceneViewport,
120 SceneViewport,
123 BlendState,
124 DepthStencilState,
126 }
127 else
128 {
129 GraphBuilder.AddPass(
133 [PassParameters, VertexShader, PixelShader, DepthStencilState, BlendState, Viewport = SceneViewport, TileType](FRDGAsyncTask, FRHICommandList& RHICmdList)
134 {
135 typename FSubsurfacePassVS::FParameters ParametersVS = PassParameters->TileParameters;
136
137 FGraphicsPipelineStateInitializer GraphicsPSOInit;
138 RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
139 GraphicsPSOInit.BlendState = BlendState;
141 GraphicsPSOInit.DepthStencilState = DepthStencilState;
142
143 GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GFilterVertexDeclaration.VertexDeclarationRHI;
144 GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
145 GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();
146 GraphicsPSOInit.PrimitiveType = PassParameters->TileParameters.bRectPrimitive > 0 ? PT_RectList : PT_TriangleList;
147 SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, 0);
148 SetShaderParameters(RHICmdList, VertexShader, VertexShader.GetVertexShader(), ParametersVS);
149 SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), *PassParameters);
150
151 RHICmdList.SetViewport(0.0f, 0.0f, 0.0f, Viewport.Extent.X, Viewport.Extent.Y, 1.0f);
152 RHICmdList.SetStreamSource(0, nullptr, 0);
153 RHICmdList.DrawPrimitiveIndirect(PassParameters->TileParameters.TileIndirectBuffer->GetRHI(), FSubsurfaceTiles::GetIndirectDrawArgOffset(TileType));
154 });
155 }
156}
157
159void AddConditionalClearBlackUAVPass(FRDGBuilder& GraphBuilder, FRDGEventName&& PassName,
161
167FSubsurfaceTiles ClassifySSSTiles(FRDGBuilder& GraphBuilder, const FViewInfo& View, const FSceneTextures& SceneTextures,
169
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
TGlobalResource< FFilterVertexDeclaration, FRenderResource::EInitPhase::Pre > GFilterVertexDeclaration
Definition CommonRenderResources.cpp:13
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
FInt32Point FIntPoint
Definition MathFwd.h:124
void SetGraphicsPipelineState(FRHICommandList &RHICmdList, const FGraphicsPipelineStateInitializer &Initializer, uint32 StencilRef, EApplyRendertargetOption ApplyFlags, bool bApplyAdditionalState)
Definition PipelineStateCache.cpp:1478
@ PT_RectList
Definition RHIDefinitions.h:844
@ PT_TriangleList
Definition RHIDefinitions.h:824
void AddDrawScreenPass(FRDGBuilder &GraphBuilder, FRDGEventName &&PassName, FScreenPassViewInfo ViewInfo, const FScreenPassTextureViewport &OutputViewport, const FScreenPassTextureViewport &InputViewport, const TShaderRef< FShader > &VertexShader, const TShaderRef< PixelShaderType > &PixelShader, FRHIBlendState *BlendState, FRHIDepthStencilState *DepthStencilState, typename PixelShaderType::FParameters *PixelShaderParameters, EScreenPassDrawFlags Flags=EScreenPassDrawFlags::None)
Definition ScreenPass.h:505
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#define RDG_BUFFER_ACCESS(MemberName, Access)
Definition ShaderParameterMacros.h:1923
#define BEGIN_SHADER_PARAMETER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1482
#define END_SHADER_PARAMETER_STRUCT()
Definition ShaderParameterMacros.h:1485
#define SHADER_PARAMETER(MemberType, MemberName)
Definition ShaderParameterMacros.h:1684
void SetShaderParameters(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameterBindings &Bindings, const FShaderParametersMetadata *ParametersMetadata, const void *InParametersData)
Definition ShaderParameterStruct.cpp:883
#define SHADER_USE_PARAMETER_STRUCT(ShaderClass, ShaderParentClass)
Definition ShaderParameterStruct.h:62
void AddSubsurfaceTiledScreenPass(FRDGBuilder &GraphBuilder, FRDGEventName &&Name, const FViewInfo &View, typename FSubsurfacePassPS::FParameters *PassParameters, TShaderMapRef< FSubsurfacePassVS > &VertexShader, TShaderMapRef< FSubsurfacePassPS > &PixelShader, FRHIBlendState *BlendState, FRHIDepthStencilState *DepthStencilState, const FScreenPassTextureViewport SceneViewport, FSubsurfaceTiles::ETileType TileType, const bool bShouldFallbackToFullScreenPass=false)
Definition SubsurfaceTiles.h:100
FSubsurfaceTilePassVS::FParameters GetSubsurfaceTileParameters(const FScreenPassTextureViewport &TileViewport, const FSubsurfaceTiles &InTile, FSubsurfaceTiles::ETileType TileType)
Definition SubsurfaceTiles.cpp:25
FORCEINLINE uint32 ToIndex(FSubsurfaceTiles::ETileType Type)
Definition SubsurfaceTiles.h:60
FSubsurfaceTiles ClassifySSSTiles(FRDGBuilder &GraphBuilder, const FViewInfo &View, const FSceneTextures &SceneTextures, const FScreenPassTextureViewportParameters SceneViewportParameters, const FScreenPassTextureViewportParameters SubsurfaceViewportParameters, const bool IsHalfRes)
Definition SubsurfaceTiles.cpp:286
void AddConditionalClearBlackUAVPass(FRDGBuilder &GraphBuilder, FRDGEventName &&PassName, FRDGTextureRef Texture, const FScreenPassTextureViewport &ScreenPassViewport, FRDGBufferRef ConditionBuffer, uint32 Offset)
Definition SubsurfaceTiles.cpp:83
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition GlobalShader.h:269
Definition RHIResources.h:4572
FBoundShaderStateInput BoundShaderState
Definition RHIResources.h:4754
FRHIBlendState * BlendState
Definition RHIResources.h:4755
FRHIRasterizerState * RasterizerState
Definition RHIResources.h:4756
FRHIDepthStencilState * DepthStencilState
Definition RHIResources.h:4757
EPrimitiveType PrimitiveType
Definition RHIResources.h:4760
Definition RenderGraphResources.h:1426
Definition RenderGraphResources.h:1321
Definition RenderGraphBuilder.h:49
FRDGPassRef AddPass(FRDGEventName &&Name, const ParameterStructType *ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphEvent.h:38
Definition RenderGraphResources.h:571
Definition RHIResources.h:696
Definition RHICommandList.h:3819
void SetStreamSource(uint32 StreamIndex, FRHIBuffer *VertexBuffer, uint32 Offset)
Definition RHICommandList.h:3984
void DrawPrimitiveIndirect(FRHIBuffer *ArgumentBuffer, uint32 ArgumentOffset)
Definition RHICommandList.h:4127
void SetViewport(float MinX, float MinY, float MinZ, float MaxX, float MaxY, float MaxZ)
Definition RHICommandList.h:4015
void ApplyCachedRenderTargets(FGraphicsPipelineStateInitializer &GraphicsPSOInit)
Definition RHICommandList.h:4048
Definition RHIResources.h:686
Definition ScreenPass.h:136
Definition SubsurfaceTiles.h:84
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters &Parameters)
Definition SubsurfaceTiles.cpp:20
FSubsurfaceTileFallbackScreenPassVS(const ShaderMetaType::CompiledShaderInitializerType &Initializer)
Definition SubsurfaceTiles.h:91
DECLARE_GLOBAL_SHADER(FSubsurfaceTileFallbackScreenPassVS)
Definition SubsurfaceTiles.h:64
Definition SceneRendering.h:1132
FGlobalShaderMap * ShaderMap
Definition SceneRendering.h:1474
Definition Shader.h:2629
static RHIParamRefType GetRHI()
Definition RHIStaticStates.h:57
FString ToString(uint16 Value)
Definition PathFollowingComponent.cpp:82
U16 Index
Definition radfft.cpp:71
FRHIPixelShader * PixelShaderRHI
Definition RHIResources.h:4510
FRHIVertexShader * VertexShaderRHI
Definition RHIResources.h:4509
FRHIVertexDeclaration * VertexDeclarationRHI
Definition RHIResources.h:4508
Definition GlobalShader.h:73
Definition RenderGraphDefinitions.h:103
Definition RHI.h:560
Definition RHI.h:572
Definition SceneTextures.h:110
Definition Shader.h:1610
Definition ShaderCore.h:544
Definition SubsurfaceTiles.h:19
static const uint32 TilePerThread_GroupSize
Definition SubsurfaceTiles.h:34
FRDGBufferRef TileIndirectDispatchBuffer
Definition SubsurfaceTiles.h:46
static FORCEINLINE uint32 GetIndirectDispatchArgOffset(ETileType Type)
Definition SubsurfaceTiles.h:53
bool IsValid() const
Definition SubsurfaceTiles.h:55
FIntPoint TileDimension
Definition SubsurfaceTiles.h:36
FRDGBufferRef TileIndirectRayDispatchBuffer
Definition SubsurfaceTiles.h:48
FIntPoint BufferResolution
Definition SubsurfaceTiles.h:28
FRDGBufferSRVRef TileTypeCountSRV
Definition SubsurfaceTiles.h:43
ETileType
Definition SubsurfaceTiles.h:25
static const uint32 GroupSize
Definition SubsurfaceTiles.h:29
FRDGBufferRef TileIndirectDrawBuffer
Definition SubsurfaceTiles.h:47
uint32 TileCount
Definition SubsurfaceTiles.h:35
FRDGBufferRef TileDataBuffer[TileTypeCount]
Definition SubsurfaceTiles.h:41
FRDGBufferSRVRef GetTileBufferSRV(ETileType Type) const
Definition SubsurfaceTiles.h:57
FRDGBufferRef TileTypeCountBuffer
Definition SubsurfaceTiles.h:44
FRDGBufferRef GetTileBuffer(ETileType Type) const
Definition SubsurfaceTiles.h:56
FRDGBufferSRVRef TileDataSRV[TileTypeCount]
Definition SubsurfaceTiles.h:40
FRDGBufferRef TilePerThreadIndirectDispatchBuffer
Definition SubsurfaceTiles.h:50
static FORCEINLINE uint32 GetIndirectDrawArgOffset(ETileType Type)
Definition SubsurfaceTiles.h:52
static const uint32 TileSize
Definition SubsurfaceTiles.h:32
static const uint32 TileTypeCount
Definition SubsurfaceTiles.h:26
bool bRectPrimitive
Definition SubsurfaceTiles.h:37
Definition IntPoint.h:25