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

39 lines
1.5 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
MeshDistanceFieldCommon.ush
=============================================================================*/
#pragma once
float DistanceToNearestSurfaceForObject(FDFObjectData DFObjectData, FDFVector3 WorldPosition, float MaxDistance)
{
const float3 VolumePosition = DFMultiplyDemote(WorldPosition, DFObjectData.WorldToVolume);
const float3 ClampedVolumePosition = clamp(VolumePosition, -DFObjectData.VolumePositionExtent, DFObjectData.VolumePositionExtent);
const float3 ToBox = (abs(VolumePosition) - DFObjectData.VolumePositionExtent) * DFObjectData.VolumeToWorldScale;
const float DistanceToBoxOutside = length(max(0.0f, ToBox));
const float DistanceToBoxInside = min(0.0f, max3(ToBox.x, ToBox.y, ToBox.z));
const float DistanceToBox = DistanceToBoxOutside + DistanceToBoxInside;
float DistanceToOccluder = MaxDistance;
BRANCH
if (DistanceToBox < MaxDistance)
{
DistanceToOccluder = DistanceToMeshSurfaceStandalone(ClampedVolumePosition, DFObjectData) * DFObjectData.VolumeScale + max(0.0f, DistanceToBox);
// Don't allow negative SDF distance to stick out of the bounding box
DistanceToOccluder = max(DistanceToOccluder, DistanceToBox);
}
return DistanceToOccluder;
}
float DistanceToNearestSurfaceForObject(uint ObjectIndex, FDFVector3 WorldPosition, float MaxDistance)
{
FDFObjectData DFObjectData = LoadDFObjectData(ObjectIndex);
return DistanceToNearestSurfaceForObject(DFObjectData, WorldPosition, MaxDistance);
}