52 lines
1.5 KiB
HLSL
52 lines
1.5 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
/*=============================================================================
|
|
LumenRadianceCacheCommon.ush
|
|
=============================================================================*/
|
|
|
|
#pragma once
|
|
|
|
#include "LumenRadianceCacheInterpolation.ush"
|
|
|
|
FRadianceCacheCoverage GetRadianceCacheCoverageWithUncertainCoverage(float3 RayOrigin, float3 RayDirection, float ClipmapDitherRandom)
|
|
{
|
|
FRadianceCacheCoverage Coverage;
|
|
Coverage.bValid = false;
|
|
Coverage.MinTraceDistanceBeforeInterpolation = 10000000.0f;
|
|
|
|
uint ClipmapIndex = GetRadianceProbeClipmap(RayOrigin, ClipmapDitherRandom);
|
|
|
|
if (ClipmapIndex < NumRadianceProbeClipmaps)
|
|
{
|
|
float3 ProbeCoordFloat = GetRadianceProbeCoordFloat(RayOrigin, ClipmapIndex);
|
|
float3 CornerProbeCoordFloat = ProbeCoordFloat - .5f;
|
|
int3 CornerProbeCoord = floor(CornerProbeCoordFloat);
|
|
Coverage.bValid = true;
|
|
|
|
UNROLL
|
|
for (int Z = 0; Z < 2; Z++)
|
|
{
|
|
UNROLL
|
|
for (int Y = 0; Y < 2; Y++)
|
|
{
|
|
UNROLL
|
|
for (int X = 0; X < 2; X++)
|
|
{
|
|
int3 ProbeCoord = CornerProbeCoord + int3(X, Y, Z);
|
|
uint ProbeIndex = GetProbeIndexFromIndirectionTexture(ProbeCoord, ClipmapIndex);
|
|
|
|
if (ProbeIndex == INVALID_PROBE_INDEX)
|
|
{
|
|
Coverage.bValid = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
float CellOcclusionDistance = GetRadianceProbeClipmapCellSize(ClipmapIndex) * sqrt(3.0f);
|
|
Coverage.MinTraceDistanceBeforeInterpolation = GetRadianceProbeTMin(ClipmapIndex) + CellOcclusionDistance;
|
|
}
|
|
|
|
return Coverage;
|
|
}
|