You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
244 lines
6.8 KiB
Plaintext
244 lines
6.8 KiB
Plaintext
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
/*=============================================================================
|
|
PixelShaderOutputCommon.usf: To allow PS input/output passed int functions through a single struct, allowing for a more readable code (less #ifdefs, reducing the boolean hell)
|
|
=============================================================================*/
|
|
|
|
#ifndef PIXELSHADEROUTPUT_INTERPOLANTS
|
|
#define PIXELSHADEROUTPUT_INTERPOLANTS 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_BASEPASS
|
|
#define PIXELSHADEROUTPUT_BASEPASS 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MESHDECALPASS
|
|
#define PIXELSHADEROUTPUT_MESHDECALPASS 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT0
|
|
#define PIXELSHADEROUTPUT_MRT0 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT1
|
|
#define PIXELSHADEROUTPUT_MRT1 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT2
|
|
#define PIXELSHADEROUTPUT_MRT2 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT3
|
|
#define PIXELSHADEROUTPUT_MRT3 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT4
|
|
#define PIXELSHADEROUTPUT_MRT4 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT5
|
|
#define PIXELSHADEROUTPUT_MRT5 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT6
|
|
#define PIXELSHADEROUTPUT_MRT6 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_MRT7
|
|
#define PIXELSHADEROUTPUT_MRT7 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_COVERAGE
|
|
#define PIXELSHADEROUTPUT_COVERAGE 0
|
|
#endif
|
|
#ifndef PIXELSHADEROUTPUT_A2C
|
|
#define PIXELSHADEROUTPUT_A2C 0
|
|
#endif
|
|
#ifndef PIXELSHADER_EARLYDEPTHSTENCIL
|
|
#define PIXELSHADER_EARLYDEPTHSTENCIL
|
|
#endif
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
PIXELSHADER_EARLYDEPTHSTENCIL
|
|
void MainPS
|
|
(
|
|
#if PIXELSHADEROUTPUT_INTERPOLANTS || PIXELSHADEROUTPUT_BASEPASS
|
|
#if IS_NANITE_PASS
|
|
FNaniteFullscreenVSToPS NaniteInterpolants,
|
|
#else
|
|
FVertexFactoryInterpolantsVSToPS Interpolants,
|
|
#endif
|
|
#endif
|
|
#if PIXELSHADEROUTPUT_BASEPASS
|
|
FBasePassInterpolantsVSToPS BasePassInterpolants,
|
|
#elif PIXELSHADEROUTPUT_MESHDECALPASS
|
|
FMeshDecalInterpolants MeshDecalInterpolants,
|
|
#endif
|
|
|
|
in INPUT_POSITION_QUALIFIERS float4 SvPosition : SV_Position // after all interpolators
|
|
|
|
OPTIONAL_IsFrontFace
|
|
|
|
#if PIXELSHADEROUTPUT_MRT0
|
|
#if DUAL_SOURCE_COLOR_BLENDING_ENABLED && MATERIAL_WORKS_WITH_DUAL_SOURCE_COLOR_BLENDING
|
|
, out float4 OutTarget0 DUAL_SOURCE_BLENDING_SLOT(0) : SV_Target0
|
|
#else
|
|
, out float4 OutTarget0 : SV_Target0
|
|
#endif
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT1
|
|
#if DUAL_SOURCE_COLOR_BLENDING_ENABLED && MATERIAL_WORKS_WITH_DUAL_SOURCE_COLOR_BLENDING
|
|
, out float4 OutTarget1 DUAL_SOURCE_BLENDING_SLOT(1) : SV_Target1
|
|
#else
|
|
, out float4 OutTarget1 : SV_Target1
|
|
#endif
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT2
|
|
, out float4 OutTarget2 : SV_Target2
|
|
#endif
|
|
|
|
#if STRATA_OPAQUE_DEFERRED
|
|
#if STRATA_BASE_PASS_MRT_OUTPUT_COUNT != 2
|
|
#error Strata STRATA_BASE_PASS_MRT_OUTPUT_COUNT has been update but not the uint MRTs
|
|
#endif
|
|
#if PIXELSHADEROUTPUT_MRT3
|
|
#error Strata cannot map to such a case
|
|
#endif
|
|
#if PIXELSHADEROUTPUT_MRT2
|
|
, out uint StrataOutput3 : SV_Target3
|
|
, out uint StrataOutput4 : SV_Target4
|
|
, out uint StrataOutput5 : SV_Target5
|
|
#elif PIXELSHADEROUTPUT_MRT1
|
|
, out uint StrataOutput2 : SV_Target2
|
|
, out uint StrataOutput3 : SV_Target3
|
|
, out uint StrataOutput4 : SV_Target4
|
|
#else
|
|
, out uint StrataOutput1 : SV_Target1
|
|
, out uint StrataOutput2 : SV_Target2
|
|
, out uint StrataOutput3 : SV_Target3
|
|
#endif
|
|
#else // STRATA_OPAQUE_DEFERRED
|
|
|
|
#if PIXELSHADEROUTPUT_MRT3
|
|
, out float4 OutTarget3 : SV_Target3
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT4
|
|
, out float4 OutTarget4 : SV_Target4
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT5
|
|
, out float4 OutTarget5 : SV_Target5
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT6
|
|
, out float4 OutTarget6 : SV_Target6
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT7
|
|
, out float4 OutTarget7 : SV_Target7
|
|
#endif
|
|
|
|
#endif // STRATA_OPAQUE_DEFERRED
|
|
|
|
// todo: if we are not inside a volumetric decal we could use OPTIONAL_OutDepthConservative for better performance, this would require a shader permutation
|
|
OPTIONAL_OutDepthConservative
|
|
|
|
#if PIXELSHADEROUTPUT_COVERAGE || PIXELSHADEROUTPUT_A2C
|
|
#if PIXELSHADEROUTPUT_A2C
|
|
, in uint InCoverage : SV_Coverage
|
|
#endif
|
|
, out uint OutCoverage : SV_Coverage
|
|
#endif
|
|
)
|
|
{
|
|
// ---------------------------------------------------------------------------------
|
|
#if IS_NANITE_PASS && (PIXELSHADEROUTPUT_INTERPOLANTS || PIXELSHADEROUTPUT_BASEPASS)
|
|
FVertexFactoryInterpolantsVSToPS Interpolants = (FVertexFactoryInterpolantsVSToPS)0;
|
|
Interpolants.ViewIndex = NaniteInterpolants.ViewIndex;
|
|
#endif
|
|
|
|
FPixelShaderIn PixelShaderIn = (FPixelShaderIn)0;
|
|
FPixelShaderOut PixelShaderOut = (FPixelShaderOut)0;
|
|
|
|
#if PIXELSHADEROUTPUT_COVERAGE || PIXELSHADEROUTPUT_A2C
|
|
#if PIXELSHADEROUTPUT_A2C
|
|
PixelShaderIn.Coverage = InCoverage;
|
|
#else
|
|
PixelShaderIn.Coverage = 0xF;
|
|
#endif
|
|
PixelShaderOut.Coverage = PixelShaderIn.Coverage;
|
|
#endif
|
|
|
|
PixelShaderIn.SvPosition = SvPosition;
|
|
PixelShaderIn.bIsFrontFace = bIsFrontFace;
|
|
|
|
#if PIXELSHADEROUTPUT_BASEPASS
|
|
FPixelShaderInOut_MainPS(Interpolants, BasePassInterpolants, PixelShaderIn, PixelShaderOut);
|
|
#elif PIXELSHADEROUTPUT_MESHDECALPASS
|
|
FPixelShaderInOut_MainPS(Interpolants, MeshDecalInterpolants, PixelShaderIn, PixelShaderOut);
|
|
#elif PIXELSHADEROUTPUT_INTERPOLANTS
|
|
FPixelShaderInOut_MainPS(Interpolants, PixelShaderIn, PixelShaderOut);
|
|
#else
|
|
FPixelShaderInOut_MainPS(PixelShaderIn, PixelShaderOut);
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT0
|
|
OutTarget0 = PixelShaderOut.MRT[0];
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT1
|
|
OutTarget1 = PixelShaderOut.MRT[1];
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT2
|
|
OutTarget2 = PixelShaderOut.MRT[2];
|
|
#endif
|
|
|
|
#if STRATA_OPAQUE_DEFERRED
|
|
|
|
// In this case, here is the gbuffer pattern
|
|
// MRT0 is pixel color
|
|
// MRT1 is velocity if enabled or precomputed shadow if velocity if disabled and precomputed shadow enabled
|
|
// MRT2 is precomputed shadow if both velocity and prec shadow are enabled.
|
|
// After, Strata output are appended (3 uint output)
|
|
|
|
#if PIXELSHADEROUTPUT_MRT2
|
|
StrataOutput3 = PixelShaderOut.StrataOutput[0];
|
|
StrataOutput4 = PixelShaderOut.StrataOutput[1];
|
|
StrataOutput5 = PixelShaderOut.StrataOutput[2];
|
|
#elif PIXELSHADEROUTPUT_MRT1
|
|
StrataOutput2 = PixelShaderOut.StrataOutput[0];
|
|
StrataOutput3 = PixelShaderOut.StrataOutput[1];
|
|
StrataOutput4 = PixelShaderOut.StrataOutput[2];
|
|
#else
|
|
StrataOutput1 = PixelShaderOut.StrataOutput[0];
|
|
StrataOutput2 = PixelShaderOut.StrataOutput[1];
|
|
StrataOutput3 = PixelShaderOut.StrataOutput[2];
|
|
#endif
|
|
|
|
#else // STRATA_OPAQUE_DEFERRED
|
|
|
|
#if PIXELSHADEROUTPUT_MRT3
|
|
OutTarget3 = PixelShaderOut.MRT[3];
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT4
|
|
OutTarget4 = PixelShaderOut.MRT[4];
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT5
|
|
OutTarget5 = PixelShaderOut.MRT[5];
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT6
|
|
OutTarget6 = PixelShaderOut.MRT[6];
|
|
#endif
|
|
|
|
#if PIXELSHADEROUTPUT_MRT7
|
|
OutTarget7 = PixelShaderOut.MRT[7];
|
|
#endif
|
|
|
|
#endif // STRATA_OPAQUE_DEFERRED
|
|
|
|
#if PIXELSHADEROUTPUT_COVERAGE || PIXELSHADEROUTPUT_A2C
|
|
OutCoverage = PixelShaderOut.Coverage;
|
|
#endif
|
|
|
|
#if OUTPUT_PIXEL_DEPTH_OFFSET
|
|
OutDepth = PixelShaderOut.Depth;
|
|
#endif
|
|
}
|