New CRT shader from Guest + CRT Guest Advanced updates

I would use mask 2, BGR subpixels cause my screen is RGB, mask dark 0.1, slot mask bright 0.7, slot mask dark 0.9, slot mask width 3, post brightness 1.3 or so.

4 Likes

Ah, of course, there are Lottes masks too! I was trying to reach that result with Trinitron masks turned into slots, gonna try your solution first.

3 Likes

I would also give mask 10(?) a try, 1440p should be just enough.

I can whip up some settings real quick a bit later.

Have you confirmed the subpixel layout of your display?

EDIT: now I’m not sure what mask I’m referring to, looks like 10 is another aperture grille

2 Likes

I don’t think that Lottes looks like any actual TV’s mask pattern.

I have a RGB W-LED monitor (Asus MX27AQ). Here’s what I’ve achieved with mask 10. The overall effect is what I was looking for but I need to tinker a little more with the scanlines. I always have the problem of finding the right width and height for the right slot mask effect, @guest.r I think a little guide for each mask (with size, subpixel layout, things like that) would be cool. :smiley:

P.S.: the image compression kills the mask, hope you can still appreciate it.

1 Like

@Fab

Use these settings with mask 10

shadowMask = "10.000000"
slotmask = "1.000000"
slotmask1 = "1.000000"
slotwidth = "4.000000"
double_slot = "2.000000"
3 Likes

Lottes mask 1 is a TV style shadow mask, mask 2 is an aperture grille which you can turn to slot mask like guest’s Trinitron masks. Ideally mask 3 would be an arcade monitor (which I’m trying to achieve, not TV) but…I don’t like it. :smiley:

2 Likes

mask 3 doesn’t really resemble any CRT mask but it kinda works at a distance.

I think mask 10 needs HDR to look bright enough, or a ridiculous amount of bloom. Not surprising, it results in a full 75% reduction in the active subpixels (only 1/4th are on at any given time) when it’s at 100% strength.

1 Like

Yeah I use 0.60 bloom and 1.10 bright boost because my monitor has a luminance of 300 cd/m2, at least the double would be needed to have an optimal image. I’m quite happy, still.

2 Likes

Hey @guest.r

First of all, thanks for your excellent WinUAE CRT shaders you posted to the English Amiga Board forums a while ago. I’ve been using CRT-A2080-HiRes-SmartRes with great satisfaction (with increasing the sharpness settings a bit), I just love it!

I’ve stumbled upon this thread by sheer luck when looking for some good (S)VGA shaders for DOSBox, and since you only seem to be active here these days, I thought I’d take the opportunity to contact you through this forum.

  • First of all, while CRT-A2080-HiRes-SmartRes is awesome, it doesn’t handle interlaced modes quite correctly when movement is involved (e.g. smooth scrolling credit screens in 640x512 keep jumping around a bit; still images are fine though). Your other shader CRT-Guest-SM-Hires-SmartRes-Interlace handles these situations perfectly well, so I was wondering if it would be possible to add the same good interlace support to CRT-A2080, as I really prefer the look of that shader personally? While this is not super important, it makes a difference in some demos and game intros that use hi-res interlaced. (As a stretch goal, it would be also nice to have an option for interlace flicker for that extra retro feeling, but that’s really really down on my wishlist :slight_smile:)

  • Have you considered porting your new work back to WinUAE or DOSBox Staging? Especially in DOSBox land, we’re in dire need of some good subtle VGA and SVGA shaders.

I understand if you don’t want to touch those old shaders and don’t care about DirectX & HLSL anymore, but I thought there’s no harm in asking! :slight_smile: In any case, you’ve done more than enough already with those stellar WinUAE shaders of yours, so thanks again! Cheers!

5 Likes

@Rincewind You might want to take a look at these CRT Shader projects as well.

3 Likes

Hey there!

NP to contact me here, i check this thread quite often. I’m also glad you like the shader. It’s not as sophisticated as the newer Retroarch ‘GDV’, but i also use it with WinUAE.

You can check my github page, as i added the ‘interlace’ version. ‘Flickering’ interlacing can’t be done with WinUAE atm., since it lacks a frame counting uniform variable. Toni has mentioned that a new shader implementation is on the (distant) TODO list though, but i understand i could be a real pita to implement since it would definitely break existing configs or be at least a separate addon. But maybe there is a way…I might continue to develop nicer shaders with WinUAE if this happens.

