3#include "IVSmokeVSMProcessor.h"
4#include "IVSmokeCSMRenderer.h"
5#include "IVSmokeShaders.h"
6#include "IVSmokePostProcessPass.h"
7#include "RenderGraphBuilder.h"
8#include "RenderGraphUtils.h"
9#include "GlobalShader.h"
11DEFINE_LOG_CATEGORY_STATIC(LogIVSmokeVSM, Log, All);
17FIVSmokeVSMProcessor::FIVSmokeVSMProcessor()
21FIVSmokeVSMProcessor::~FIVSmokeVSMProcessor()
30 FRDGBuilder& GraphBuilder,
31 FRDGTextureRef DepthTexture,
32 FRDGTextureRef VSMTexture,
35 if (!DepthTexture || !VSMTexture)
41 AddDepthToVariancePass(GraphBuilder, DepthTexture, VSMTexture);
46 const FIntPoint TextureSize(VSMTexture->Desc.Extent.X, VSMTexture->Desc.Extent.Y);
49 FRDGTextureDesc TempDesc = FRDGTextureDesc::Create2D(
52 FClearValueBinding::None,
53 TexCreate_ShaderResource | TexCreate_UAV
55 FRDGTextureRef TempTexture = GraphBuilder.CreateTexture(TempDesc, TEXT(
"IVSmokeVSMBlurTemp"));
58 AddHorizontalBlurPass(GraphBuilder, VSMTexture, TempTexture, BlurRadius);
61 AddVerticalBlurPass(GraphBuilder, TempTexture, VSMTexture, BlurRadius);
66 FRDGBuilder& GraphBuilder,
67 TArray<FIVSmokeCascadeData>& Cascades,
70 for (int32 CascadeIndex = 0; CascadeIndex < Cascades.Num(); CascadeIndex++)
80 FRDGTextureRef DepthRDG = GraphBuilder.RegisterExternalTexture(
82 Cascade.
DepthRT->GetRenderTargetResource()->GetRenderTargetTexture(),
83 *FString::Printf(TEXT(
"IVSmokeCSMDepth_%d"), CascadeIndex)
87 FRDGTextureRef VSMRDG = GraphBuilder.RegisterExternalTexture(
89 Cascade.
VSMRT->GetRenderTargetResource()->GetRenderTargetTexture(),
90 *FString::Printf(TEXT(
"IVSmokeCSMVSM_%d"), CascadeIndex)
94 Process(GraphBuilder, DepthRDG, VSMRDG, BlurRadius);
102void FIVSmokeVSMProcessor::AddDepthToVariancePass(
103 FRDGBuilder& GraphBuilder,
104 FRDGTextureRef DepthTexture,
105 FRDGTextureRef VSMTexture)
107 const FIntPoint TextureSize(DepthTexture->Desc.Extent.X, DepthTexture->Desc.Extent.Y);
109 FGlobalShaderMap* ShaderMap = GetGlobalShaderMap(GMaxRHIFeatureLevel);
110 TShaderMapRef<FIVSmokeDepthToVarianceCS> ComputeShader(ShaderMap);
112 auto* Parameters = GraphBuilder.AllocParameters<FIVSmokeDepthToVarianceCS::FParameters>();
113 Parameters->DepthTexture = DepthTexture;
114 Parameters->VarianceTexture = GraphBuilder.CreateUAV(VSMTexture);
115 Parameters->TextureSize = TextureSize;
122 FIntVector(TextureSize.X, TextureSize.Y, 1)
130void FIVSmokeVSMProcessor::AddHorizontalBlurPass(
131 FRDGBuilder& GraphBuilder,
132 FRDGTextureRef SourceTexture,
133 FRDGTextureRef DestTexture,
136 const FIntPoint TextureSize(SourceTexture->Desc.Extent.X, SourceTexture->Desc.Extent.Y);
138 FGlobalShaderMap* ShaderMap = GetGlobalShaderMap(GMaxRHIFeatureLevel);
139 TShaderMapRef<FIVSmokeVSMBlurCS> ComputeShader(ShaderMap);
141 auto* Parameters = GraphBuilder.AllocParameters<FIVSmokeVSMBlurCS::FParameters>();
142 Parameters->SourceTexture = SourceTexture;
143 Parameters->DestTexture = GraphBuilder.CreateUAV(DestTexture);
144 Parameters->LinearClampSampler = TStaticSamplerState<SF_Bilinear, AM_Clamp, AM_Clamp, AM_Clamp>::GetRHI();
145 Parameters->TextureSize = TextureSize;
146 Parameters->BlurRadius = BlurRadius;
147 Parameters->BlurDirection = 0;
154 FIntVector(TextureSize.X, TextureSize.Y, 1)
158void FIVSmokeVSMProcessor::AddVerticalBlurPass(
159 FRDGBuilder& GraphBuilder,
160 FRDGTextureRef SourceTexture,
161 FRDGTextureRef DestTexture,
164 const FIntPoint TextureSize(SourceTexture->Desc.Extent.X, SourceTexture->Desc.Extent.Y);
166 FGlobalShaderMap* ShaderMap = GetGlobalShaderMap(GMaxRHIFeatureLevel);
167 TShaderMapRef<FIVSmokeVSMBlurCS> ComputeShader(ShaderMap);
169 auto* Parameters = GraphBuilder.AllocParameters<FIVSmokeVSMBlurCS::FParameters>();
170 Parameters->SourceTexture = SourceTexture;
171 Parameters->DestTexture = GraphBuilder.CreateUAV(DestTexture);
172 Parameters->LinearClampSampler = TStaticSamplerState<SF_Bilinear, AM_Clamp, AM_Clamp, AM_Clamp>::GetRHI();
173 Parameters->TextureSize = TextureSize;
174 Parameters->BlurRadius = BlurRadius;
175 Parameters->BlurDirection = 1;
182 FIntVector(TextureSize.X, TextureSize.Y, 1)
static void AddComputeShaderPass(FRDGBuilder &GraphBuilder, FGlobalShaderMap *ShaderMap, TShaderMapRef< TShaderClass > ComputeShader, typename TShaderClass::FParameters *Parameters, const FIntVector &TotalThreadSize)
void ProcessCascades(FRDGBuilder &GraphBuilder, TArray< FIVSmokeCascadeData > &Cascades, int32 BlurRadius)
void Process(FRDGBuilder &GraphBuilder, FRDGTextureRef DepthTexture, FRDGTextureRef VSMTexture, int32 BlurRadius)
TObjectPtr< UTextureRenderTarget2D > VSMRT
TObjectPtr< UTextureRenderTarget2D > DepthRT