tldr: Fringing happens because the subpixels are not properly aligned. It can be alleviated by "shifting" the underlying data to colocale in the center of the pixel. On the Samsung Panel, a simplistic solution to this is as follows:
green_amt = 0.2
red_amt = 0.4
blue_amt = 0.3
for i in range(1, im.shape[0]-1):
for j in range(1, im.shape[1]-1):
green_out[i, j] = green[i, j+1]*(green_amt) + green[i, j]*(1-green_amt)
red_out[i, j] = red[i, j-1]*(red_amt) + red[i, j]*(1-red_amt)
blue_out[i, j] = blue[i+1, j]*(blue_amt) + blue[i, j]*(1-blue_amt)
outim[:, :, 1] = green_out
The above ignores that green/red are a bit above the center and blue alternates between being in the left and right. Refinements are possible but for my personal usecases are not necessary at the moment.
Setting with vkbasalt
Installer: https://github.com/simons-public/steam-deck-vkbasalt-install
Copy shader to ~/.config/reshade/Shaders
Put the following in ~/.config/vkBasalt/vkBasalt.conf