Files
UnrealEngineUWP/Engine/Source/Runtime/Renderer/Public/GlobalDistanceFieldParameters.h
daniel wright abe8a7e6c3 Global Distance Field:
* Creates a half res Coverage atlas when Lumen is active, which tracks whether the region in space is occupied by two sided materials (foliage), which then get a smaller surface expand to reduce over-occlusion
* r.LumenScene.GlobalSDF.FullyCoveredExpandSurfaceScale, r.LumenScene.GlobalSDF.UncoveredExpandSurfaceScale
* A larger MinStepSize is used in two sided regions to accelerate tracing: r.LumenScene.GlobalSDF.UncoveredMinStepScale

Radiance Cache:
* Fixed allocator overflow corrupting the cache
* Probes placed for foliage trace at the lowest resolution

Screen Probe Gather:
* Two Sided Foliage shading interpolates from Screen Probes a second time using the backfacing normal

Radiosity:
 * Ray directions are generated off of CardCoord instead of AtlasCoord, fixing a source of non-determinism

3.66ms   DiffuseIndirectAndAO -> 3.73ms in a scene with no foliage
4.71ms   DiffuseIndirectAndAO -> 6.05ms in a scene with heavy foliage, because fixing over-occlusion makes traces cost more

#preflight 621d89e5814dfc80784f1028
#jira UE-141204
#rb Krzysztof.Narkowicz
#lockdown Juan.Canada

#ROBOMERGE-AUTHOR: daniel.wright
#ROBOMERGE-SOURCE: CL 19201289 in //UE5/Release-5.0/... via CL 19201886
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v921-19075845)

[CL 19214930 by daniel wright in ue5-main branch]
2022-03-01 21:07:45 -05:00

