Files
UnrealEngine/Engine/Shaders/Private/PathTracing/Volume/PathTracingCloudsCommon.ush
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

68 lines
1.5 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "../PathTracingCommon.ush"
#include "../../SkyAtmosphereCommon.ush"
#ifndef CloudClipX
float3 CloudClipX;
float3 CloudClipY;
float3 CloudClipZ;
float3 CloudClipCenterKm;
float CloudLayerBotKm;
float CloudLayerTopKm;
float CloudClipDistKm;
float CloudClipRadiusKm;
float CloudTracingMaxDistance;
float CloudRoughnessCutoff;
float CloudVoxelWidth;
float CloudInvVoxelWidth;
int CloudAccelMapResolution;
int CloudCallableShaderId;
#endif
float3x3 GetCloudClipBasis()
{
return float3x3(CloudClipX, CloudClipY, CloudClipZ);
}
float GetLowestCloudZ()
{
return sqrt(max(CloudLayerBotKm * CloudLayerBotKm - CloudClipDistKm * CloudClipDistKm * 2.0, 0.0));
}
float GetFarthestCornerDist()
{
return sqrt(2 * CloudClipDistKm * CloudClipDistKm + max(Square(GetLowestCloudZ() - CloudClipRadiusKm), Square(CloudLayerTopKm - CloudClipRadiusKm)));
}
float2 GetRadiusBounds()
{
float2 RBounds = float2(0, GetFarthestCornerDist());
float CloudLoKm = GetLowestCloudZ();
if (CloudClipRadiusKm < CloudLoKm)
{
RBounds.x = CloudLoKm - CloudClipRadiusKm;
}
else if (CloudClipRadiusKm > CloudLayerTopKm)
{
RBounds.x = CloudClipRadiusKm - CloudLayerTopKm;
}
return RBounds;
}
int2 PositionToVoxel(float2 P)
{
int2 Idx = int2((P + CloudClipDistKm * SKY_UNIT_TO_CM) * CloudInvVoxelWidth);
return clamp(Idx, 0, CloudAccelMapResolution - 1);
}
float2 VoxelToPosition(int2 Idx)
{
return (Idx * CloudVoxelWidth) - CloudClipDistKm * SKY_UNIT_TO_CM;
}