Files
UnrealEngine/Engine/Source/Runtime/Renderer/Private/GenerateConservativeDepthBuffer.cpp
2025-05-18 13:04:45 +08:00

68 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
GenerateConservativeDepth.cpp
=============================================================================*/
#include "GenerateConservativeDepthBuffer.h"
#include "SceneRendering.h"
#include "DataDrivenShaderPlatformInfo.h"
class FGenerateConservativeDepthBufferCS : public FGlobalShader
{
DECLARE_GLOBAL_SHADER(FGenerateConservativeDepthBufferCS);
SHADER_USE_PARAMETER_STRUCT(FGenerateConservativeDepthBufferCS, FGlobalShader);
using FPermutationDomain = TShaderPermutationDomain<>;
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
SHADER_PARAMETER_STRUCT_REF(FViewUniformShaderParameters, ViewUniformBuffer)
SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2D<float>, ConservativeDepthTextureUAV)
SHADER_PARAMETER(FIntPoint, ConservativeDepthTextureSize)
SHADER_PARAMETER(int32, DestinationPixelSizeAtFullRes)
SHADER_PARAMETER_STRUCT_INCLUDE(FHZBParameters, HZBParameters)
END_SHADER_PARAMETER_STRUCT()
public:
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters) { return IsFeatureLevelSupported(Parameters.Platform, ERHIFeatureLevel::SM5); }
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
}
};
IMPLEMENT_GLOBAL_SHADER(FGenerateConservativeDepthBufferCS, "/Engine/Private/GenerateConservativeDepth.usf", "GenerateConservativeDepthBufferCS", SF_Compute);
void AddGenerateConservativeDepthBufferPass(FViewInfo& View, FRDGBuilder& GraphBuilder, FRDGTextureRef ConservativeDepthTexture, int32 DestinationPixelSizeAtFullRes)
{
if (View.HZB)
{
FGenerateConservativeDepthBufferCS::FPermutationDomain Permutation;
TShaderMapRef<FGenerateConservativeDepthBufferCS> ComputeShader(GetGlobalShaderMap(View.GetFeatureLevel()), Permutation);
FIntVector ConservativeDepthTextureSize3D = ConservativeDepthTexture->Desc.GetSize();
FIntPoint ConservativeDepthTextureSize = FIntPoint(ConservativeDepthTextureSize3D.X, ConservativeDepthTextureSize3D.Y);
FGenerateConservativeDepthBufferCS::FParameters* Parameters = GraphBuilder.AllocParameters<FGenerateConservativeDepthBufferCS::FParameters>();
Parameters->ViewUniformBuffer = View.ViewUniformBuffer;
Parameters->ConservativeDepthTextureUAV = GraphBuilder.CreateUAV(FRDGTextureUAVDesc(ConservativeDepthTexture));
Parameters->ConservativeDepthTextureSize = ConservativeDepthTextureSize;
Parameters->DestinationPixelSizeAtFullRes = DestinationPixelSizeAtFullRes;
Parameters->HZBParameters = GetHZBParameters(GraphBuilder, View, EHZBType::FurthestHZB);
const FIntVector DispatchCount = DispatchCount.DivideAndRoundUp(FIntVector(ConservativeDepthTextureSize.X, ConservativeDepthTextureSize.Y, 1), FIntVector(8, 8, 1));
FComputeShaderUtils::AddPass(
GraphBuilder, RDG_EVENT_NAME("GenerateConservativeDepthBuffer"),
ComputeShader, Parameters, DispatchCount);
}
else
{
// Clear to far distance
AddClearRenderTargetPass(GraphBuilder, ConservativeDepthTexture, FLinearColor::Black);
}
}