DOSBox is definitely easier to run as a standalone emulator, although afaik the main fork doesn’t support shaders, not sure about frontends. I think cool shader support comes with this version:

dunno if there is anything newer.

The problem, as always, is that the shader support is rudimentary and doesn’t involve easier tweaking of variables, or preset support. In general i didn’t intend to develop more dosbox shaders, although some can be found in the fs-uae thread for the discontinued ykhwong fork. I guess i might also do some more stuff if there is a new fork with cool shader handling (at least similat to bsnes or mame).

I did a lot of crt shader development recently with ‘gdv’ progression, took most of my developing ‘resources’. :grin: Developing a complex shader for a simple environment is sometimes quite hard though as it can get quite slow and hard to tweak, some things are impossible to implement etc. I might find some motivation if a shader environment is advanced, although for now it’s a nice niche option to run DOSBox for example with Retroarch for the enhancing effects.

Anyway, i’m glad for the fedback and last but not least, the WinUAE github page:

Best wishes,

guest.r

5 Likes

While having the shader support built-in is obviously preferred, you can run many RetroArch shaders (including guest.r’s excellent work) on top of other programs via shaderglass and I know some of libretro’s shaders have been ported to Reshade, as well.

10 Likes

Thanks for that, it’s working great! In the meantime I realised that tweaking the sharpness of your A2080 shader was a mistake; when using your defaults (and if the image is properly antialiased) all sharp edges just melt away, as if by magic, just like on my 14" Philips monitor back in the day! I remember I was quite disappointed when I got my first PC with a much higher quality monitor, everything looked so blocky suddenly and I couldn’t understand why…

Here’s a few pics of your shader in action together with the mask+glow ReShade effects; as far as I’m concerned, I don’t think I need anything better, I’m in emulated Amiga heaven now! :sunglasses: I only dialed back the brightboost a bit because there was too much highlight-crushing going on (e.g. most of the detail of the hair highlights on the Einstein portrait was lost) and just compensated it by increasing my monitor contrast. Now we’re cooking on gas!

Hmm, I was convinced I saw interlace-flicker in some demos in WinUAE, but I must be confusing it with VICE, as that definitely can do it. Funny how back in the 80s/90s everyone wanted to get rid of the flicker, but now it’s a highly prized emulator feature for nostalgic reasons!

Yeah that’s true, I’m using DOSBox Staging which is kind of a soft-fork of mainline DOSBox SVN that has rudimentary shader support (single-pass GLSL only, no oversampling, and no presets, like you said). Some nice bloke ported a bunch of single-pass shaders over, but it’s a pain to adjust the parameters…

Man, GDV looks so cool! Although I’m more after the slighly defocused slot-mask Amiga monitor look, this is the best shader I’ve seen in this style! You’ve put so much subtle detail in it, it’s awesome.

I’ve perused the RetroArch shader architecture docs the other day and seems like they’ve given it a lot of thought, indeed. Don’t expect anything like that to come to DOSBox land anytime soon… But I’ve also realised that trying to emulate VGA/SVGA on 1080p is a fool’s errand; DOSBox Staging’s default “sharp bilinear” scaling filter is all you need for 320x200, then 2x integer scale for 640x480 and that’s it! Anything else I’ve looked at just makes the picture quality a lot worse (at least on 1080p), and to be honest, there is no “magic” in emulating double-scanned VGA…

For EGA games, I spent whole yesterday tweaking crt-hyllian-updated in conjunction with your ReShade glow+mask filter, and I managed to come up with something that I like. It’s remarkable how it’s quite hard to push the Hyllian shader into aliasing/moire territory even with non-integer ratios – just look at the checkerboard-pattern and the subtle 640x350 scanlines on white background on the Spellcasting screenshot, it’s flawless.

Anyway, probably enough of me derailing the thread already. Nice chat & keep up the good work! Cheers!

3 Likes

Not really sure what’s causing the black crush here? Didn’t seem to be an issue with previous versions?

