Files
UnrealEngineUWP/Engine/Shaders/Private/LightDataUniforms.ush
Charles deRousiers 29c281a801 * Change rect light data parameter passing & packing.
* Rect light texture data are available for forward lighting.

#rb none
#jira none
#preflight 633db11ff171e4e68b29f20e

[CL 22372470 by Charles deRousiers in ue5-main branch]
2022-10-06 02:24:41 -04:00

74 lines
3.6 KiB
Plaintext

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "LightData.ush"
// Build the light data struct using the DeferredLightUniforms and light defines
// We are heavily relying on the shader compiler to optimize out constant subexpressions in GetDynamicLighting()
FDeferredLightData InitDeferredLightFromUniforms(uint InLightType)
{
const bool bIsRadial = InLightType != LIGHT_TYPE_DIRECTIONAL;
FDeferredLightData Out;
Out.TranslatedWorldPosition = GetDeferredLightTranslatedWorldPosition();
Out.InvRadius = DeferredLightUniforms.InvRadius;
Out.Color = DeferredLightUniforms.Color;
Out.FalloffExponent = DeferredLightUniforms.FalloffExponent;
Out.Direction = DeferredLightUniforms.Direction;
Out.Tangent = DeferredLightUniforms.Tangent;
Out.SpotAngles = DeferredLightUniforms.SpotAngles;
Out.SourceRadius = DeferredLightUniforms.SourceRadius;
Out.SourceLength = bIsRadial ? DeferredLightUniforms.SourceLength : 0;
Out.SoftSourceRadius = DeferredLightUniforms.SoftSourceRadius;
Out.SpecularScale = DeferredLightUniforms.SpecularScale;
Out.ContactShadowLength = abs(DeferredLightUniforms.ContactShadowLength);
Out.ContactShadowLengthInWS = DeferredLightUniforms.ContactShadowLength < 0.0f;
Out.ContactShadowNonShadowCastingIntensity = DeferredLightUniforms.ContactShadowNonShadowCastingIntensity;
Out.DistanceFadeMAD = DeferredLightUniforms.DistanceFadeMAD;
Out.ShadowMapChannelMask = DeferredLightUniforms.ShadowMapChannelMask;
Out.ShadowedBits = DeferredLightUniforms.ShadowedBits;
Out.bInverseSquared = bIsRadial && DeferredLightUniforms.FalloffExponent == 0; // Directional lights don't use 'inverse squared attenuation'
Out.bRadialLight = bIsRadial;
Out.bSpotLight = InLightType == LIGHT_TYPE_SPOT;
Out.bRectLight = InLightType == LIGHT_TYPE_RECT;
Out.RectLightData.BarnCosAngle = DeferredLightUniforms.RectLightBarnCosAngle;
Out.RectLightData.BarnLength = DeferredLightUniforms.RectLightBarnLength;
Out.RectLightData.AtlasData.AtlasMaxLevel = DeferredLightUniforms.RectLightAtlasMaxLevel;
Out.RectLightData.AtlasData.AtlasUVOffset = DeferredLightUniforms.RectLightAtlasUVOffset;
Out.RectLightData.AtlasData.AtlasUVScale = DeferredLightUniforms.RectLightAtlasUVScale;
Out.HairTransmittance = InitHairTransmittanceData();
return Out;
}
FDeferredLightData InitDeferredLightFromUniforms()
{
uint LightType = LIGHT_TYPE_POINT;
if (DeferredLightUniforms.SpotAngles.x > -2.0f) { LightType = LIGHT_TYPE_SPOT; }
if (DeferredLightUniforms.RectLightBarnLength > -2.0f) { LightType = LIGHT_TYPE_RECT; }
return InitDeferredLightFromUniforms(LightType);
}
// Special version for mobil. Used only for punctual local light (point or spot)
FDeferredLightData SetupLightDataForStandardDeferred_Mobile(uint InLightType)
{
FDeferredLightData Out = (FDeferredLightData)0;
Out.TranslatedWorldPosition = GetDeferredLightTranslatedWorldPosition();
Out.InvRadius = DeferredLightUniforms.InvRadius;
Out.Color = DeferredLightUniforms.Color;
Out.FalloffExponent = DeferredLightUniforms.FalloffExponent;
Out.Direction = DeferredLightUniforms.Direction;
Out.SpotAngles = DeferredLightUniforms.SpotAngles;
Out.SpecularScale = DeferredLightUniforms.SpecularScale;
Out.ShadowMapChannelMask = DeferredLightUniforms.ShadowMapChannelMask;
Out.ShadowedBits = DeferredLightUniforms.ShadowedBits;
Out.bInverseSquared = DeferredLightUniforms.FalloffExponent == 0; // Directional lights don't use 'inverse squared attenuation'
Out.bRadialLight = true;
Out.bSpotLight = InLightType == LIGHT_TYPE_SPOT;
Out.bRectLight = false;
Out.HairTransmittance = InitHairTransmittanceData();
return Out;
}