Files
UnrealEngine/Engine/Shaders/Private/LightFunctionAtlas/LightFunctionAtlasRender.usf
2025-05-18 13:04:45 +08:00

88 lines
2.7 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
RenderLightFunctionAtlas.usf
=============================================================================*/
// This define is for the light function common evaluation to only be based on UV stored in the light vector only.
#define LIGHT_FUNCTION_ATLAS 1
// Used to trigger shader recompiles, guid should be regenerated on merge conflicts
#pragma message("UESHADERMETADATA_VERSION D13B08DE-2E66-447C-AF33-27D896D280CA")
#include "../Common.ush"
#include "/Engine/Generated/Material.ush"
#include "../LightFunctionCommon.ush"
float2 LightFunctionTexelSize;
float4 SvPositionToUVScaleBias;
void Main(
in noperspective float4 UV : TEXCOORD0,
in FStereoPSInput StereoInput,
in float4 SvPosition : SV_Position,
out float4 OutColor : SV_Target0
)
{
float4 TranslatedWorldPosition = float4(0, 0, 0, 1);
float Depth = 0.000001f;
float2 ScreenPosition = 0.0f;
float3 LightVector = 0.0f;
float3 LightFunction = 0.0f;
// ScreenPosition = (SvPosition.xy * LightFunctionTexelSize - float2(0.5f, 0.5f)) * float2(2, -2);
float2 UVs = (SvPosition.xy - SvPositionToUVScaleBias.zw) * SvPositionToUVScaleBias.xy;
#if 1
// Generate a local space light vector that is at least correct for point lights
float Theta = (UVs.x * (2 * PI)) - PI;
float Phi = UVs.y * PI;
float SinTheta, CosTheta;
float SinPhi, CosPhi;
sincos(Theta, SinTheta, CosTheta);
sincos(Phi, SinPhi, CosPhi);
float X = CosTheta * SinPhi;
float Y = SinTheta * SinPhi;
float Z = CosPhi;
LightVector = normalize(float3(X, Y, Z));
LightFunction = GetLightFunctionColor(LightVector, TranslatedWorldPosition.xyz, UVs.xy);
#else
// TODO Super sample 4x
const float2 UVOffset = 0.25f * LightFunctionTexelSize;
LightVector.xy = UVs.xy + UVOffset * float2(-1.0f, -1.0f);
LightFunction += GetLightFunctionColor(LightVector, TranslatedWorldPosition.xyz);
LightVector.xy = UVs.xy + UVOffset * float2(-1.0f, 1.0f);
LightFunction += GetLightFunctionColor(LightVector, TranslatedWorldPosition.xyz);
LightVector.xy = UVs.xy + UVOffset * float2(1.0f, 1.0f);
LightFunction += GetLightFunctionColor(LightVector, TranslatedWorldPosition.xyz);
LightVector.xy = UVs.xy + UVOffset * float2(1.0f, -1.0f);
LightFunction += GetLightFunctionColor(LightVector, TranslatedWorldPosition.xyz);
LightFunction *= 0.25f;
#endif
#if COLORED_LIGHT_FUNCTION_ATLAS
LightFunction = sqrt(max(0.0f, LightFunction)); // Simple Gamma compression
OutColor = float4(LightFunction, 0.0f);
#else
float GreyScale = dot(LightFunction, .3333f).x;
GreyScale = sqrt(max(0.0f, GreyScale)); // Simple Gamma compression
OutColor = float4(GreyScale, 0.0f, 0.0f, 0.0f);
#endif
}