3#include "IVSmokeRayMarchPipeline.h"
4#include "IVSmokeShaders.h"
6#include "RenderGraphBuilder.h"
7#include "RenderGraphUtils.h"
8#include "SceneTexturesConfig.h"
9#include "SceneRenderTargetParameters.h"
10#include "SystemTextures.h"
15IMPLEMENT_GLOBAL_SHADER(
FIVSmokeTileSetupCS,
"/Plugin/IVSmoke/IVSmokeTileSetupCS.usf",
"MainCS", SF_Compute);
16IMPLEMENT_GLOBAL_SHADER(
FIVSmokeOccupancyBuildCS,
"/Plugin/IVSmoke/IVSmokeOccupancyBuildCS.usf",
"MainCS", SF_Compute);
22namespace IVSmokeOccupancy
27 FIntPoint ComputeTileCount(
const FIntPoint& ViewportSize)
31 FMath::DivideAndRoundUp(ViewportSize.Y, (int32)FIVSmokeOccupancyConfig::TileSizeY)
38 uint32 ComputeStepSliceCount(int32 MaxSteps)
47 void AddTileSetupPass(
48 FRDGBuilder& GraphBuilder,
49 const FSceneView& View,
50 FRDGBufferRef VolumeDataBuffer,
51 uint32 NumActiveVolumes,
52 FRDGBufferRef OutTileDataBuffer,
53 const FIntPoint& TileCount,
54 uint32 StepSliceCount,
56 const FIntPoint& ViewportSize,
57 const FIntPoint& ViewRectMin)
59 FGlobalShaderMap* ShaderMap = GetGlobalShaderMap(View.FeatureLevel);
60 TShaderMapRef<FIVSmokeTileSetupCS> ComputeShader(ShaderMap);
62 auto* Parameters = GraphBuilder.AllocParameters<FIVSmokeTileSetupCS::FParameters>();
65 Parameters->TileDataBufferRW = GraphBuilder.CreateUAV(OutTileDataBuffer);
68 Parameters->SceneTexturesStruct = GetSceneTextureShaderParameters(View).SceneTextures;
71 Parameters->VolumeDataBuffer = GraphBuilder.CreateSRV(VolumeDataBuffer);
72 Parameters->NumActiveVolumes = NumActiveVolumes;
75 Parameters->TileCount = TileCount;
76 Parameters->StepSliceCount = StepSliceCount;
77 Parameters->MaxRayDistance = MaxRayDistance;
80 Parameters->ViewportSize = ViewportSize;
81 Parameters->ViewRectMin = ViewRectMin;
84 const FViewMatrices& ViewMatrices = View.ViewMatrices;
85 Parameters->CameraPosition = FVector3f(ViewMatrices.GetViewOrigin());
86 Parameters->CameraForward = FVector3f(View.GetViewDirection());
87 Parameters->CameraRight = FVector3f(View.GetViewRight());
88 Parameters->CameraUp = FVector3f(View.GetViewUp());
90 const FMatrix& ProjMatrix = ViewMatrices.GetProjectionMatrix();
91 float ProjM11 = ProjMatrix.M[1][1];
94 if (FMath::IsNearlyZero(ProjM11, 1e-6f) || !FMath::IsFinite(ProjM11))
96 UE_LOG(LogIVSmoke, Error, TEXT(
"[TileSetup] Invalid ProjMatrix.M[1][1] = %f (likely orthographic viewport), skipping"), ProjM11);
100 Parameters->TanHalfFOV = 1.0f / ProjM11;
101 Parameters->AspectRatio = (float)ViewportSize.X / (
float)ViewportSize.Y;
104 Parameters->InvDeviceZToWorldZTransform = FVector4f(View.InvDeviceZToWorldZTransform);
107 FIntVector GroupCount(TileCount.X, TileCount.Y, 1);
109 FComputeShaderUtils::AddPass(
111 RDG_EVENT_NAME(
"IVSmoke::TileSetup (%dx%d tiles)", TileCount.X, TileCount.Y),
122 void AddOccupancyBuildPass(
123 FRDGBuilder& GraphBuilder,
124 const FSceneView& View,
125 FRDGBufferRef TileDataBuffer,
126 FRDGBufferRef VolumeDataBuffer,
127 uint32 NumActiveVolumes,
128 FRDGTextureRef OutViewOccupancy,
129 FRDGTextureRef OutLightOccupancy,
130 const FIntPoint& TileCount,
131 uint32 StepSliceCount,
132 const FVector3f& LightDirection,
133 float MaxLightMarchDistance,
134 const FIntPoint& ViewportSize)
136 FGlobalShaderMap* ShaderMap = GetGlobalShaderMap(View.FeatureLevel);
137 TShaderMapRef<FIVSmokeOccupancyBuildCS> ComputeShader(ShaderMap);
139 auto* Parameters = GraphBuilder.AllocParameters<FIVSmokeOccupancyBuildCS::FParameters>();
142 Parameters->TileDataBuffer = GraphBuilder.CreateSRV(TileDataBuffer);
143 Parameters->VolumeDataBuffer = GraphBuilder.CreateSRV(VolumeDataBuffer);
144 Parameters->NumActiveVolumes = NumActiveVolumes;
147 Parameters->ViewOccupancyRW = GraphBuilder.CreateUAV(OutViewOccupancy);
148 Parameters->LightOccupancyRW = GraphBuilder.CreateUAV(OutLightOccupancy);
151 Parameters->TileCount = TileCount;
152 Parameters->StepSliceCount = StepSliceCount;
156 const FViewMatrices& ViewMatrices = View.ViewMatrices;
157 Parameters->CameraPosition = FVector3f(ViewMatrices.GetViewOrigin());
158 Parameters->CameraForward = FVector3f(View.GetViewDirection());
159 Parameters->CameraRight = FVector3f(View.GetViewRight());
160 Parameters->CameraUp = FVector3f(View.GetViewUp());
162 const FMatrix& ProjMatrix = ViewMatrices.GetProjectionMatrix();
163 float ProjM11 = ProjMatrix.M[1][1];
166 if (FMath::IsNearlyZero(ProjM11, 1e-6f) || !FMath::IsFinite(ProjM11))
168 UE_LOG(LogIVSmoke, Error, TEXT(
"[OccupancyBuild] Invalid ProjMatrix.M[1][1] = %f (likely orthographic viewport), skipping"), ProjM11);
172 Parameters->TanHalfFOV = 1.0f / ProjM11;
173 Parameters->AspectRatio = (float)ViewportSize.X / (
float)ViewportSize.Y;
176 Parameters->LightDirection = LightDirection;
177 Parameters->MaxLightMarchDistance = MaxLightMarchDistance;
180 FIntVector GroupCount(
181 FMath::DivideAndRoundUp((uint32)TileCount.X, FIVSmokeOccupancyBuildCS::ThreadGroupSizeX),
182 FMath::DivideAndRoundUp((uint32)TileCount.Y, FIVSmokeOccupancyBuildCS::ThreadGroupSizeY),
183 FMath::DivideAndRoundUp(StepSliceCount, FIVSmokeOccupancyBuildCS::ThreadGroupSizeZ)
186 FComputeShaderUtils::AddPass(
188 RDG_EVENT_NAME(
"IVSmoke::OccupancyBuild (%dx%dx%d)", TileCount.X, TileCount.Y, StepSliceCount),
199 FRDGBuilder& GraphBuilder,
200 const FIntPoint& TileCount,
201 uint32 StepSliceCount)
206 const uint32 TileDataCount = TileCount.X * TileCount.Y;
207 FRDGBufferDesc TileDataDesc = FRDGBufferDesc::CreateStructuredDesc(
sizeof(
FIVSmokeTileData), TileDataCount);
208 Resources.
TileDataBuffer = GraphBuilder.CreateBuffer(TileDataDesc, TEXT(
"IVSmoke.TileData"));
211 FRDGTextureDesc OccupancyDesc = FRDGTextureDesc::Create3D(
212 FIntVector(TileCount.X, TileCount.Y, StepSliceCount),
213 PF_R32G32B32A32_UINT,
214 FClearValueBinding::Black,
215 ETextureCreateFlags::UAV | ETextureCreateFlags::ShaderResource
217 Resources.
ViewOccupancy = GraphBuilder.CreateTexture(OccupancyDesc, TEXT(
"IVSmoke.ViewOccupancy"));
218 Resources.
LightOccupancy = GraphBuilder.CreateTexture(OccupancyDesc, TEXT(
"IVSmoke.LightOccupancy"));
232FIVSmokeOccupancyResources::FIVSmokeOccupancyResources()
233 : TileDataBuffer(nullptr)
234 , ViewOccupancy(nullptr)
235 , LightOccupancy(nullptr)
241bool FIVSmokeOccupancyResources::IsValid()
const
static constexpr uint32 TileSizeX
static constexpr uint32 StepDivisor
FRDGTextureRef LightOccupancy
FRDGBufferRef TileDataBuffer
FRDGTextureRef ViewOccupancy