UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PixelShaderUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 PixelShaderUtils.h: Utilities for pixel shaders.
5=============================================================================*/
6
7#pragma once
8
11#include "GlobalShader.h"
12#include "Math/IntPoint.h"
13#include "Math/IntRect.h"
14#include "Math/UnrealMathSSE.h"
15#include "Math/Vector2D.h"
17#include "PipelineStateCache.h"
18#include "RHI.h"
19#include "RHICommandList.h"
20#include "RHIDefinitions.h"
21#include "RHIStaticStates.h"
23#include "RenderGraphEvent.h"
25#include "RenderGraphUtils.h"
26#include "RenderResource.h"
27#include "RenderUtils.h"
29#include "Shader.h"
32#include "ShaderPermutation.h"
34
36class FRDGBuilder;
37
38
41{
62
64 static RENDERCORE_API void DrawFullscreenTriangle(FRHICommandList& RHICmdList, uint32 InstanceCount = 1);
65
67 static RENDERCORE_API void DrawFullscreenQuad(FRHICommandList& RHICmdList, uint32 InstanceCount = 1);
68
71 FRHICommandList& RHICmdList,
72 const FGlobalShaderMap* GlobalShaderMap,
73 const TShaderRef<FShader>& PixelShader,
74 FGraphicsPipelineStateInitializer& GraphicsPSOInit);
75
78 FRHICommandList& RHICmdList,
79 const FGlobalShaderMap* GlobalShaderMap,
80 const TShaderRef<FShader>& PixelShader,
81 FGraphicsPipelineStateInitializer& GraphicsPSOInit);
82
84 template<typename TShaderClass>
86 FRHICommandList& RHICmdList,
87 const FGlobalShaderMap* GlobalShaderMap,
88 const TShaderRef<TShaderClass>& PixelShader,
89 const typename TShaderClass::FParameters& Parameters,
90 const FIntRect& Viewport,
91 FRHIBlendState* BlendState = nullptr,
92 FRHIRasterizerState* RasterizerState = nullptr,
93 FRHIDepthStencilState* DepthStencilState = nullptr,
94 uint32 StencilRef = 0)
95 {
96 check(PixelShader.IsValid());
97 RHICmdList.SetViewport((float)Viewport.Min.X, (float)Viewport.Min.Y, 0.0f, (float)Viewport.Max.X, (float)Viewport.Max.Y, 1.0f);
98
100 InitFullscreenPipelineState(RHICmdList, GlobalShaderMap, PixelShader, /* out */ GraphicsPSOInit);
101 GraphicsPSOInit.BlendState = BlendState ? BlendState : GraphicsPSOInit.BlendState;
102 GraphicsPSOInit.RasterizerState = RasterizerState ? RasterizerState : GraphicsPSOInit.RasterizerState;
103 GraphicsPSOInit.DepthStencilState = DepthStencilState ? DepthStencilState : GraphicsPSOInit.DepthStencilState;
104
105 SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, StencilRef);
106
107 SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), Parameters);
108
109 DrawFullscreenTriangle(RHICmdList);
110 }
111
113 template<typename TShaderClass>
115 FRHICommandList& RHICmdList,
116 const FGlobalShaderMap* GlobalShaderMap,
118 const typename TShaderClass::FParameters& Parameters,
120 FRHIBlendState* BlendState = nullptr,
121 FRHIRasterizerState* RasterizerState = nullptr,
122 FRHIDepthStencilState* DepthStencilState = nullptr,
123 uint32 StencilRef = 0)
124 {
125 check(PixelShader.IsValid());
126 checkf(Viewports.Num() == 2, TEXT("Only two instanced viewports are currently supported"));
127 {
128 const FIntRect& LeftViewRect = Viewports[0];
129 const int32 LeftMinX = LeftViewRect.Min.X;
130 const int32 LeftMaxX = LeftViewRect.Max.X;
131 const int32 LeftMaxY = LeftViewRect.Max.Y;
132
133 const FIntRect& RightViewRect = Viewports[1];
134 const int32 RightMinX = RightViewRect.Min.X;
135 const int32 RightMaxX = RightViewRect.Max.X;
136 const int32 RightMaxY = RightViewRect.Max.Y;
137 RHICmdList.SetStereoViewport((float)LeftMinX, (float)RightMinX, 0.0f, 0.0f, 0.0f, (float)LeftMaxX, (float)RightMaxX, (float)LeftMaxY, (float)RightMaxY, 1.0f);
138 }
139
140 FGraphicsPipelineStateInitializer GraphicsPSOInit;
141 InitFullscreenMultiviewportPipelineState(RHICmdList, GlobalShaderMap, PixelShader, /* out */ GraphicsPSOInit);
142 GraphicsPSOInit.BlendState = BlendState ? BlendState : GraphicsPSOInit.BlendState;
143 GraphicsPSOInit.RasterizerState = RasterizerState ? RasterizerState : GraphicsPSOInit.RasterizerState;
144 GraphicsPSOInit.DepthStencilState = DepthStencilState ? DepthStencilState : GraphicsPSOInit.DepthStencilState;
145
146 SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, StencilRef);
147
148 SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), Parameters);
149
150 DrawFullscreenTriangle(RHICmdList, Viewports.Num());
151 }
152
154 template<typename TShaderClass>
155 static inline void AddFullscreenPass(
156 FRDGBuilder& GraphBuilder,
157 const FGlobalShaderMap* GlobalShaderMap,
158 FRDGEventName&& PassName,
160 typename TShaderClass::FParameters* Parameters,
161 const FIntRect& Viewport,
162 FRHIBlendState* BlendState = nullptr,
163 FRHIRasterizerState* RasterizerState = nullptr,
164 FRHIDepthStencilState* DepthStencilState = nullptr,
165 uint32 StencilRef = 0,
167 {
168 check(PixelShader.IsValid());
170
173
174 GraphBuilder.AddPass(
175 Forward<FRDGEventName>(PassName),
176 Parameters,
177 PassFlags,
178 [Parameters, GlobalShaderMap, PixelShader, Viewport, BlendState, RasterizerState, DepthStencilState, StencilRef](FRDGAsyncTask, FRHICommandList& RHICmdList)
179 {
180 FPixelShaderUtils::DrawFullscreenPixelShader(RHICmdList, GlobalShaderMap, PixelShader, *Parameters, Viewport,
181 BlendState, RasterizerState, DepthStencilState, StencilRef);
182 });
183 }
184
186 template<typename TShaderClass>
188 FRDGBuilder& GraphBuilder,
189 const FGlobalShaderMap* GlobalShaderMap,
190 FRDGEventName&& PassName,
192 typename TShaderClass::FParameters* Parameters,
193 TArray<FIntRect>&& Viewports,
194 FRHIBlendState* BlendState = nullptr,
195 FRHIRasterizerState* RasterizerState = nullptr,
196 FRHIDepthStencilState* DepthStencilState = nullptr,
197 uint32 StencilRef = 0,
199 {
200 check(PixelShader.IsValid());
202
205
206 GraphBuilder.AddPass(
207 Forward<FRDGEventName>(PassName),
208 Parameters,
209 PassFlags,
210 [Parameters, GlobalShaderMap, PixelShader, Viewports, BlendState, RasterizerState, DepthStencilState, StencilRef](FRDGAsyncTask, FRHICommandList& RHICmdList)
211 {
212 FPixelShaderUtils::DrawFullscreenInstancedMultiViewportPixelShader(RHICmdList, GlobalShaderMap, PixelShader, *Parameters, Viewports,
213 BlendState, RasterizerState, DepthStencilState, StencilRef);
214 });
215 }
216
219 template<typename TPixelShaderClass, typename TPassParameters>
220 UE_DEPRECATED(5.5, "Use the other prototype of AddRasterizeToRectsPass that takes a ERDGPassFlags in parameter and use ERDGPassFlags::SkipRenderPass in lieu of bSkipRenderPass == true")
222 FRDGBuilder& GraphBuilder,
223 const FGlobalShaderMap* GlobalShaderMap,
224 FRDGEventName&& PassName,
226 TPassParameters* Parameters,
227 FIntPoint ViewportSize,
230 FRHIBlendState* BlendState,
231 FRHIRasterizerState* RasterizerState,
232 FRHIDepthStencilState* DepthStencilState,
234 FIntPoint TextureSize,
236 uint32 DownsampleFactor,
237 const bool bSkipRenderPass)
238 {
239 AddRasterizeToRectsPass(GraphBuilder, GlobalShaderMap, PassName, PixelShader, Parameters, ViewportSize, RectCoordBufferSRV, NumRects, BlendState, RasterizerState, DepthStencilState,
241 }
242
244 template<typename TPixelShaderClass, typename TPassParameters>
245 static inline void AddRasterizeToRectsPass(
246 FRDGBuilder& GraphBuilder,
247 const FGlobalShaderMap* GlobalShaderMap,
248 FRDGEventName&& PassName,
250 TPassParameters* Parameters,
251 FIntPoint ViewportSize,
254 FRHIBlendState* BlendState = nullptr,
255 FRHIRasterizerState* RasterizerState = nullptr,
256 FRHIDepthStencilState* DepthStencilState = nullptr,
257 uint32 StencilRef = 0,
258 FIntPoint TextureSize = FIntPoint(1, 1),
260 uint32 DownsampleFactor = 1,
262 float DepthIncrement = 0.0f)
263 {
265 PermutationVector.Set<FRasterizeToRectsVS::FRectUV>(RectUVBufferSRV != nullptr);
267
268 Parameters->VS.InvViewSize = FVector2f(1.0f / ViewportSize.X, 1.0f / ViewportSize.Y);
269 Parameters->VS.InvTextureSize = FVector2f(1.0f / TextureSize.X, 1.0f / TextureSize.Y);
270 Parameters->VS.DownsampleFactor = 1.0f / DownsampleFactor;
271 Parameters->VS.RectCoordBuffer = RectCoordBufferSRV;
272 Parameters->VS.RectUVBuffer = RectUVBufferSRV;
273 Parameters->VS.DepthIncrement = DepthIncrement;
274
275 ClearUnusedGraphResources(PixelShader, &Parameters->PS);
276
280
281 GraphBuilder.AddPass(
282 Forward<FRDGEventName>(PassName),
283 Parameters,
284 PassFlags,
285 [Parameters, GlobalShaderMap, VertexShader, PixelShader, ViewportSize, BlendState, RasterizerState, DepthStencilState, StencilRef, bSkipRenderPass, NumRects](FRDGAsyncTask, FRHICommandList& RHICmdList)
286 {
287 if (bSkipRenderPass)
288 {
291 RPInfo.ResolveRect.Y1 = 0;
292 RPInfo.ResolveRect.X2 = ViewportSize.X;
293 RPInfo.ResolveRect.Y2 = ViewportSize.Y;
294 RHICmdList.BeginRenderPass(RPInfo, TEXT("RasterizeToRects"));
295 }
296
297 FGraphicsPipelineStateInitializer GraphicsPSOInit;
298 RHICmdList.ApplyCachedRenderTargets(GraphicsPSOInit);
299
300 RHICmdList.SetViewport(0.0f, 0.0f, 0.0f, (float)ViewportSize.X, (float)ViewportSize.Y, 1.0f);
301
302 GraphicsPSOInit.BlendState = BlendState ? BlendState : TStaticBlendState<>::GetRHI();
303 GraphicsPSOInit.RasterizerState = RasterizerState ? RasterizerState : TStaticRasterizerState<>::GetRHI();
304 GraphicsPSOInit.DepthStencilState = DepthStencilState ? DepthStencilState : TStaticDepthStencilState<false, CF_Always>::GetRHI();
305
307
308 GraphicsPSOInit.BoundShaderState.VertexDeclarationRHI = GTileVertexDeclaration.VertexDeclarationRHI;
309 GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
310 GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();
311
312 SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit, StencilRef);
313
314 SetShaderParameters(RHICmdList, VertexShader, VertexShader.GetVertexShader(), Parameters->VS);
315 SetShaderParameters(RHICmdList, PixelShader, PixelShader.GetPixelShader(), Parameters->PS);
316
317 const uint32 NumPrimitives = GRHISupportsRectTopology ? 1 : 2;
318 const uint32 NumInstances = NumRects;
319 RHICmdList.DrawPrimitive(0, NumPrimitives, NumInstances);
320
321 if (bSkipRenderPass)
322 {
323 RHICmdList.EndRenderPass();
324 }
325 });
326 }
327};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#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
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
TGlobalResource< FTileVertexDeclaration, FRenderResource::EInitPhase::Pre > GTileVertexDeclaration
Definition GlobalRenderResources.cpp:744
UE::Math::TVector2< float > FVector2f
Definition MathFwd.h:74
FInt32Point FIntPoint
Definition MathFwd.h:124
const bool
Definition NetworkReplayStreaming.h:178
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
#define GRHISupportsRectTopology
Definition RHIGlobals.h:789
ERDGPassFlags
Definition RenderGraphDefinitions.h:128
void ClearUnusedGraphResources(const TShaderRef< TShaderClass > &Shader, const FShaderParametersMetadata *ParametersMetadata, typename TShaderClass::FParameters *InoutParameters, std::initializer_list< FRDGResourceRef > ExcludeList={})
Definition RenderGraphUtils.h:195
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#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
#define SHADER_PERMUTATION_BOOL(InDefineName)
Definition ShaderPermutation.h:482
#define DECLARE_EXPORTED_SHADER_TYPE(ShaderClass, ShaderMetaTypeShortcut, RequiredAPI,...)
Definition Shader.h:1683
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
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 PixelShaderUtils.h:44
Definition MemoryImage.h:49
Definition RenderGraphResources.h:1426
Definition RenderGraphBuilder.h:49
FRDGPassRef AddPass(FRDGEventName &&Name, const ParameterStructType *ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphEvent.h:38
Definition RHIResources.h:696
Definition RHICommandList.h:3819
void BeginRenderPass(const FRHIRenderPassInfo &InInfo, const TCHAR *Name)
Definition RHICommandList.h:4259
void SetViewport(float MinX, float MinY, float MinZ, float MaxX, float MaxY, float MaxZ)
Definition RHICommandList.h:4015
void DrawPrimitive(uint32 BaseVertexIndex, uint32 NumPrimitives, uint32 NumInstances)
Definition RHICommandList.h:3962
void SetStereoViewport(float LeftMinX, float RightMinX, float LeftMinY, float RightMinY, float MinZ, float LeftMaxX, float RightMaxX, float LeftMaxY, float RightMaxY, float MaxZ)
Definition RHICommandList.h:4026
void ApplyCachedRenderTargets(FGraphicsPipelineStateInitializer &GraphicsPSOInit)
Definition RHICommandList.h:4048
void EndRenderPass()
Definition RHICommandList.h:4291
Definition RHIResources.h:686
Definition RHIResources.h:679
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition Array.h:670
Definition Shader.h:1021
static RHIParamRefType GetRHI()
Definition RHIStaticStates.h:57
FRHIPixelShader * PixelShaderRHI
Definition RHIResources.h:4510
FRHIVertexShader * VertexShaderRHI
Definition RHIResources.h:4509
FRHIVertexDeclaration * VertexDeclarationRHI
Definition RHIResources.h:4508
Definition PixelShaderUtils.h:41
static void AddRasterizeToRectsPass(FRDGBuilder &GraphBuilder, const FGlobalShaderMap *GlobalShaderMap, FRDGEventName &&PassName, const TShaderRef< TPixelShaderClass > &PixelShader, TPassParameters *Parameters, FIntPoint ViewportSize, FRDGBufferSRVRef RectCoordBufferSRV, uint32 NumRects, FRHIBlendState *BlendState, FRHIRasterizerState *RasterizerState, FRHIDepthStencilState *DepthStencilState, uint32 StencilRef, FIntPoint TextureSize, FRDGBufferSRVRef RectUVBufferSRV, uint32 DownsampleFactor, const bool bSkipRenderPass)
Definition PixelShaderUtils.h:221
static void AddFullscreenPass(FRDGBuilder &GraphBuilder, const FGlobalShaderMap *GlobalShaderMap, FRDGEventName &&PassName, const TShaderRef< TShaderClass > &PixelShader, typename TShaderClass::FParameters *Parameters, const FIntRect &Viewport, FRHIBlendState *BlendState=nullptr, FRHIRasterizerState *RasterizerState=nullptr, FRHIDepthStencilState *DepthStencilState=nullptr, uint32 StencilRef=0, ERDGPassFlags AdditionalPassFlags=ERDGPassFlags::None)
Definition PixelShaderUtils.h:155
static RENDERCORE_API void DrawFullscreenTriangle(FRHICommandList &RHICmdList, uint32 InstanceCount=1)
Definition PixelShaderUtils.cpp:20
static RENDERCORE_API void InitFullscreenMultiviewportPipelineState(FRHICommandList &RHICmdList, const FGlobalShaderMap *GlobalShaderMap, const TShaderRef< FShader > &PixelShader, FGraphicsPipelineStateInitializer &GraphicsPSOInit)
Definition PixelShaderUtils.cpp:69
static void AddFullscreenInstancedMultiViewportPass(FRDGBuilder &GraphBuilder, const FGlobalShaderMap *GlobalShaderMap, FRDGEventName &&PassName, const TShaderRef< TShaderClass > &PixelShader, typename TShaderClass::FParameters *Parameters, TArray< FIntRect > &&Viewports, FRHIBlendState *BlendState=nullptr, FRHIRasterizerState *RasterizerState=nullptr, FRHIDepthStencilState *DepthStencilState=nullptr, uint32 StencilRef=0, ERDGPassFlags AdditionalPassFlags=ERDGPassFlags::None)
Definition PixelShaderUtils.h:187
static void DrawFullscreenPixelShader(FRHICommandList &RHICmdList, const FGlobalShaderMap *GlobalShaderMap, const TShaderRef< TShaderClass > &PixelShader, const typename TShaderClass::FParameters &Parameters, const FIntRect &Viewport, FRHIBlendState *BlendState=nullptr, FRHIRasterizerState *RasterizerState=nullptr, FRHIDepthStencilState *DepthStencilState=nullptr, uint32 StencilRef=0)
Definition PixelShaderUtils.h:85
static RENDERCORE_API void DrawFullscreenQuad(FRHICommandList &RHICmdList, uint32 InstanceCount=1)
Definition PixelShaderUtils.cpp:35
static void DrawFullscreenInstancedMultiViewportPixelShader(FRHICommandList &RHICmdList, const FGlobalShaderMap *GlobalShaderMap, const TShaderRef< TShaderClass > &PixelShader, const typename TShaderClass::FParameters &Parameters, TArrayView< FIntRect const > Viewports, FRHIBlendState *BlendState=nullptr, FRHIRasterizerState *RasterizerState=nullptr, FRHIDepthStencilState *DepthStencilState=nullptr, uint32 StencilRef=0)
Definition PixelShaderUtils.h:114
static void AddRasterizeToRectsPass(FRDGBuilder &GraphBuilder, const FGlobalShaderMap *GlobalShaderMap, FRDGEventName &&PassName, const TShaderRef< TPixelShaderClass > &PixelShader, TPassParameters *Parameters, FIntPoint ViewportSize, FRDGBufferSRVRef RectCoordBufferSRV, uint32 NumRects, FRHIBlendState *BlendState=nullptr, FRHIRasterizerState *RasterizerState=nullptr, FRHIDepthStencilState *DepthStencilState=nullptr, uint32 StencilRef=0, FIntPoint TextureSize=FIntPoint(1, 1), FRDGBufferSRVRef RectUVBufferSRV=nullptr, uint32 DownsampleFactor=1, ERDGPassFlags AdditionalPassFlags=ERDGPassFlags::None, float DepthIncrement=0.0f)
Definition PixelShaderUtils.h:245
static RENDERCORE_API void InitFullscreenPipelineState(FRHICommandList &RHICmdList, const FGlobalShaderMap *GlobalShaderMap, const TShaderRef< FShader > &PixelShader, FGraphicsPipelineStateInitializer &GraphicsPSOInit)
Definition PixelShaderUtils.cpp:50
Definition RenderGraphDefinitions.h:103
Definition RHIResources.h:5248
FResolveRect ResolveRect
Definition RHIResources.h:5269
int32 X1
Definition RHIResources.h:5210
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