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.
To set a reshade shader do this
DISPLAY=:0 xprop -root -f GAMESCOPE_RESHADE_EFFECT 8u -set GAMESCOPE_RESHADE_EFFECT effect_filname
where the shader is in
~/.local/share/gamescope/reshade/Shaders