163 lines
8.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
GlobalDistanceFieldParameters.h
=============================================================================*/
#pragma once
#include "CoreMinimal.h"
#include "ShaderParameterMacros.h"
#include "ShaderParameters.h"
#include "RenderUtils.h"
#include "RHIStaticStates.h"
class FShaderParameterMap;
/** Must match global distance field shaders. */
const int32 GMaxGlobalDistanceFieldClipmaps = 6;
class FGlobalDistanceFieldParameterData
{
public:
FGlobalDistanceFieldParameterData()
{
FPlatformMemory::Memzero(this, sizeof(FGlobalDistanceFieldParameterData));
}
FVector4f CenterAndExtent[GMaxGlobalDistanceFieldClipmaps];
FVector4f WorldToUVAddAndMul[GMaxGlobalDistanceFieldClipmaps];
FVector4f MipWorldToUVScale[GMaxGlobalDistanceFieldClipmaps];
FVector4f MipWorldToUVBias[GMaxGlobalDistanceFieldClipmaps];
float MipFactor;
float MipTransition;
FRHITexture* PageAtlasTexture;
FRHITexture* CoverageAtlasTexture;
FRHITexture* PageTableTexture;
FRHITexture* MipTexture;
int32 ClipmapSizeInPages;
FVector InvPageAtlasSize;
FVector InvCoverageAtlasSize;
int32 MaxPageNum;
float GlobalDFResolution;
float MaxDFAOConeDistance;
int32 NumGlobalSDFClipmaps;
};
BEGIN_SHADER_PARAMETER_STRUCT(FGlobalDistanceFieldParameters2, )
SHADER_PARAMETER_TEXTURE(Texture3D, GlobalDistanceFieldPageAtlasTexture)
SHADER_PARAMETER_TEXTURE(Texture3D, GlobalDistanceFieldCoverageAtlasTexture)
SHADER_PARAMETER_TEXTURE(Texture3D<uint>, GlobalDistanceFieldPageTableTexture)
SHADER_PARAMETER_TEXTURE(Texture3D, GlobalDistanceFieldMipTexture)
SHADER_PARAMETER_ARRAY(FVector4f, GlobalVolumeCenterAndExtent, [GMaxGlobalDistanceFieldClipmaps])
SHADER_PARAMETER_ARRAY(FVector4f, GlobalVolumeWorldToUVAddAndMul, [GMaxGlobalDistanceFieldClipmaps])
SHADER_PARAMETER_ARRAY(FVector4f, GlobalDistanceFieldMipWorldToUVScale, [GMaxGlobalDistanceFieldClipmaps])
SHADER_PARAMETER_ARRAY(FVector4f, GlobalDistanceFieldMipWorldToUVBias, [GMaxGlobalDistanceFieldClipmaps])
SHADER_PARAMETER(float, GlobalDistanceFieldMipFactor)
SHADER_PARAMETER(float, GlobalDistanceFieldMipTransition)
SHADER_PARAMETER(int32, GlobalDistanceFieldClipmapSizeInPages)
SHADER_PARAMETER(FVector3f, GlobalDistanceFieldInvPageAtlasSize)
SHADER_PARAMETER(FVector3f, GlobalDistanceFieldInvCoverageAtlasSize)
SHADER_PARAMETER(float, GlobalVolumeDimension)
SHADER_PARAMETER(float, GlobalVolumeTexelSize)
SHADER_PARAMETER(float, MaxGlobalDFAOConeDistance)
SHADER_PARAMETER(uint32, NumGlobalSDFClipmaps)
SHADER_PARAMETER(float, FullyCoveredExpandSurfaceScale)
SHADER_PARAMETER(float, UncoveredExpandSurfaceScale)
SHADER_PARAMETER(float, UncoveredMinStepScale)
END_SHADER_PARAMETER_STRUCT()
FGlobalDistanceFieldParameters2 SetupGlobalDistanceFieldParameters(const FGlobalDistanceFieldParameterData& ParameterData);
class FGlobalDistanceFieldParameters
{
DECLARE_INLINE_TYPE_LAYOUT(FGlobalDistanceFieldParameters, NonVirtual);
public:
void Bind(const FShaderParameterMap& ParameterMap)
{
GlobalDistanceFieldPageAtlasTexture.Bind(ParameterMap, TEXT("GlobalDistanceFieldPageAtlasTexture"));
GlobalDistanceFieldPageTableTexture.Bind(ParameterMap, TEXT("GlobalDistanceFieldPageTableTexture"));
GlobalDistanceFieldMipTexture.Bind(ParameterMap, TEXT("GlobalDistanceFieldMipTexture"));
GlobalDistanceFieldMipFactor.Bind(ParameterMap, TEXT("GlobalDistanceFieldMipFactor"));
GlobalDistanceFieldMipTransition.Bind(ParameterMap, TEXT("GlobalDistanceFieldMipTransition"));
GlobalVolumeCenterAndExtent.Bind(ParameterMap, TEXT("GlobalVolumeCenterAndExtent"));
GlobalVolumeWorldToUVAddAndMul.Bind(ParameterMap, TEXT("GlobalVolumeWorldToUVAddAndMul"));
GlobalDistanceFieldMipWorldToUVScale.Bind(ParameterMap, TEXT("GlobalDistanceFieldMipWorldToUVScale"));
GlobalDistanceFieldMipWorldToUVBias.Bind(ParameterMap, TEXT("GlobalDistanceFieldMipWorldToUVBias"));
GlobalDistanceFieldClipmapSizeInPages.Bind(ParameterMap, TEXT("GlobalDistanceFieldClipmapSizeInPages"));
GlobalDistanceFieldInvPageAtlasSize.Bind(ParameterMap, TEXT("GlobalDistanceFieldInvPageAtlasSize"));
GlobalVolumeDimension.Bind(ParameterMap,TEXT("GlobalVolumeDimension"));
GlobalVolumeTexelSize.Bind(ParameterMap,TEXT("GlobalVolumeTexelSize"));
MaxGlobalDFAOConeDistance.Bind(ParameterMap,TEXT("MaxGlobalDFAOConeDistance"));
NumGlobalSDFClipmaps.Bind(ParameterMap,TEXT("NumGlobalSDFClipmaps"));
}
bool IsBound() const
{
return GlobalVolumeCenterAndExtent.IsBound() || GlobalVolumeWorldToUVAddAndMul.IsBound();
}
friend FArchive& operator<<(FArchive& Ar,FGlobalDistanceFieldParameters& Parameters)
{
Ar << Parameters.GlobalDistanceFieldPageAtlasTexture;
Ar << Parameters.GlobalDistanceFieldPageTableTexture;
Ar << Parameters.GlobalDistanceFieldMipTexture;
Ar << Parameters.GlobalVolumeCenterAndExtent;
Ar << Parameters.GlobalVolumeWorldToUVAddAndMul;
Ar << Parameters.GlobalDistanceFieldMipWorldToUVScale;
Ar << Parameters.GlobalDistanceFieldMipWorldToUVBias;
Ar << Parameters.GlobalDistanceFieldMipFactor;
Ar << Parameters.GlobalDistanceFieldMipTransition;
Ar << Parameters.GlobalDistanceFieldClipmapSizeInPages;
Ar << Parameters.GlobalDistanceFieldInvPageAtlasSize;
Ar << Parameters.GlobalVolumeDimension;
Ar << Parameters.GlobalVolumeTexelSize;
Ar << Parameters.MaxGlobalDFAOConeDistance;
Ar << Parameters.NumGlobalSDFClipmaps;
return Ar;
}
template<typename ShaderRHIParamRef>
FORCEINLINE_DEBUGGABLE void Set(FRHICommandList& RHICmdList, const ShaderRHIParamRef ShaderRHI, const FGlobalDistanceFieldParameterData& ParameterData) const
{
if (IsBound())
{
SetTextureParameter(RHICmdList, ShaderRHI, GlobalDistanceFieldPageAtlasTexture, ParameterData.PageAtlasTexture ? ParameterData.PageAtlasTexture : GBlackVolumeTexture->TextureRHI.GetReference());
SetTextureParameter(RHICmdList, ShaderRHI, GlobalDistanceFieldPageTableTexture, ParameterData.PageTableTexture ? ParameterData.PageTableTexture : GBlackVolumeTexture->TextureRHI.GetReference());
SetTextureParameter(RHICmdList, ShaderRHI, GlobalDistanceFieldMipTexture, ParameterData.MipTexture ? ParameterData.MipTexture : GBlackVolumeTexture->TextureRHI.GetReference());
SetShaderValueArray(RHICmdList, ShaderRHI, GlobalVolumeCenterAndExtent, ParameterData.CenterAndExtent, GMaxGlobalDistanceFieldClipmaps);
SetShaderValueArray(RHICmdList, ShaderRHI, GlobalVolumeWorldToUVAddAndMul, ParameterData.WorldToUVAddAndMul, GMaxGlobalDistanceFieldClipmaps);
SetShaderValueArray(RHICmdList, ShaderRHI, GlobalDistanceFieldMipWorldToUVScale, ParameterData.MipWorldToUVScale, GMaxGlobalDistanceFieldClipmaps);
SetShaderValueArray(RHICmdList, ShaderRHI, GlobalDistanceFieldMipWorldToUVBias, ParameterData.MipWorldToUVBias, GMaxGlobalDistanceFieldClipmaps);
SetShaderValue(RHICmdList, ShaderRHI, GlobalDistanceFieldMipFactor, ParameterData.MipFactor);
SetShaderValue(RHICmdList, ShaderRHI, GlobalDistanceFieldMipTransition, ParameterData.MipTransition);
SetShaderValue(RHICmdList, ShaderRHI, GlobalDistanceFieldClipmapSizeInPages, ParameterData.ClipmapSizeInPages);
SetShaderValue(RHICmdList, ShaderRHI, GlobalDistanceFieldInvPageAtlasSize, (FVector3f)ParameterData.InvPageAtlasSize);
SetShaderValue(RHICmdList, ShaderRHI, GlobalVolumeDimension, ParameterData.GlobalDFResolution);
SetShaderValue(RHICmdList, ShaderRHI, GlobalVolumeTexelSize, 1.0f / ParameterData.GlobalDFResolution);
SetShaderValue(RHICmdList, ShaderRHI, MaxGlobalDFAOConeDistance, ParameterData.MaxDFAOConeDistance);
SetShaderValue(RHICmdList, ShaderRHI, NumGlobalSDFClipmaps, ParameterData.NumGlobalSDFClipmaps);
}
}
private:
LAYOUT_FIELD(FShaderResourceParameter, GlobalDistanceFieldPageAtlasTexture)
LAYOUT_FIELD(FShaderResourceParameter, GlobalDistanceFieldPageTableTexture)
LAYOUT_FIELD(FShaderResourceParameter, GlobalDistanceFieldMipTexture)
LAYOUT_FIELD(FShaderParameter, GlobalVolumeCenterAndExtent)
LAYOUT_FIELD(FShaderParameter, GlobalVolumeWorldToUVAddAndMul)
LAYOUT_FIELD(FShaderParameter, GlobalDistanceFieldMipWorldToUVScale)
LAYOUT_FIELD(FShaderParameter, GlobalDistanceFieldMipWorldToUVBias)
LAYOUT_FIELD(FShaderParameter, GlobalDistanceFieldMipFactor)
LAYOUT_FIELD(FShaderParameter, GlobalDistanceFieldMipTransition)
LAYOUT_FIELD(FShaderParameter, GlobalDistanceFieldClipmapSizeInPages)
LAYOUT_FIELD(FShaderParameter, GlobalDistanceFieldInvPageAtlasSize)
LAYOUT_FIELD(FShaderParameter, GlobalVolumeDimension)
LAYOUT_FIELD(FShaderParameter, GlobalVolumeTexelSize)
LAYOUT_FIELD(FShaderParameter, MaxGlobalDFAOConeDistance)
LAYOUT_FIELD(FShaderParameter, NumGlobalSDFClipmaps)
};