Program Listing for File Upscaling.usf
↰ Return to documentation for file (Shaders/Upscaling.usf)
#include "/Engine/Public/Platform.ush"
#include "/Gamekit/Upscaling_Patterns.ush"
RWTexture2D<float> OutputTexture;
Texture2D<float> InputTexture;
uint2 Dimensions;
uint TimeStamp;
uint Multiplier;
#define TEXEL_2x2(a, b, c, d) uint(uint(a) << 3 | (uint(b) << 2) | (uint(c) << 1) | (uint(d)))
#define IS_VISIBLE(X) (X > float(uint(1 << 6)) / float(1 << 7))
// clang-format off
[numthreads(THREADGROUPSIZE_X, THREADGROUPSIZE_Y, THREADGROUPSIZE_Z)]
void MainComputeShader(uint3 GroupId : SV_GroupID,
uint3 ThreadId : SV_DispatchThreadID,
uint3 GroupThreadId: SV_GroupThreadID,
uint GroupdIndex : SV_GroupIndex)
// clang-format on
{
uint2 Pos = ThreadId.xy;
uint P_00 = IS_VISIBLE(InputTexture[Pos + uint2(0, 0)]);
uint P_10 = 0;
uint P_01 = 0;
uint P_11 = 0;
if (Pos.x + 1 < Dimensions.x)
{
P_10 = IS_VISIBLE(InputTexture[Pos + uint2(1, 0)]);
}
if (Pos.y + 1 < Dimensions.y)
{
P_01 = IS_VISIBLE(InputTexture[Pos + uint2(0, 1)]);
}
if (Pos.x + 1 < Dimensions.x && Pos.y + 1 < Dimensions.y)
{
P_11 = IS_VISIBLE(InputTexture[Pos + uint2(1, 1)]);
}
uint Pattern = TEXEL_2x2(P_00, P_10, P_01, P_11);
uint PatId = Pattern * 16;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
int x = Multiplier * Pos.x + j;
int y = Multiplier * Pos.y + i;
int z = PatId + i * 4 + j;
OutputTexture[uint2(x, y)] = float(PatternMap[z]) / float(0xFF);
// OutputTexture[uint2(x, y)] = InputTexture[Pos];
}
}
}