Files
UnrealEngine/Engine/Shaders/Private/Landscape/LandscapeEditLayersUtils.usf
2025-05-18 13:04:45 +08:00

189 lines
4.6 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "../Common.ush"
#include "LandscapeCommon.ush"
// ----------------------------------------------------------------------------------
#if defined (__INTELLISENSE__)
// Uncomment the appropriate define for enabling syntax highlighting with HLSL Tools for Visual Studio :
//#define MARK_VALIDITY 1
//#define COPY_QUADS 1
//#define COPY_QUADS_MULTISOURCE 1
//#define COPY_WEIGHTMAP 1
//#define RESOLVE_LAYER_DATA 1
#endif // defined (__INTELLISENSE__)
// ----------------------------------------------------------------------------------
#if COPY_QUADS
// CopyQuadsPS inputs/outputs :
Texture2D<float4> InSourceTexture;
#endif // COPY_QUADS
#if COPY_QUADS_MULTISOURCE
// CopyQuadsMultiSourcePS inputs/outputs :
// Helper macro for handling an array of N textures (currently using 63 because 64 is the maximum supported number of SRV on all platforms needing to run this) :
#define FOREACH_SOURCETEXTURE(op) \
op(0) \
op(1) \
op(2) \
op(3) \
op(4) \
op(5) \
op(6) \
op(7) \
op(8) \
op(9) \
op(10) \
op(11) \
op(12) \
op(13) \
op(14) \
op(15) \
op(16) \
op(17) \
op(18) \
op(19) \
op(20) \
op(21) \
op(22) \
op(23) \
op(24) \
op(25) \
op(26) \
op(27) \
op(28) \
op(29) \
op(30) \
op(31) \
op(32) \
op(33) \
op(34) \
op(35) \
op(36) \
op(37) \
op(38) \
op(39) \
op(40) \
op(41) \
op(42) \
op(43) \
op(44) \
op(45) \
op(46) \
op(47) \
op(48) \
op(49) \
op(50) \
op(51) \
op(52) \
op(53) \
op(54) \
op(55) \
op(56) \
op(57) \
op(58) \
op(59) \
op(60) \
op(61) \
op(62)
Buffer<uint2> InQuadInfos; // .x = source texture index, .y = source texture channel (for weightmaps)
// Define N input textures :
#define DECLARE_SOURCE_TEXTURE(n) Texture2D<float4> InSourceTexture_##n;
FOREACH_SOURCETEXTURE(DECLARE_SOURCE_TEXTURE)
#undef DECLARE_SOURCE_TEXTURE
#endif // COPY_QUADS_MULTISOURCE
#if RESOLVE_LAYER_DATA
Texture2D<float4> InSourceTexture;
#endif // RESOLVE_LAYER_DATA
// ----------------------------------------------------------------------------------
// Pixel shaders :
#if MARK_VALIDITY
void MarkValidityPS(out float OutValidity : SV_Target0)
{
OutValidity = 1.0f;
}
#endif // MARK_VALIDITY
// ----------------------------------------------------------------------------------
#if COPY_QUADS
void CopyQuadsPS(float4 SvPosition : SV_POSITION, float2 QuadUV : TEXCOORD0, out float4 OutColor : SV_Target0)
{
OutColor = InSourceTexture.SampleLevel(GlobalPointClampedSampler, QuadUV, 0);
}
#endif // COPY_QUADS
// ----------------------------------------------------------------------------------
#if COPY_QUADS_MULTISOURCE
void CopyQuadsMultiSourcePS(float4 SvPosition : SV_POSITION, float2 SourceUV : TEXCOORD0, float2 UnusedQuadUV : TEXCOORD1, float InRectIndex : RECT_INDEX, out float4 OutColor : SV_Target0)
{
uint QuadIndex = (uint)InRectIndex;
int SourceTextureIndex = InQuadInfos[QuadIndex].x;
float4 ColorSample = 0.0f;
BRANCH
switch (SourceTextureIndex)
{
#define IMPLEMENT_SAMPLE_SWITCH_CASE(n) case n: ColorSample = InSourceTexture_##n.SampleLevel(GlobalPointClampedSampler, SourceUV, 0); break;
FOREACH_SOURCETEXTURE(IMPLEMENT_SAMPLE_SWITCH_CASE);
#undef IMPLEMENT_SAMPLE_SWITCH_CASE
default:
break;
}
OutColor = 0.0f;
#if COPY_WEIGHTMAP
// For weightmaps, copy from the appropriate channel and pack :
uint SourceChannelIndex = (uint)InQuadInfos[QuadIndex].y;
float Weight = ColorSample[SourceChannelIndex];
OutColor = float4(PackWeight(Weight), PackWeightAlpha(1.0f, EWEIGHTMAPALPHAFLAGS_NONE));
#else // COPY_WEIGHTMAP
OutColor = ColorSample;
#endif // !COPY_WEIGHTMAP
}
#endif // COPY_QUADS_MULTISOURCE
// ----------------------------------------------------------------------------------
#if RESOLVE_LAYER_DATA
void ResolveLayerData(in float4 SVPos : SV_POSITION, out float4 OutColor : SV_Target0)
{
OutColor = 0;
float4 ColorSample = InSourceTexture.Load(int3(SVPos.xy, 0)); // xy = coordinates, z = mip level
// TODO [jonathan.bard] : since this step is not a plain copy anymore, we should be able to support different format types (e.g. instead
// of expecting heightmaps to be compressed, we could read it in a different way) and support different input resolutions (e.g. BP brushes
// wouldn't have the necessity to use the same resolution as the merge RT). We could also support an alpha channel and/or other alpha flags :
#if RESOLVE_WEIGHTMAP
float Weight = ColorSample.x;
OutColor = float4(PackWeight(Weight), PackWeightAlpha(1.0f, EWEIGHTMAPALPHAFLAGS_NONE));
#else // RESOLVE_WEIGHTMAP
// Currently, it's just a plain copy for heightmaps :
OutColor = ColorSample;
#endif // !RESOLVE_WEIGHTMAP
}
#endif // RESOLVE_LAYER_DATA