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

58 lines
1.5 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
CopyTextureShaders.usf:
Generic shader for copying 2D, 2D Array and 3D texture resources
=============================================================================*/
#include "Common.ush"
uint3 DstOffset; // Front upper left texel in the destination texture to start writing data to
uint3 SrcOffset; // Front upper left texel in the source texture to start reading data from
uint3 Dimensions; // The total x,y,z number of texels in the copy region
#if SRC_TYPE == 0
Texture2D <VALUE_TYPE> SrcResource;
#define SRC_ADDR(p,o) ((p).xy + (o).xy)
#elif SRC_TYPE == 1
Texture2DArray<VALUE_TYPE> SrcResource;
#define SRC_ADDR(p,o) ((p).xyz + (o).xyz)
#elif SRC_TYPE == 2
Texture3D <VALUE_TYPE> SrcResource;
#define SRC_ADDR(p,o) ((p).xyz + (o).xyz)
#endif
#if DST_TYPE == 0
RWTexture2D <VALUE_TYPE> DstResource;
#define DST_ADDR(p,o) ((p).xy + (o).xy)
#elif DST_TYPE == 1
RWTexture2DArray<VALUE_TYPE> DstResource;
#define DST_ADDR(p,o) ((p).xyz + (o).xyz)
#elif DST_TYPE == 2
RWTexture3D <VALUE_TYPE> DstResource;
#define DST_ADDR(p,o) ((p).xyz + (o).xyz)
#endif
#define COMP(a,b) (((a).x < (b).x) && ((a).y < (b).y) && ((a).z < (b).z))
[numthreads(THREADGROUPSIZE_X, THREADGROUPSIZE_Y, THREADGROUPSIZE_Z)]
void CopyTextureCS(uint3 Position : SV_DispatchThreadID)
{
if (COMP(Position, Dimensions))
{
DstResource[DST_ADDR(Position, DstOffset)] = SrcResource[SRC_ADDR(Position, SrcOffset)];
}
}