// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreTypes.h" #include "ConvexVolume.h" #include "RendererInterface.h" #include "ShaderParameterMacros.h" #include "HeterogeneousVolumeInterface.h" class FLightSceneInfo; class FPrimitiveSceneProxy; class FProjectedShadowInfo; class FRayTracingScene; class FRDGBuilder; class FScene; class FSceneView; class FSceneViewState; class FViewInfo; class FVirtualShadowMapArray; class FVisibleLightInfo; class IHeterogeneousVolumeInterface; struct FMaterialShaderParameters; struct FRDGTextureDesc; struct FSceneTextures; struct FPersistentPrimitiveIndex; struct FVolumetricMeshBatch; // // External API // bool ShouldRenderHeterogeneousVolumes(const FScene* Scene); bool ShouldRenderHeterogeneousVolumesForAnyView(const TArrayView& Views); bool ShouldRenderHeterogeneousVolumesForView(const FViewInfo& View); bool ShouldRenderHeterogeneousVolumesAsHoldoutForView(const FViewInfo& View); bool ShouldRenderHeterogeneousVolumesForView(const TArrayView& Views, int32 ViewIndex); bool DoesMaterialShaderSupportHeterogeneousVolumes(const FMaterialShaderParameters& Parameters); bool DoesMaterialShaderSupportHeterogeneousVolumes(const FMaterial& Material); bool ShouldRenderMeshBatchWithHeterogeneousVolumes( const FMeshBatch* Mesh, const FPrimitiveSceneProxy* Proxy, ERHIFeatureLevel::Type FeatureLevel ); bool ShouldCompositeHeterogeneousVolumesWithTranslucency(); bool ShouldHeterogeneousVolumesCastShadows(); enum class EHeterogeneousVolumesCompositionType : uint8 { BeforeTranslucent, AfterTranslucent }; EHeterogeneousVolumesCompositionType GetHeterogeneousVolumesComposition(); // // Internal API // namespace HeterogeneousVolumes { // CVars FIntVector GetVolumeResolution(const IHeterogeneousVolumeInterface*); int32 GetDownsampleFactor(); FIntPoint GetDownsampledResolution(FIntPoint Resolution, int32 DownsampleFactor); FIntPoint GetScaledViewRect(FIntRect ViewRect); float GetShadowStepSize(); float GetMaxTraceDistance(); float GetMaxShadowTraceDistance(); float GetStepSize(); float GetMaxStepCount(); float GetMinimumVoxelSizeInFrustum(); float GetMinimumVoxelSizeOutsideFrustum(); float GetShadingRateForFrustumGrid(); float GetShadingRateForOrthoGrid(); enum class EScalabilityMode { Low, High, Epic, Cinematic }; EScalabilityMode GetScalabilityMode(); // Shadow generation enum class EShadowMode { LiveShading, VoxelGrid }; EShadowMode GetShadowMode(); FIntPoint GetShadowMapResolution(); float GetShadingRateForShadows(); float GetOutOfFrustumShadingRateForShadows(); bool EnableJitterForShadows(); float GetStepSizeForShadows(); uint32 GetShadowMaxSampleCount(); float GetShadowAbsoluteErrorThreshold(); float GetShadowRelativeErrorThreshold(); bool UseAVSMCompression(); float GetCameraDownsampleFactor(); float GetIndirectLightingFactor(); enum class EIndirectLightingMode { Disabled, LightingCachePass, SingleScatteringPass }; EIndirectLightingMode GetIndirectLightingMode(); // Translucency compositing enum class ETranslucencyCompositingMode { Disabled, VolumetricShadowMap, BeerShadowMap }; ETranslucencyCompositingMode GetTranslucencyCompositingMode(); int32 GetMipLevel(); int32 GetDebugMode(); int32 GetLightingCacheMode(); uint32 GetSparseVoxelMipBias(); int32 GetBottomLevelGridResolution(); int32 GetIndirectionGridResolution(); enum class EStochasticFilteringMode { Disabled, Constant, Linear, Cubic }; EStochasticFilteringMode GetStochasticFilteringMode(); bool ShouldJitter(); bool ShouldRefineSparseVoxels(); bool UseHardwareRayTracing(); bool UseIndirectLighting(); bool UseSparseVoxelPipeline(); bool UseSparseVoxelPerTileCulling(); bool UseLightingCacheForInscattering(); bool UseLightingCacheForTransmittance(); bool UseAdaptiveVolumetricShadowMapForSelfShadowing(const FPrimitiveSceneProxy* PrimitiveSceneProxy); bool ShouldApplyHeightFog(); bool ShouldApplyVolumetricFog(); bool SupportsOverlappingVolumes(); bool EnableAmbientOcclusion(); bool UseExistenceMask(); bool UseAnalyticDerivatives(); bool SupportsLightType(uint32 LightType); bool SupportsShadowForLightType(uint32 LightType); enum class EFogMode { Disabled, Reference, LinearApprox }; EFogMode GetFogInscatteringMode(); bool ShouldWriteVelocity(); bool EnableIndirectionGrid(); bool EnableLinearInterpolation(); // Convenience Utils int GetVoxelCount(FIntVector VolumeResolution); int GetVoxelCount(const FRDGTextureDesc& TextureDesc); FIntVector GetMipVolumeResolution(FIntVector VolumeResolution, uint32 MipLevel); struct FLODInfo { // Orthographic projection FBoxSphereBounds WorldSceneBounds = FBoxSphereBounds(EForceInit::ForceInit); // Perspective projection FVector WorldOrigin = FVector::ZeroVector; FIntRect ViewRect; FConvexVolume WorldShadowFrustum; float FOV = PI / 4.0f; float NearClippingDistance = 1.0f; float DownsampleFactor = 1.0f; // Projection type bool bIsPerspective = false; }; struct FLODValue { float LOD = 0.0f; float Bias = 0.0f; }; FLODValue CalcLOD(const HeterogeneousVolumes::FLODInfo& LODInfo, const IHeterogeneousVolumeInterface* HeterogeneousVolume); FLODValue CalcLOD(const FSceneView& View, const IHeterogeneousVolumeInterface* HeterogeneousVolume); FIntVector GetLightingCacheResolution(const IHeterogeneousVolumeInterface*, FLODValue LODValue); FIntVector GetAmbientOcclusionResolution(const IHeterogeneousVolumeInterface*, FLODValue LODValue); float CalcLODBias(const IHeterogeneousVolumeInterface* HeterogeneousVolume); float CalcLODFactor(float LODValue, float LODBias); float CalcLODFactor(const HeterogeneousVolumes::FLODInfo& LODInfo, const IHeterogeneousVolumeInterface* HeterogeneousVolume); float CalcLODFactor(const FSceneView& View, const IHeterogeneousVolumeInterface* HeterogeneousVolume); bool IsHoldout(const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface); const FProjectedShadowInfo* GetProjectedShadowInfo(const FVisibleLightInfo* VisibleLightInfo, int32 ShadowIndex); bool IsDynamicShadow(const FVisibleLightInfo* VisibleLightInfo); } uint32 GetTypeHash(const FVolumetricMeshBatch& MeshBatch); struct FVoxelDataPacked { uint32 LinearIndex; uint32 MipLevel; }; BEGIN_UNIFORM_BUFFER_STRUCT(FSparseVoxelUniformBufferParameters, ) // Object data SHADER_PARAMETER(FMatrix44f, LocalToWorld) SHADER_PARAMETER(FMatrix44f, WorldToLocal) SHADER_PARAMETER(FVector3f, LocalBoundsOrigin) SHADER_PARAMETER(FVector3f, LocalBoundsExtent) // Volume data SHADER_PARAMETER(FIntVector, VolumeResolution) SHADER_PARAMETER_RDG_TEXTURE(Texture3D, ExtinctionTexture) SHADER_PARAMETER_RDG_TEXTURE(Texture3D, EmissionTexture) SHADER_PARAMETER_RDG_TEXTURE(Texture3D, AlbedoTexture) SHADER_PARAMETER_SAMPLER(SamplerState, TextureSampler) // Resolution SHADER_PARAMETER(FIntVector, LightingCacheResolution) // Sparse voxel data SHADER_PARAMETER_RDG_BUFFER_SRV(Buffer, NumVoxelsBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, VoxelBuffer) SHADER_PARAMETER(int, MipLevel) // Traversal hints SHADER_PARAMETER(float, MaxTraceDistance) SHADER_PARAMETER(float, MaxShadowTraceDistance) SHADER_PARAMETER(float, StepSize) SHADER_PARAMETER(float, StepFactor) SHADER_PARAMETER(float, ShadowStepSize) SHADER_PARAMETER(float, ShadowStepFactor) SHADER_PARAMETER(float, IndirectInscatteringFactor) SHADER_PARAMETER(int, bApplyHeightFog) SHADER_PARAMETER(int, bApplyVolumetricFog) END_UNIFORM_BUFFER_STRUCT() BEGIN_SHADER_PARAMETER_STRUCT(FLightingCacheParameters, ) SHADER_PARAMETER(FIntVector, LightingCacheResolution) SHADER_PARAMETER(float, LightingCacheVoxelBias) SHADER_PARAMETER_RDG_TEXTURE(Texture3D, LightingCacheTexture) END_SHADER_PARAMETER_STRUCT() // Adaptive Voxel Grid structures struct FTopLevelGridBitmaskData { uint32 PackedData[2]; }; struct FTopLevelGridData { uint32 PackedData[1]; }; struct FScalarGridData { uint32 PackedData[2]; }; struct FVectorGridData { uint32 PackedData[2]; }; BEGIN_UNIFORM_BUFFER_STRUCT(FOrthoVoxelGridUniformBufferParameters, ) SHADER_PARAMETER(FVector3f, TopLevelGridWorldBoundsMin) SHADER_PARAMETER(FVector3f, TopLevelGridWorldBoundsMax) SHADER_PARAMETER(FIntVector, TopLevelGridResolution) SHADER_PARAMETER(int32, bUseOrthoGrid) SHADER_PARAMETER(int32, bUseMajorantGrid) SHADER_PARAMETER(int32, bEnableIndirectionGrid) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, TopLevelGridBitmaskBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, TopLevelGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, IndirectionGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, ExtinctionGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, EmissionGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, ScatteringGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, MajorantGridBuffer) END_UNIFORM_BUFFER_STRUCT() BEGIN_UNIFORM_BUFFER_STRUCT(FFrustumVoxelGridUniformBufferParameters, ) SHADER_PARAMETER(FMatrix44f, WorldToClip) SHADER_PARAMETER(FMatrix44f, ClipToWorld) SHADER_PARAMETER(FMatrix44f, WorldToView) SHADER_PARAMETER(FMatrix44f, ViewToWorld) SHADER_PARAMETER(FMatrix44f, ViewToClip) SHADER_PARAMETER(FMatrix44f, ClipToView) SHADER_PARAMETER(FVector3f, TopLevelGridWorldBoundsMin) SHADER_PARAMETER(FVector3f, TopLevelGridWorldBoundsMax) SHADER_PARAMETER(FIntVector, TopLevelFroxelGridResolution) SHADER_PARAMETER(FIntVector, VoxelDimensions) SHADER_PARAMETER(int32, bUseFrustumGrid) SHADER_PARAMETER(float, NearPlaneDepth) SHADER_PARAMETER(float, FarPlaneDepth) SHADER_PARAMETER(float, TanHalfFOV) SHADER_PARAMETER_ARRAY(FVector4f, ViewFrustumPlanes, [6]) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, TopLevelFroxelGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, ExtinctionFroxelGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, EmissionFroxelGridBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, ScatteringFroxelGridBuffer) END_UNIFORM_BUFFER_STRUCT() // Render specializations enum class EHeterogeneousVolumesShadowMode { LiveShading, VoxelGrid }; enum class EVoxelGridBuildMode { PathTracing, Shadows, }; struct FVoxelGridBuildOptions { EVoxelGridBuildMode VoxelGridBuildMode = EVoxelGridBuildMode::PathTracing; float ShadingRateInFrustum = HeterogeneousVolumes::GetShadingRateForFrustumGrid(); float ShadingRateOutOfFrustum = HeterogeneousVolumes::GetShadingRateForOrthoGrid(); bool bBuildOrthoGrid = true; bool bBuildFrustumGrid = true; bool bUseProjectedPixelSizeForOrthoGrid = false; bool bJitter = HeterogeneousVolumes::ShouldJitter(); }; void BuildOrthoVoxelGrid( FRDGBuilder& GraphBuilder, const FScene* Scene, /*const*/ TArray& Views, const TArray& VisibleLightInfos, const FVoxelGridBuildOptions& BuildOptions, TRDGUniformBufferRef& OrthoVoxelGridUniformBuffer ); void BuildFrustumVoxelGrid( FRDGBuilder& GraphBuilder, const FScene* Scene, const FViewInfo& View, const FVoxelGridBuildOptions& BuildOptions, TRDGUniformBufferRef& FrustumVoxelGridUniformBuffer ); struct FAdaptiveFrustumGridParameterCache { FMatrix44f WorldToClip; FMatrix44f ClipToWorld; FMatrix44f WorldToView; FMatrix44f ViewToWorld; FMatrix44f ViewToClip; FMatrix44f ClipToView; FVector3f TopLevelGridWorldBoundsMin; FVector3f TopLevelGridWorldBoundsMax; FIntVector TopLevelGridResolution; FIntVector VoxelDimensions; int32 bUseFrustumGrid = false; float NearPlaneDepth; float FarPlaneDepth; float TanHalfFOV; FVector4f ViewFrustumPlanes[6]; TRefCountPtr TopLevelGridBuffer; TRefCountPtr ExtinctionGridBuffer; TRefCountPtr EmissionGridBuffer; TRefCountPtr ScatteringGridBuffer; }; struct FAdaptiveOrthoGridParameterCache { FVector3f TopLevelGridWorldBoundsMin; FVector3f TopLevelGridWorldBoundsMax; FIntVector TopLevelGridResolution; int32 bUseOrthoGrid = false; int32 bUseMajorantGrid; int32 bEnableIndirectionGrid; TRefCountPtr TopLevelGridBitmaskBuffer; TRefCountPtr TopLevelGridBuffer; TRefCountPtr IndirectionGridBuffer; TRefCountPtr ExtinctionGridBuffer; TRefCountPtr EmissionGridBuffer; TRefCountPtr ScatteringGridBuffer; TRefCountPtr MajorantGridBuffer; }; void ExtractFrustumVoxelGridUniformBuffer( FRDGBuilder& GraphBuilder, const TRDGUniformBufferRef& FrustumGridUniformBuffer, FAdaptiveFrustumGridParameterCache& AdaptiveFrustumGridParameterCache ); void RegisterExternalFrustumVoxelGridUniformBuffer( FRDGBuilder& GraphBuilder, const FAdaptiveFrustumGridParameterCache& AdaptiveFrustumGridParameterCache, TRDGUniformBufferRef& FrustumGridUniformBuffer ); void ExtractOrthoVoxelGridUniformBuffer( FRDGBuilder& GraphBuilder, const TRDGUniformBufferRef& OrthoGridUniformBuffer, FAdaptiveOrthoGridParameterCache& AdaptiveOrthoGridParameterCache ); void RegisterExternalOrthoVoxelGridUniformBuffer( FRDGBuilder& GraphBuilder, const FAdaptiveOrthoGridParameterCache& AdaptiveOrthoGridParameterCache, TRDGUniformBufferRef& OrthoGridUniformBuffer ); struct FAVSMLinkedListPackedData { uint32 Data[2]; }; struct FAVSMIndirectionPackedData { uint32 Data[4]; }; struct FAVSMSamplePackedData { uint32 Data; }; BEGIN_UNIFORM_BUFFER_STRUCT(FAdaptiveVolumetricShadowMapUniformBufferParameters, ) SHADER_PARAMETER_ARRAY(FMatrix44f, TranslatedWorldToShadow, [6]) SHADER_PARAMETER(FVector3f, TranslatedWorldOrigin) SHADER_PARAMETER(FVector4f, TranslatedWorldPlane) SHADER_PARAMETER(FIntPoint, Resolution) SHADER_PARAMETER(int32, NumShadowMatrices) SHADER_PARAMETER(int32, MaxSampleCount) SHADER_PARAMETER(int32, bIsEmpty) SHADER_PARAMETER(int32, bIsDirectionalLight) SHADER_PARAMETER(float, DownsampleFactor) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, LinkedListBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, IndirectionBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, SampleBuffer) SHADER_PARAMETER_RDG_TEXTURE_SRV(Texture2D, RadianceTexture) SHADER_PARAMETER_SAMPLER(SamplerState, TextureSampler) END_UNIFORM_BUFFER_STRUCT() BEGIN_SHADER_PARAMETER_STRUCT(FAdaptiveVolumetricShadowMapParameters, RENDERER_API) SHADER_PARAMETER_ARRAY(FMatrix44f, TranslatedWorldToShadow, [6]) SHADER_PARAMETER(FVector3f, TranslatedWorldOrigin) SHADER_PARAMETER(FVector4f, TranslatedWorldPlane) SHADER_PARAMETER(FIntPoint, Resolution) SHADER_PARAMETER(int32, NumShadowMatrices) SHADER_PARAMETER(int32, MaxSampleCount) SHADER_PARAMETER(int32, bIsEmpty) SHADER_PARAMETER(int32, bIsDirectionalLight) SHADER_PARAMETER(float, DownsampleFactor) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, LinkedListBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, IndirectionBuffer) SHADER_PARAMETER_RDG_BUFFER_SRV(StructuredBuffer, SampleBuffer) SHADER_PARAMETER_RDG_TEXTURE_SRV(Texture2D, RadianceTexture) SHADER_PARAMETER_SAMPLER(SamplerState, TextureSampler) END_SHADER_PARAMETER_STRUCT() BEGIN_UNIFORM_BUFFER_STRUCT(FAdaptiveVolumetricShadowMaps, ) SHADER_PARAMETER_STRUCT(FAdaptiveVolumetricShadowMapParameters, AVSM) SHADER_PARAMETER_STRUCT(FAdaptiveVolumetricShadowMapParameters, CameraAVSM) END_UNIFORM_BUFFER_STRUCT() namespace HeterogeneousVolumes { TRDGUniformBufferRef GetAdaptiveVolumetricShadowMapUniformBuffer( FRDGBuilder& GraphBuilder, FSceneViewState* ViewState, const FLightSceneInfo* LightSceneInfo ); void DestroyAdaptiveVolumetricShadowMapUniformBuffer( TRDGUniformBufferRef& AdaptiveVolumetricShadowMapUniformBuffer ); TRDGUniformBufferRef GetAdaptiveVolumetricCameraMapUniformBuffer( FRDGBuilder& GraphBuilder, FSceneViewState* ViewState ); FAdaptiveVolumetricShadowMapUniformBufferParameters GetAdaptiveVolumetricCameraMapParameters( FRDGBuilder& GraphBuilder, FSceneViewState* ViewState ); TRDGUniformBufferRef CreateEmptyAdaptiveVolumetricShadowMapUniformBuffer( FRDGBuilder& GraphBuilder ); TRDGUniformBufferRef GetFrustumVoxelGridUniformBuffer( FRDGBuilder& GraphBuilder, FSceneViewState* ViewState ); TRDGUniformBufferRef GetOrthoVoxelGridUniformBuffer( FRDGBuilder& GraphBuilder, FSceneViewState* ViewState ); void PostRender(FScene& Scene, TArray& Views); } // namespace HeterogeneousVolumes TRDGUniformBufferRef CreateAdaptiveVolumetricShadowMapUniformBuffers( FRDGBuilder& GraphBuilder, FSceneViewState* ViewState, const FLightSceneInfo* LightSceneInfo ); void RenderWithLiveShading( FRDGBuilder& GraphBuilder, const FSceneTextures& SceneTextures, const FScene* Scene, const FViewInfo& View, int32 ViewIndex, // Shadow data TArray& VisibleLightInfos, const FVirtualShadowMapArray& VirtualShadowMapArray, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, const FMaterialRenderProxy* MaterialRenderProxy, const FPersistentPrimitiveIndex &PersistentPrimitiveIndex, const FBoxSphereBounds LocalBoxSphereBounds, // Transmittance acceleration FRDGTextureRef LightingCacheTexture, // Output FRDGTextureRef& HeterogeneousVolumeRadiance, FRDGTextureRef& HeterogeneousVolumeVelocity, FRDGTextureRef& HeterogeneousVolumeHoldout, FRDGTextureRef& HeterogeneousVolumeBeerShadowMap ); void RenderWithPreshading( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View, int32 ViewIndex, // Shadow data TArray& VisibleLightInfos, const FVirtualShadowMapArray& VirtualShadowMapArray, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, const FMaterialRenderProxy* MaterialRenderProxy, const FPersistentPrimitiveIndex &PersistentPrimitiveIndex, const FBoxSphereBounds LocalBoxSphereBounds, // Transmittance acceleration FRDGTextureRef LightingCacheTexture, // Output FRDGTextureRef& HeterogeneousVolumeRadiance ); void RenderTransmittanceWithVoxelGrid( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View, const TRDGUniformBufferRef& OrthoGridUniformBuffer, const TRDGUniformBufferRef& FrustumGridUniformBuffer, // Output FRDGTextureRef& HeterogeneousVolumeRadiance ); void RenderAdaptiveVolumetricShadowMapWithVoxelGrid( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View, // Shadow data TArray& VisibleLightInfos, const FVirtualShadowMapArray& VirtualShadowMapArray, // Volume data const TRDGUniformBufferRef& OrthoGridUniformBuffer, const TRDGUniformBufferRef& FrustumGridUniformBuffer ); void RenderAdaptiveVolumetricShadowMapWithLiveShading( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View, // Light data TArray& VisibleLightInfos ); void RenderAdaptiveVolumetricCameraMapWithVoxelGrid( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View, // Volume data const TRDGUniformBufferRef& OrthoGridUniformBuffer, const TRDGUniformBufferRef& FrustumGridUniformBuffer ); void RenderAdaptiveVolumetricCameraMapWithLiveShading( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View ); void CompressVolumetricShadowMap( FRDGBuilder& GraphBuilder, FViewInfo& View, FIntVector GroupCount, // Input FIntPoint ShadowMapResolution, uint32 MaxSampleCount, FRDGBufferRef VolumetricShadowLinkedListBuffer, // Output FRDGBufferRef& VolumetricShadowIndirectionBuffer, FRDGBufferRef& VolumetricShadowTransmittanceBuffer ); void CombineVolumetricShadowMap( FRDGBuilder& GraphBuilder, FViewInfo& View, FIntVector GroupCount, // Input uint32 LightType, FIntPoint ShadowMapResolution, uint32 MaxSampleCount, FRDGBufferRef VolumetricShadowLinkedListBuffer0, FRDGBufferRef VolumetricShadowLinkedListBuffer1, // Output FRDGBufferRef& VolumetricShadowLinkedListBuffer ); void ConvertBeerLawShadowMapToVolumetricShadowMap( FRDGBuilder& GraphBuilder, FViewInfo& View, // Input FIntPoint ShadowMapResolution, FRDGTextureRef BeerShadowMapTexture, // Output FRDGBufferRef& VolumetricShadowIndirectionBuffer, FRDGBufferRef& VolumetricShadowTransmittanceBuffer ); void CreateAdaptiveVolumetricShadowMapUniformBufferParameters( FRDGBuilder& GraphBuilder, const FVector3f& TranslatedWorldOrigin, const FVector4f& TranslatedWorldPlane, const FMatrix44f* TranslatedWorldToShadow, FIntPoint VolumetricShadowMapResolution, float VolumetricShadowMapDownsampleFactor, int32 NumShadowMatrices, uint32 VolumetricShadowMapMaxSampleCount, bool bIsDirectionalLight, FRDGBufferRef VolumetricShadowMapLinkedListBuffer, FRDGBufferRef VolumetricShadowMapIndirectionBuffer, FRDGBufferRef VolumetricShadowMapSampleBuffer, FAdaptiveVolumetricShadowMapUniformBufferParameters*& AdaptiveVolumetricShadowMapUniformBufferParameters ); void CreateAdaptiveVolumetricShadowMapUniformBuffer( FRDGBuilder& GraphBuilder, const FVector3f& TranslatedWorldOrigin, const FVector4f& TranslatedWorldPlane, const FMatrix44f* TranslatedWorldToShadow, FIntPoint VolumetricShadowMapResolution, float VolumetricShadowMapDownsampleFactor, int32 NumShadowMatrices, uint32 VolumetricShadowMapMaxSampleCount, bool bIsDirectionalLight, FRDGBufferRef VolumetricShadowMapLinkedListBuffer, FRDGBufferRef VolumetricShadowMapIndirectionBuffer, FRDGBufferRef VolumetricShadowMapSampleBuffer, TRDGUniformBufferRef& AdaptiveVolumetricShadowMapUniformBuffer ); void RenderSingleScatteringWithVoxelGrid( FRDGBuilder& GraphBuilder, // Scene data const FSceneTextures& SceneTextures, FScene* Scene, FViewInfo& View, // Shadow data TArray& VisibleLightInfos, const FVirtualShadowMapArray& VirtualShadowMapArray, // Volume data const TRDGUniformBufferRef& OrthoGridUniformBuffer, const TRDGUniformBufferRef& FrustumGridUniformBuffer, // Output FRDGTextureRef& HeterogeneousVolumeRadiance ); // Preshading Pipeline void ComputeHeterogeneousVolumeBakeMaterial( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, const FMaterialRenderProxy* MaterialRenderProxy, const FPersistentPrimitiveIndex &PersistentPrimitiveIndex, const FBoxSphereBounds LocalBoxSphereBounds, // Volume data FIntVector VolumeResolution, // Output FRDGTextureRef& HeterogeneousVolumeExtinctionTexture, FRDGTextureRef& HeterogeneousVolumeEmissionTexture, FRDGTextureRef& HeterogeneousVolumeAlbedoTexture ); // Sparse Voxel Pipeline void CopyTexture3D( FRDGBuilder& GraphBuilder, const FViewInfo& View, FRDGTextureRef Texture, uint32 InputMipLevel, FRDGTextureRef& OutputTexture ); void GenerateSparseVoxels( FRDGBuilder& GraphBuilder, const FViewInfo& View, FRDGTextureRef VoxelMinTexture, FIntVector VolumeResolution, uint32 MipLevel, FRDGBufferRef& NumVoxelsBuffer, FRDGBufferRef& VoxelBuffer ); void RenderExistenceMaskWithLiveShading( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, const FSceneTextures& SceneTextures, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, const FMaterialRenderProxy* DefaultMaterialRenderProxy, FPersistentPrimitiveIndex PersistentPrimitiveIndex, const FBoxSphereBounds LocalBoxSphereBounds, FIntVector ExistenceMaskTextureResolution, // Output FRDGTextureRef& ExistenceMaskTexture ); void DilateExistenceMask( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, // Existence texture data FRDGTextureRef ExistenceMaskTexture, FIntVector ExistenceMaskTextureResolution, // Output FRDGTextureRef& DilatedExistenceTexture ); void RenderAmbientOcclusionWithLiveShading( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, const FSceneTextures& SceneTextures, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, const FMaterialRenderProxy* DefaultMaterialRenderProxy, FPersistentPrimitiveIndex PersistentPrimitiveIndex, const FBoxSphereBounds LocalBoxSphereBounds, // Output FRDGTextureRef& AmbientOcclusionTexture ); #if RHI_RAYTRACING void GenerateRayTracingGeometryInstance( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, // Sparse voxel data FRDGBufferRef NumVoxelsBuffer, TRDGUniformBufferRef SparseVoxelUniformBuffer, // Output TArray& RayTracingGeometries, TArray& RayTracingTransforms ); void GenerateRayTracingScene( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, // Ray tracing data TConstArrayView RayTracingGeometries, TConstArrayView RayTracingTransforms, // Output FRayTracingScene& RayTracingScene ); void RenderLightingCacheWithPreshadingHardwareRayTracing( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, int32 ViewIndex, const FSceneTextures& SceneTextures, // Light data bool bApplyEmissionAndTransmittance, bool bApplyDirectLighting, bool bApplyShadowTransmittance, uint32 LightType, const FLightSceneInfo* LightSceneInfo, // Shadow data const FVisibleLightInfo* VisibleLightInfo, const FVirtualShadowMapArray& VirtualShadowMapArray, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, // Sparse voxel data TRDGUniformBufferRef SparseVoxelUniformBuffer, // Ray tracing data FRayTracingScene& RayTracingScene, TConstArrayView RayTracingGeometries, // Output FRDGTextureRef& LightingCacheTexture ); void RenderSingleScatteringWithPreshadingHardwareRayTracing( FRDGBuilder& GraphBuilder, // Scene data const FScene* Scene, const FViewInfo& View, int32 ViewIndex, const FSceneTextures& SceneTextures, // Light data bool bApplyEmissionAndTransmittance, bool bApplyDirectLighting, bool bApplyShadowTransmittance, uint32 LightType, const FLightSceneInfo* LightSceneInfo, // Shadow data const FVisibleLightInfo* VisibleLightInfo, const FVirtualShadowMapArray& VirtualShadowMapArray, // Object data const IHeterogeneousVolumeInterface* HeterogeneousVolumeInterface, // Sparse voxel data TRDGUniformBufferRef SparseVoxelUniformBuffer, // Ray tracing data FRayTracingScene& RayTracingScene, TConstArrayView RayTracingGeometries, // Transmittance volume FRDGTextureRef LightingCacheTexture, // Output FRDGTextureRef& HeterogeneousVolumeTexture ); #endif // RHI_RAYTRACING DECLARE_CYCLE_STAT(TEXT("Ambient Occlusion"), STATGROUP_HeterogeneousVolumesAmbientOcclusion, STATGROUP_HeterogeneousVolumesRT); DECLARE_CYCLE_STAT(TEXT("Light Cache"), STATGROUP_HeterogeneousVolumesLightCache, STATGROUP_HeterogeneousVolumesRT); DECLARE_CYCLE_STAT(TEXT("Material Baking"), STATGROUP_HeterogeneousVolumesMaterialBaking, STATGROUP_HeterogeneousVolumesRT); DECLARE_CYCLE_STAT(TEXT("Shadows"), STATGROUP_HeterogeneousVolumesShadows, STATGROUP_HeterogeneousVolumesRT); DECLARE_CYCLE_STAT(TEXT("Single Scattering"), STATGROUP_HeterogeneousVolumesSingleScattering, STATGROUP_HeterogeneousVolumesRT);