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

132 lines
4.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Materials/Material.h"
#include "RenderUtils.h"
#include "MeshPassProcessor.h"
class FMaterial;
class FRHIBlendState;
class FRHIRasterizerState;
struct FMaterialShaderParameters;
struct FShaderCompilerEnvironment;
/** Packed decal description which contains all the information to define render passes and shader compilation setup. */
union FDecalBlendDesc
{
uint32 Packed = 0;
struct
{
uint32 BlendMode : 8;
uint32 RenderStageMask : 8;
uint32 bWriteBaseColor : 1;
uint32 bWriteNormal : 1;
uint32 bWriteRoughnessSpecularMetallic : 1;
uint32 bWriteEmissive : 1;
uint32 bWriteAmbientOcclusion : 1;
uint32 bWriteDBufferMask : 1;
};
};
/** Enumeration of the points in the frame for decal rendering. */
enum class EDecalRenderStage : uint8
{
None = 0,
// DBuffer decal pass.
BeforeBasePass = 1,
// GBuffer decal pass.
BeforeLighting = 2,
// Mobile decal pass with limited functionality.
Mobile = 3,
// Mobile decal pass for mobile deferred platforms.
MobileBeforeLighting = 4,
// Emissive decal pass.
// DBuffer decals with an emissive component will use this pass.
Emissive = 5,
// Ambient occlusion decal pass.
// A decal can write regular attributes in another pass and then AO in this pass.
AmbientOcclusion = 6,
Num,
};
/** Enumeration of the render target layouts for decal rendering. */
enum class EDecalRenderTargetMode : uint8
{
None = 0,
DBuffer = 1,
SceneColorAndGBuffer = 2,
// GBuffer with no normal is necessary for decals sampling the normal from the GBuffer.
SceneColorAndGBufferNoNormal = 3,
SceneColor = 4,
AmbientOcclusion = 5,
Num,
};
/** Enumeration of decal rasterization states. */
enum class EDecalRasterizerState : uint8
{
Undefined,
CCW,
CW,
};
/**
* Shared decal functionality for render pass and shader setup.
*/
namespace DecalRendering
{
/** Build the packed decal description from a decal material. */
FDecalBlendDesc ComputeDecalBlendDesc(EShaderPlatform Platform, const FMaterial& Material);
/** Build the packed decal description from a decal material. */
FDecalBlendDesc ComputeDecalBlendDesc(EShaderPlatform Platform, FMaterialShaderParameters const& MaterialShaderParameters);
/** Returns true if a decal should be rendered in the render stage. */
bool IsCompatibleWithRenderStage(FDecalBlendDesc DecalBlendDesc, EDecalRenderStage DecalRenderStage);
/** Returns the main render stage from render target mode and shading path */
EDecalRenderStage GetRenderStage(EDecalRenderTargetMode RenderTargetMode, EShadingPath ShadingPath);
/** Returns the main render stage for a decal (does not include the emissive, and AO stages). Can return EDecalRenderStage::None if there is no valid main render stage. */
EDecalRenderStage GetBaseRenderStage(FDecalBlendDesc DecalBlendDesc);
/** Get the render target mode that a decal uses for a given stage. Can return EDecalRenderTargetMode::None if there is no valid render target mode. */
EDecalRenderTargetMode GetRenderTargetMode(FDecalBlendDesc DecalBlendDesc, EDecalRenderStage DecalRenderStage);
/** Setup a mask for each render target mode where the material should render to */
uint8 GetDecalRenderTargetModeMask(const FMaterial& Material, ERHIFeatureLevel::Type FeatureLevel);
/** Returns true if a decal should be rendered in the render target mode. */
bool IsCompatibleWithRenderTargetMode(uint8 DecalRenderTargetModeMask, EDecalRenderTargetMode DecalRenderTargetMode);
/** Get the mesh pass processer type to use for given render target mode */
EMeshPass::Type GetMeshPassType(EDecalRenderTargetMode RenderTargetMode);
/** Get render target count for the given render target mode. */
uint32 GetRenderTargetCount(FDecalBlendDesc DecalBlendDesc, EDecalRenderTargetMode RenderTargetMode);
/** Get render target write mask as a bitmask for the given stage and render target mode. */
uint32 GetRenderTargetWriteMask(FDecalBlendDesc DecalBlendDesc, EDecalRenderStage DecalRenderStage, EDecalRenderTargetMode RenderTargetMode);
/** Get the blend state for rendering a decal at the given stage and render target mode. */
FRHIBlendState* GetDecalBlendState(FDecalBlendDesc DecalBlendDesc, EDecalRenderStage DecalRenderStage, EDecalRenderTargetMode RenderTargetMode);
/** Get the EDecalRasterizerState enum from the view setup. */
EDecalRasterizerState GetDecalRasterizerState(bool bInsideDecal, bool bIsInverted, bool ViewReverseCulling);
/** Get the rasterizer state object for a EDecalRasterizerState enum. */
FRHIRasterizerState* GetDecalRasterizerState(EDecalRasterizerState DecalRasterizerState);
/** Modify the shader compilation environment for a given decal and stage. */
void ModifyCompilationEnvironment(EShaderPlatform Platform, FDecalBlendDesc DecalBlendDesc, EDecalRenderStage DecalRenderStage, FShaderCompilerEnvironment& OutEnvironment);
};