Easy fix for Master System decentering, with a shader


#1

Simply add image adjustment to your chain, and then set XPOS to 0.033000.

Of course doing it game by game would be a chore, so I recommend splitting the core and use different folders for the various Sega systems.


#2

Thanks for this! The salt was real with the master system decentering!


#3

The image is already centered - that’s just how overscan on a real master system works. Moving the x position will just end up leaving you with a column of blank pixels on the right instead of on the left. Also if you’re using the same core for Megadrive games and have that shader set per core it will mess up Megadrive games.


#4

No it won’t, look at the image. Or even better, try it yourself. It’s simple enough.

Do I need to repeat myself?

Splitting the core means you can save independent shader presets/cfgs/opts/etc.

Capture Capture2

(I use the ‘main core’ for Mega CD and Mega Drive, and two splits for MS and GG).

More examples

Perfectly centered and stretched, no bars at all.

The horizontal shift is obviously corrected with custom aspect ratio settings. These are for 720p on a 1080p screen.

custom_viewport_width = "1000"
custom_viewport_height = "720"
custom_viewport_x = "156"
aspect_ratio_index = "23"

By the way width is 1000 because at 960x720 (real 4:3), MS games look skinny to me.


#5

What shaders are you using? Just curious.


#6
shaders = "8"

feedback_pass = "0"

shader0 = "shaderpath\shaders_glsl\anti-aliasing\shaders\aa-shader-4.0-level2\aa-shader-4.0-level2-pass2.glsl"
filter_linear0 = "true"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"

shader1 = "shaderpath\shaders_glsl\misc\image-adjustment.glsl"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = ""
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"

shader2 = "shaderpath\shaders_glsl\misc\color-mangler new.glsl"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = ""
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"

shader3 = "shaderpath\shaders_glsl\crt\shaders\crt-easymode-halation\linearize.glsl"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = ""
float_framebuffer3 = "false"
srgb_framebuffer3 = "true"

shader4 = "shaderpath\shaders_glsl\crt\shaders\crt-easymode-halation\blur_horiz.glsl"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = ""
float_framebuffer4 = "false"
srgb_framebuffer4 = "true"

shader5 = "shaderpath\shaders_glsl\crt\shaders\crt-easymode-halation\blur_vert.glsl"
filter_linear5 = "false"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "true"

shader6 = "shaderpath\shaders_glsl\crt\shaders\crt-easymode-halation\threshold.glsl"
filter_linear6 = "false"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "false"
srgb_framebuffer6 = "true"

shader7 = "shaderpath\shaders_glsl\crt\shaders\crt-easymode-halation\crt-easymode-halation.glsl"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"

parameters = "AAOFFSET2;target_gamma;monitor_gamma;overscan_percent_x;overscan_percent_y;saturation;contrast;luminance;black_level;bright_boost;R;G;B;ZOOM;XPOS;YPOS;V_OSMASK;H_OSMASK;gamma_boost_r;gamma_boost_g;gamma_boost_b;sat_r;sat_g;sat_b;lum;cntrst;r;g;b;rg;rb;gr;gb;br;bg;blr;blg;blb;GAMMA_INPUT;GAMMA_OUTPUT;SHARPNESS_H;SHARPNESS_V;MASK_TYPE;MASK_STRENGTH_MIN;MASK_STRENGTH_MAX;MASK_SIZE;SCANLINE_STRENGTH_MIN;SCANLINE_STRENGTH_MAX;SCANLINE_BEAM_MIN;SCANLINE_BEAM_MAX;GEOM_CURVATURE;GEOM_WARP;GEOM_CORNER_SIZE;GEOM_CORNER_SMOOTH;INTERLACING_TOGGLE;HALATION;DIFFUSION;BRIGHTNESS"

AAOFFSET2 = "0.100000"

target_gamma = "2.300000"
monitor_gamma = "2.200000"
overscan_percent_x = "0.000000"
overscan_percent_y = "0.000000"
saturation = "0.900000"
contrast = "0.920000"
luminance = "1.000000"
black_level = "-0.030000"
bright_boost = "-0.050000"
R = "1.000000"
G = "1.000000"
B = "1.050000"
ZOOM = "1.000000"
XPOS = "0.033000"
YPOS = "0.000000"
V_OSMASK = "0.000000"
H_OSMASK = "0.000000"

gamma_boost_r = "0.100000"
gamma_boost_g = "0.100000"
gamma_boost_b = "0.100000"
sat_r = "1.000000"
sat_g = "1.000000"
sat_b = "1.000000"
lum = "1.000000"
cntrst = "1.000000"
r = "1.000000"
g = "1.000000"
b = "1.000000"
rg = "0.050000"
rb = "0.050000"
gr = "0.000000"
gb = "0.050000"
br = "0.000000"
bg = "0.050000"
blr = "0.000000"
blg = "0.000000"
blb = "0.000000"

GAMMA_INPUT = "2.400000"
GAMMA_OUTPUT = "2.200000"
SHARPNESS_H = "0.100000"
SHARPNESS_V = "0.100000"
MASK_TYPE = "3.000000"
MASK_STRENGTH_MIN = "0.075000"
MASK_STRENGTH_MAX = "0.200000"
MASK_SIZE = "1.000000"
SCANLINE_STRENGTH_MIN = "0.250000"
SCANLINE_STRENGTH_MAX = "0.500000"
SCANLINE_BEAM_MIN = "1.000000"
SCANLINE_BEAM_MAX = "1.000000"
GEOM_CURVATURE = "0.000000"
GEOM_WARP = "0.020000"
GEOM_CORNER_SIZE = "0.010000"
GEOM_CORNER_SMOOTH = "150.000000"
INTERLACING_TOGGLE = "0.000000"
HALATION = "0.150000"
DIFFUSION = "0.000000"
BRIGHTNESS = "1.000000"

That’s the whole chain, very similar to the one I’m currently using for most 240p content. As you can see, the color mangling is certainly more subtle than with the Mega Drive, which seems to output much yellower greens!

It works well with modern MS games, which are quite bright. Older ones for some reason are darker. +0.40-ish gamma boost (starting from the preset above) makes those look fine. The MS has a very limited color palette and a low resolution of just 256x192, so it’s a bit tricky to make it look pretty, especially using non integer and stretching vertically to fill the screen. But I’m very happy with these results : )


#7

Of course. Even on NTSC, pixels are almost 15% wider on the MS, you only end up with 4:3 with borders included.