Files
UnrealEngine/Engine/Source/Runtime/Renderer/Public/SceneRenderTargetParameters.h
2025-05-18 13:04:45 +08:00

206 lines
7.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "RendererInterface.h"
#include "SceneTexturesConfig.h"
class FRDGBuilder;
struct FSceneTextures;
enum class ESceneTexture
{
Color,
Depth,
SmallDepth,
Velocity,
GBufferA,
GBufferB,
GBufferC,
GBufferD,
GBufferE,
GBufferF,
SSAO,
CustomDepth,
};
RENDERER_API FRDGTextureRef GetSceneTexture(const FSceneTextures& SceneTextures, ESceneTexture InSceneTexture);
enum class ESceneTextureSetupMode : uint32
{
None = 0,
SceneColor = 1 << 0,
SceneDepth = 1 << 1,
SceneVelocity = 1 << 2,
GBufferA = 1 << 3,
GBufferB = 1 << 4,
GBufferC = 1 << 5,
GBufferD = 1 << 6,
GBufferE = 1 << 7,
GBufferF = 1 << 8,
SSAO = 1 << 9,
CustomDepth = 1 << 10,
GBuffers = GBufferA | GBufferB | GBufferC | GBufferD | GBufferE | GBufferF,
All = SceneColor | SceneDepth | SceneVelocity | GBuffers | SSAO | CustomDepth
};
ENUM_CLASS_FLAGS(ESceneTextureSetupMode);
/** Fills the shader parameter struct. */
extern RENDERER_API void SetupSceneTextureUniformParameters(
FRDGBuilder& GraphBuilder,
const FSceneTextures* SceneTextures,
ERHIFeatureLevel::Type FeatureLevel,
ESceneTextureSetupMode SetupMode,
FSceneTextureUniformParameters& OutParameters);
/** Returns RDG scene texture uniform buffer. */
extern RENDERER_API TRDGUniformBufferRef<FSceneTextureUniformParameters> CreateSceneTextureUniformBuffer(
FRDGBuilder& GraphBuilder,
const FSceneTextures* SceneTextures,
ERHIFeatureLevel::Type FeatureLevel,
ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All);
/** Returns RDG scene texture uniform buffer for a specified View. */
extern RENDERER_API TRDGUniformBufferRef<FSceneTextureUniformParameters> CreateSceneTextureUniformBuffer(
FRDGBuilder& GraphBuilder,
const FSceneView& View,
ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All);
enum class EMobileSceneTextureSetupMode : uint32
{
None = 0,
SceneColor = 1 << 0,
SceneDepth = 1 << 1,
CustomDepth = 1 << 2,
GBufferA = 1 << 3,
GBufferB = 1 << 4,
GBufferC = 1 << 5,
GBufferD = 1 << 6,
SceneDepthAux = 1 << 7,
SceneVelocity = 1 << 8,
GBuffers = GBufferA | GBufferB | GBufferC | GBufferD | SceneDepthAux,
All = SceneColor | SceneDepth | CustomDepth | GBuffers | SceneVelocity
};
ENUM_CLASS_FLAGS(EMobileSceneTextureSetupMode);
/** Fills the scene texture uniform buffer struct. */
extern RENDERER_API void SetupMobileSceneTextureUniformParameters(
FRDGBuilder& GraphBuilder,
const FSceneTextures* SceneTextures,
EMobileSceneTextureSetupMode SetupMode,
FMobileSceneTextureUniformParameters& SceneTextureParameters);
/** Creates the RDG mobile scene texture uniform buffer. */
extern RENDERER_API TRDGUniformBufferRef<FMobileSceneTextureUniformParameters> CreateMobileSceneTextureUniformBuffer(
FRDGBuilder& GraphBuilder,
const FSceneTextures* SceneTextures,
EMobileSceneTextureSetupMode SetupMode = EMobileSceneTextureSetupMode::All);
/** Creates the RDG mobile scene texture uniform buffer. */
extern RENDERER_API TRDGUniformBufferRef<FMobileSceneTextureUniformParameters> CreateMobileSceneTextureUniformBuffer(
FRDGBuilder& GraphBuilder,
const FSceneView& View,
EMobileSceneTextureSetupMode SetupMode = EMobileSceneTextureSetupMode::All);
/** Returns scene texture shader parameters containing the RDG uniform buffer for either mobile or deferred shading. */
extern RENDERER_API FSceneTextureShaderParameters CreateSceneTextureShaderParameters(
FRDGBuilder& GraphBuilder,
const FSceneTextures* SceneTextures,
ERHIFeatureLevel::Type FeatureLevel,
ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All);
/** Returns scene texture shader parameters containing the RDG uniform buffer for either mobile or deferred shading. */
extern RENDERER_API FSceneTextureShaderParameters CreateSceneTextureShaderParameters(
FRDGBuilder& GraphBuilder,
const FSceneView& View,
ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All);
extern RENDERER_API FSceneTextureShaderParameters GetSceneTextureShaderParameters(const FSceneView& View);
BEGIN_SHADER_PARAMETER_STRUCT(FSceneTextureExtractsParameters, )
SHADER_PARAMETER_STRUCT_REF(FSceneTextureUniformParameters, SceneTextures)
SHADER_PARAMETER_STRUCT_REF(FMobileSceneTextureUniformParameters, MobileSceneTextures)
END_SHADER_PARAMETER_STRUCT()
/** Struct containing references to extracted RHI resources after RDG execution. All textures are
* left in an SRV read state, so they can safely be used for read without being re-imported into
* RDG. Likewise, the uniform buffer is non-RDG and can be used as is.
*/
class FSceneTextureExtracts : public FRenderResource
{
public:
FRHIUniformBuffer* GetUniformBuffer() const
{
return UniformBuffer.IsValid() ? UniformBuffer.GetReference() : MobileUniformBuffer.GetReference();
}
TUniformBufferRef<FSceneTextureUniformParameters> GetUniformBufferRef() const
{
return UniformBuffer;
}
TUniformBufferRef<FMobileSceneTextureUniformParameters> GetMobileUniformBufferRef() const
{
return MobileUniformBuffer;
}
FSceneTextureExtractsParameters GetShaderParameters() const
{
FSceneTextureExtractsParameters Parameters;
Parameters.SceneTextures = UniformBuffer;
Parameters.MobileSceneTextures = MobileUniformBuffer;
return Parameters;
}
FRHITexture* GetDepthTexture() const
{
return Depth ? Depth->GetRHI() : nullptr;
}
RENDERER_API void QueueExtractions(FRDGBuilder& GraphBuilder, const FSceneTextures& SceneTextures);
private:
RENDERER_API void Release();
void ReleaseRHI() override { Release(); }
// Contains the resolved scene depth target.
TRefCountPtr<IPooledRenderTarget> Depth;
// Contains the resolved scene depth target.
TRefCountPtr<IPooledRenderTarget> PartialDepth;
// Contains the custom depth targets.
TRefCountPtr<IPooledRenderTarget> CustomDepth;
// Contains RHI scene texture uniform buffers referencing the extracted textures.
TUniformBufferRef<FSceneTextureUniformParameters> UniformBuffer;
TUniformBufferRef<FMobileSceneTextureUniformParameters> MobileUniformBuffer;
};
/** Returns the global scene texture extracts struct. */
const RENDERER_API FSceneTextureExtracts& GetSceneTextureExtracts();
/** Pass through to View.GetSceneTexturesConfig().Extent, useful in headers where the FViewInfo structure isn't exposed. */
extern RENDERER_API FIntPoint GetSceneTextureExtentFromView(const FViewInfo& View);
/** Resets the scene texture extent history. Call this method after rendering with very large render
* targets. The next scene render will create them at the requested size.
*/
extern RENDERER_API void ResetSceneTextureExtentHistory();
/** Registers system textures into RDG. */
extern RENDERER_API void CreateSystemTextures(FRDGBuilder& GraphBuilder);
/** Returns whether scene textures have been initialized. */
UE_DEPRECATED(5.1, "Single pass multiple view family rendering makes this obsolete. Use ViewFamily.SceneTexturesConfig.IsValid() instead.")
extern RENDERER_API bool IsSceneTexturesValid();
/** Returns the full-resolution scene texture extent. */
UE_DEPRECATED(5.1, "Single pass multiple view family rendering makes this obsolete. Use ViewFamily.SceneTexturesConfig.Extent instead.")
extern RENDERER_API FIntPoint GetSceneTextureExtent();
/** Returns the feature level being used by the renderer. */
UE_DEPRECATED(5.1, "Single pass multiple view family rendering makes this obsolete. Use ViewFamily.SceneTexturesConfig.FeatureLevel instead.")
extern RENDERER_API ERHIFeatureLevel::Type GetSceneTextureFeatureLevel();