shaders = "12"
shader0 = "shaders_slang/misc/grade.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/stock.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "StockPass"
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/guest/advanced/afterglow0.slang"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "AfterglowPass"
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/crt/shaders/guest/advanced/pre-shaders-afterglow.slang"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "true"
alias3 = "PrePass"
float_framebuffer3 = "false"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/crt/shaders/guest/advanced/avg-lum.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
alias4 = "AvgLumPass"
float_framebuffer4 = "false"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/advanced/linearize.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "LinearizePass"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "absolute"
scale_x6 = "800"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "GlowPass"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "absolute"
scale_x7 = "800"
scale_type_y7 = "absolute"
scale_y7 = "600"
shader8 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
float_framebuffer8 = "true"
srgb_framebuffer8 = "false"
scale_type_x8 = "absolute"
scale_x8 = "800"
scale_type_y8 = "absolute"
scale_y8 = "600"
shader9 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = "BloomPass"
float_framebuffer9 = "true"
srgb_framebuffer9 = "false"
scale_type_x9 = "source"
scale_x9 = "1.000000"
scale_type_y9 = "source"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "false"
srgb_framebuffer10 = "false"
scale_type_x10 = "viewport"
scale_x10 = "1.000000"
scale_type_y10 = "viewport"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/deconvergence.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "false"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "viewport"
scale_y11 = "1.000000"
g_crtgamut = "0.000000"
g_vignette = "0.000000"
glow = "0.000000"
brightboost = "0.500000"
brightboost1 = "0.500000"
beam_min = "1.600000"
beam_max = "1.500000"
shadowMask = "2.000000"
maskDark = "0.000000"
maskLight = "1.000000"
mask_layout = "1.000000"
mclip = "0.000000"
gamma_out = "2.000001"
post_br = "1.999999"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"
1 Like

You need to set the 10th pass float framebuffer to “true”. It’s an issue with older presets and new shader files.

2 Likes

lol, what happened :joy:

starting from scratch with my installation…

1 Like

What’s wrong with https://github.com/realnc/dosbox-core :stuck_out_tongue: You can use the guest advanced HD shader with that:

3 Likes

Thanks for the tip. Well, I don’t think anything is wrong with it if it suits your needs :slight_smile: I personally strongly prefer regular standalone emulators for a variety of reasons (much easier to tweak things by writing configs, for a start), and I only use them sitting in front of my PC monitor, so I wouldn’t benefit much from RetroArch anyway (except for the advanced shader support, yes, that’s the only thing, everything else about it is however a drawback to me). DOSBox Staging has a number of improvements over DOSBox SVN – for example the patch I contributed to it that restricts the output in fullscreen to a smaller area (I prefer to have the physical dimensions of the image match that of a 14/15" CRT). There’s lots of little things like that, but I get it, not everybody likes to tweak things to the last minute detail.

Having said that, that VGA preset of yours looks quite nice, indeed! Although when I scale it down to 1120x840 or 1024x768 (this is how I play VGA games), most of the effect is lost. I’d also dial the bloom back quite a bit, I don’t think VGA monitors from the early/mid-90s had this much bloom.

1 Like

CRT shaders benefit from more pixels. Especially when you’re trying to emulate VGA resolutions. I would say it’s pretty much impossible to get any sort of convincing CRT effect with 840 lines. Even 1080p has issues. 3 LCD lines per 1 CRT line is about the minimum you can get away with. So for 640x400 VGA, that means 1200p, and for 640x480 it’s 1440p.

As a side note, dosbox-core supports conf files now and it syncs them with the core options :wink: You create a .conf file for your game, and then simply add that conf file to your retroarch DOS playlist. For example, here is Ultima VII.conf:

[dos]
xms = true
ems = false
umb = false

[cpu]
cycles = fixed 15000

[autoexec]
@echo off
mount c drive_c
mixer sb 50:50 /noshow
c:
cd ultima71
ultima7.com
exit

You can then add that file to your playlist and also download some thumbnails for it:

Any conf options you specify will then be respected by the core options UI and appear “[Locked]”:

If you really can’t live without making the screen smaller, you can then reduce the image size in the shader. guest-advanced-hd has overscan settings. You can reduce X and Y overscan to negative values, which will shrink the image. Or you can do that through retroarch itself (Settings->Video->Scaling.)

Btw, I’m not saying that this is better than using a stand-alone dosbox. Just saying that you can do things you may not have been aware of :slight_smile:

2 Likes