67 lines
1.9 KiB
HLSL
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;
|
|
} |