I don’t call this finalized but it seems to do the job, made it a long time ago:

float3 Result = float3(0,0,0);
float2 PaletteDimensions;
PaletteTexture.GetDimensions(PaletteDimensions.x, PaletteDimensions.y);
float2 ClosestColorUV = float2(0, 0);
float ClosestDistance = 99999999;
for (int x = 0; x <= PaletteDimensions.x; x++) {
for (int y = 0; y <= PaletteDimensions.y; y++) {
const float2 CurrentPaletteUV = float2(x / PaletteDimensions.x, y / PaletteDimensions.y);
const float3 PaletteSample = Texture2DSample(PaletteTexture, PaletteTextureSampler, CurrentPaletteUV);
const float Distance = length(Image - PaletteSample);
if (Distance < ClosestDistance) {
ClosestDistance = Distance;
ClosestColorUV = CurrentPaletteUV;
}
}
}
Result = Texture2DSample(PaletteTexture, PaletteTextureSampler, ClosestColorUV);
return Result;
