Files
UnrealEngine/Engine/Shaders/Private/DiaphragmDOF/DOFHybridScatterCommon.ush
2025-05-18 13:04:45 +08:00

103 lines
3.7 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
DiaphragmDOF/DOFHybridScatterCommon.ush: Hold code shared between
hybrid scattering's compilation and scattering passes.
=============================================================================*/
#include "DOFCommon.ush"
//------------------------------------------------------- DEBUG COMPILE TIME CONFIG
// Mode to debug hybrid scatering mode.
// 0: Disabled,
// 1: Shows scattered sprites that actually draw no color in red, other in green.
// 2: Shows scattered boked in red.
#define DEBUG_HYBRID_SCATTERING_SPRITE 0
//------------------------------------------------------- ENUM VALUES
/** Indirect bokeh drawing method. */
// Bokeh is drawn using DrawPrimitiveIndirect() with triangle list topology.
#define BOKEH_DRAW_METHOD_TRIANGLE 0
// Bokeh is drawn using DrawIndexedPrimitiveIndirect() with triangle list topology.
#define BOKEH_DRAW_METHOD_INDEXED_TRIANGLE 1
// Bokeh is drawn using DrawPrimitiveIndirect() with rect list topology.
#define BOKEH_DRAW_METHOD_RECT 2
//------------------------------------------------------- COMPILE TIME CONSTANTS
// Hybrid scattering is done by square shaped group of sample to reduce overlapping
// pixel shader invocation. This constant is the size in sample of this group.
#define HYBRID_SCATTERING_GROUP_BORDER_SIZE 2
// Number of pixels per scattering group.
#define PIXEL_COUNT_PER_SCATTER_GROUP (HYBRID_SCATTERING_GROUP_BORDER_SIZE * HYBRID_SCATTERING_GROUP_BORDER_SIZE)
// 2x float4: 2 floats + (3 flags * 2 floats)
#define VIGNETTE_DATA_PER_PIXEL (2)
#define SCATTER_DRAW_LIST_DATA_PER_PIXEL (1 + VIGNETTE_DATA_PER_PIXEL)
// Number of float4s in the draw list per scattering group
#define SCATTER_DRAW_LIST_GROUP_STRIDE (1 + (PIXEL_COUNT_PER_SCATTER_GROUP * SCATTER_DRAW_LIST_DATA_PER_PIXEL))
// Configures the drawing method used for scattering bokeh.
#if PLATFORM_SUPPORTS_RECT_LIST
#define BOKEH_DRAW_METHOD (BOKEH_DRAW_METHOD_RECT)
#else
#define BOKEH_DRAW_METHOD (BOKEH_DRAW_METHOD_INDEXED_TRIANGLE)
#endif
// The intersection model of the scater pass do a 1 pixel thick Feather for anti aliasing, where half
// intensity is excatly set a CocRadius distance for energy conservativness.
#define ANTI_ALIASING_FEATHER_OFFSET 0.5
// Whether to pack multiple sprite in same indirect draw instance.
#define SCATTERING_GROUP_PACKING 1
// Turns on/off the taylor expensition optimisation for bokeh distance
#define TAYLOR_EXPENDED_COC_INTERSECTION 1
// Number vertex shader invocation that should be targeted.
#define VERTEX_SHADER_INVOCATION_TARGET 64
//------------------------------------------------------- COMPILE TIME DERIVED CONSTANTS
// Setup the number drawing related constant according to the method use.
#if BOKEH_DRAW_METHOD == BOKEH_DRAW_METHOD_TRIANGLE
#define VERTEX_PER_SCATTERING_GROUP 6
#define VERTEX_SHADER_INVOCATION_PER_SCATTERING_GROUP 6
#define SCATTERING_INDIRECT_PARAMETER_SIZE (DRAW_INDIRECT_UINT_COUNT)
#elif BOKEH_DRAW_METHOD == BOKEH_DRAW_METHOD_INDEXED_TRIANGLE
#define VERTEX_PER_SCATTERING_GROUP 6
#define VERTEX_SHADER_INVOCATION_PER_SCATTERING_GROUP 4
#define SCATTERING_INDIRECT_PARAMETER_SIZE (DRAW_INDEXED_INDIRECT_UINT_COUNT)
#elif BOKEH_DRAW_METHOD == BOKEH_DRAW_METHOD_RECT
#define VERTEX_PER_SCATTERING_GROUP 3
#define VERTEX_SHADER_INVOCATION_PER_SCATTERING_GROUP 3
#define SCATTERING_INDIRECT_PARAMETER_SIZE (DRAW_INDIRECT_UINT_COUNT)
#else
#error Unknown bokeh drawing method.
#endif
#if DIM_SCATTER_QUALITY == SCATTER_QUALITY_MEDIUM
#define CONFIG_PETZVAL 0
#define CONFIG_VIGNETTE 0
#elif DIM_SCATTER_QUALITY == SCATTER_QUALITY_HIGH
#define CONFIG_PETZVAL 1
#define CONFIG_VIGNETTE 1
#endif //DIM_SCATTER_QUALITY