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

67 lines
1.9 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "../LightGridCommon.ush"
#define SUPPORT_CONTACT_SHADOWS 0
#define NON_DIRECTIONAL_DIRECT_LIGHTING 0
#include "../DeferredLightingCommon.ush"
#define DOWNSAMPLE_FACTOR 2
#define MAX_LOCAL_LIGHT_NUM 1024
#define MAX_LOCAL_LIGHT_INDEX (MAX_LOCAL_LIGHT_NUM - 1)
#define SHARED_LIGHT_MASK_SIZE (MAX_LOCAL_LIGHT_NUM / 32)
struct FLightSample
{
uint LocalLightIndex;
float Weight;
bool bVisible;
bool bCompleted;
};
FLightSample InitLightSample()
{
FLightSample LightSample;
LightSample.LocalLightIndex = MAX_LOCAL_LIGHT_INDEX;
LightSample.Weight = 0.0f;
LightSample.bVisible = false;
LightSample.bCompleted = true;
return LightSample;
}
uint PackLightSample(FLightSample LightSample)
{
uint PackedLightSample = LightSample.LocalLightIndex & 0xFFF;
PackedLightSample |= LightSample.bVisible ? 0x8000 : 0;
PackedLightSample |= LightSample.bCompleted ? 0x4000 : 0;
PackedLightSample |= f32tof16(LightSample.Weight) << 16;
return PackedLightSample;
}
FLightSample UnpackLightSample(uint PackedLightSample)
{
FLightSample LightSample;
LightSample.LocalLightIndex = PackedLightSample & 0xFFF;
LightSample.bVisible = PackedLightSample & 0x8000 ? true : false;
LightSample.bCompleted = PackedLightSample & 0x4000 ? true : false;
LightSample.Weight = f16tof32(PackedLightSample >> 16);
return LightSample;
}
uint MegaLightsStateFrameIndex;
uint DownsampleFactorMultShift;
/**
* Returns sample jitter offset in the range [0, DOWNSAMPLE_FACTOR - 1]
*/
uint2 GetSampleScreenCoordJitter(uint2 DownsampledScreenCoord)
{
uint2 CellIndex = DownsampledScreenCoord % 2;
uint LinearIndex = CellIndex.x + CellIndex.y * 2;
LinearIndex = (LinearIndex + MegaLightsStateFrameIndex) % 4;
// 4-rooks sampling pattern
uint2 Jitter;
Jitter.x = LinearIndex & 0x02 ? 1 : 0;
Jitter.y = LinearIndex & 0x01 ? 0 : 1;
return Jitter;
}