Guest-Advanced 4k HDR1000 experiments

It was fun for about a day, then the high wore off and I started to notice all of the problems.

The problem is that entire colors are dimmed, and this happens to already dim colors.

I think the problem is with the mask and scanlines adding too many black pixels to dark colors, confusing the algorithm and making it think “this should be black.”

The algorithm works very well for very high contrast content - like old black background games with a few bright colors. It’s the midtones that get screwed up.

So, yeah… True Black HDR1000 can’t get here fast enough.

1 Like

I understand, not all miniLED backlight algorithms are the same though and more dimming zones also help with the brute forcing. The problem with the IPS miniLED is its over reliance on the local dimming technology to achieve an acceptable level of contrast. Due to VA’s superior native contrast ratio, a VA miniLED might not need to be so aggressive.

Also, on my display, I can tailor what gets prioritiezed by choosing a different tonemapping setting. For example Detail Preferred, Balanced, Brightness Preferred and High-Dynamic.

Maybe it’s time to trade up for a miniLED with more modern features and technology?

To summarize, local dimming performance can vary considerably between different brands and models across the miniLED landscape and this variance can range from excellent - near OLED performance to practically unusable - just a checkbox to tick.

1 Like

Maybe, but this display is no slouch- It’s basically just a rebranded version of this:

I’m not super confident that the dimming issue I’m describing can ever be completely resolved, but a less aggressive dimming and/or more dimming zones might help reduce it.

True Black HDR1000 will save us all, hopefully. I’m a bit worried that it will remain restricted to small screen devices.

2 Likes

By the way, have you been able to access similar firmware updates to the Cooler Master?

1 Like

I’ve been meaning to do that- might give that a shot a later today.

1 Like

Seems the download was removed?

1 Like

Thanks, should be working now :smiley:

1 Like

Update 10/21:

Reduced presets, added instructions for mask settings- minimizes the number of presets, and I like keeping things simple.

A few tweaks to gamma, brightness boosts, etc

Added magic glow 0.02 - I think it helps mimic more realistic phosphor behavior

Minor tweaks to sharpness

Added a new mode, “Enhanced S-video,” featuring “smart dithering deblur.” Basically the cleanest possible image with separate Y/C.

2 Likes

Update 10/28:

Local dimming is back!

Local dimming really doesn’t interfere with the peak brightness at all, it’s just that it really doesn’t like certain masks. So I tested every single mask combination and narrowed it down to the ones that work.

Lately, I’ve also been asking: how much brightness is really enough? My experiments show that 200 nits is not sufficient. 300 nits is when it’s starting to get too bright (need to increase mask strength, scanlines or something to compensate). 250-300 nits is the sweet spot. 100 nits on a CRT isn’t the same as 100 nits on an LCD. I’ve come to the conclusion that we should not be targeting 100 nits in our shader setups. 250 nits is the right target for “CRT feel.” So, my target is now a minimum of 250 nits with masks and scanlines applied. This eliminated a lot of possibilities.

Color fringing when using any doubled phosphor width mask is another thing that’s been troubling me. E.g., RRGGBBX always has bad color fringing on white text. I haven’t found a good solution for this problem, so I stopped using these masks, for now. EDIT: ok, this is solved by lowered sharpness. In the RGB version, reduce horizontal sharpness to 5.00. However, I can’t get RRGGBBX up to 250 nits, so leaving it out of this collection for now.

I’ve also adjusted bright boosts and scanlines so that bright and dark parts of the image are adjusted equally, in order to preserve the original color range of the image.

And as always, sharpness tweaking was required- once I gave up on RRGGBBX, etc, it resulted in a different strategy and made things a lot easier.

HDR1000, Local Dimming Enabled:

https://mega.nz/file/tmURwAra#u5JPvkF2AvECOet_Sgvwa5JfCeBC_9DRMD1l66hJflQ

3 Likes

This explains why even HDR1000 is not enough for many full-strength masks. The full screen brightness of HDR1000 is 600 nits. HDR1400 is what we need, with a full screen brightness of 900 nits.

https://displayhdr.org/performance-criteria/

The “Full-screen Long-duration Test” is what matters.

True Black HDR1000 will not save us, since it only reaches 500 nits for the full-screen long duration test.

The best displays for CRT emulation are MiniLED displays with HDR1400.

1 Like

This TV can do that:

953 cd/m²

This one’s right behind it:

768 cd/m²

This is the one I have:

542 cd/m²

Now it’s a large screen so I sometimes prefer a smaller, denser and brighter image using smaller Integer Scale Sizes, for example 8x or 6x.

At 50% Window Size Sustained Brightness: 860 cd/m².

The QM8K can do Sustained 50% Window 982 cd/m².

The QM9K can do Sustained 50% Window 1,293 cd/m².

While the QM851G can do Sustained 50% Window 1,792 cd/m² !

Remember these TV’s are huge compared to the typical 27"-32" monitors that many of us use so sometimes it just feels better to not use the full screen when emulating old skool games which many of us played on much tinier screens.

So I would say that the QM751G provides one of the best experiences I’ve had so far with CRT Emulation. In hindsight it’s just too bad I couldn’t afford and was reluctant to go with the larger starting size of 65" for the QM851G.

The QM8K and QM9K must also be commended for being brighter than the QM751G while also offering RGB subpixel layout along with Wide Angle Viewing Technology.

I could imagine getting some bargain deals on those in the not too distant future though. It’s only because of my experience with the QM751G that I can easily traject what an amazing experience it might be to use a QM851G for CRT Emulation.

I would qualify this statement a bit maybe by saying that they are the best for most usage scenarios or for most aspects of CRT emulation because OLED still destroys them in a completely dark room and especially if you’re moving around in that space.

We do know that OLED has its own limitations when it comes to subpixel layout compatibility, peak and sustained brightness, agressive ABL and risk of burn-in though.

1 Like

There are a few TVs that may meet the minimum brightness required for HDR1400 but don’t meet some other qualification. If someone has one of those already, great. I believe the spec was introduced by VESA this year.

HDR1400 is the spec to look for.

https://displayhdr.org/certified-products/#tab-1400

OLED appears to be maxing out at 500 nits (full screen sustained)- that’s for a high end True Black HDR1000 display (currently only on small screen devices). 500 nits still has some limitations with full strength masks, since some masks are over a 90% reduction in brightness.

Per pixel dimming (True Black) is the main advantage, but I haven’t seen a 1000+ dimming zone display yet, I don’t know how it compares.

Smaller screens are preferable for retro gaming IMO, you get better PPI (which helps masks), better viewing distances for SDR content, etc. A 27” 16:9 monitor is roughly 20” in 4:3, which is perfect.

1 Like

The problem with these types of displays and why OLED kills them in a dark room is less because of blooming due to a lack of zones and more because this blooming is exaccerbated by changes in viewing angle. Not only that, colour saturation, tint, gamma and brightness are also affected by changes in viewing angle, then there’s the black smearing and not as good motion handling and pixel response that all contribue to a less than ideal immersion experience in areas where OLED excels. OLED is close to perfect in almost all of these areas and it’s not because of per pixel dimming only, it’s also because of the lack of optical distortions caused the different layers which the light has to pass through before reaching the viewer’s eyes as well as the optical distance difference between the light source, front of the panel and user’s eyes. Things like refractions e.t.c all contrbute to this worse viewing angle performance and sub-optimal viewing angle position leads to everything that’s bad about LCD technology looking even worse.

1 Like

Yes, I agree viewing angle is a problem for MiniLED TVs. It’s less of a problem for monitors or setups where you’re expected to sit directly in front of the display. I think most MiniLED TVs should still have a wide enough viewing angle for a 3 seat sofa setup.

1 Like

with a full screen brightness of 900 nits.

My searing retinas when I bring up the RetroArch menu. x.x 400 nits sears my eyes as it is.

1 Like

Greetings @Nesguy, Have you tried the RYCBX Mask? I’ve found it to be noticeably brighter than either RRGGBBX and RGBX masks and it looks great too.

Does CRT-Guest-Advanced have that Mask?

1 Like

Funny you should mention it, I just finished tweaking a guest-advanced preset using this mask.

It’s a nice mask, very close to consumer TVLs for a nicer/larger TV in the 90s (432 according to triad count), and it has the brightness advantage you mentioned.

This is intended for HDR1000, local dimming ON:

shaders = "19"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
filter_linear0 = "false"
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/crt/shaders/guest/advanced/stock.slang"
alias1 = "StockPass"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "false"
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"
alias2 = "AfterglowPass"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
filter_linear2 = "true"
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"
alias3 = "PrePass0"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
filter_linear3 = "true"
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/interlace-ntsc.slang"
alias4 = "InterlacePass"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
filter_linear4 = "true"
float_framebuffer4 = "true"
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/ntsc/ntsc-pass1.slang"
alias5 = "NPass1"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
filter_linear5 = "false"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "4.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass2.slang"
alias6 = ""
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
filter_linear6 = "true"
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "0.500000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass3.slang"
alias7 = ""
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
filter_linear7 = "true"
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/advanced/custom-fast-sharpen.slang"
alias8 = "NtscPass"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
filter_linear8 = "true"
float_framebuffer8 = "false"
srgb_framebuffer8 = "false"
scale_type_x8 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
alias9 = "PrePass"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
filter_linear9 = "true"
float_framebuffer9 = "false"
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/avg-lum-ntsc.slang"
alias10 = "AvgLumPass"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "true"
filter_linear10 = "true"
float_framebuffer10 = "false"
srgb_framebuffer10 = "false"
scale_type_x10 = "source"
scale_x10 = "1.000000"
scale_type_y10 = "source"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/linearize-ntsc-new.slang"
alias11 = "LinearizePass"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
filter_linear11 = "true"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "source"
scale_x11 = "1.000000"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass1.slang"
alias12 = "Pass1"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
filter_linear12 = "true"
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "viewport"
scale_x12 = "1.000000"
scale_type_y12 = "source"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/guest/hd/gaussian_horizontal.slang"
alias13 = ""
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
filter_linear13 = "true"
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "800"
scale_type_y13 = "source"
scale_y13 = "1.000000"
shader14 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
alias14 = "GlowPass"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
filter_linear14 = "true"
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "absolute"
scale_x14 = "800"
scale_type_y14 = "absolute"
scale_y14 = "600"
shader15 = "shaders_slang/crt/shaders/guest/hd/bloom_horizontal.slang"
alias15 = ""
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
filter_linear15 = "true"
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "absolute"
scale_x15 = "800"
scale_type_y15 = "absolute"
scale_y15 = "600"
shader16 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
alias16 = "BloomPass"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
filter_linear16 = "true"
float_framebuffer16 = "true"
srgb_framebuffer16 = "false"
scale_type_x16 = "absolute"
scale_x16 = "800"
scale_type_y16 = "absolute"
scale_y16 = "600"
shader17 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass2.slang"
alias17 = ""
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
filter_linear17 = "true"
float_framebuffer17 = "true"
srgb_framebuffer17 = "false"
scale_type_x17 = "viewport"
scale_x17 = "1.000000"
scale_type_y17 = "viewport"
scale_y17 = "1.000000"
shader18 = "shaders_slang/crt/shaders/guest/advanced/deconvergence-ntsc.slang"
alias18 = ""
wrap_mode18 = "clamp_to_border"
mipmap_input18 = "false"
filter_linear18 = "true"
float_framebuffer18 = "false"
srgb_framebuffer18 = "false"
scale_type_x18 = "viewport"
scale_x18 = "1.000000"
scale_type_y18 = "viewport"
scale_y18 = "1.000000"
CP = "-1.000000"
wp_saturation = "1.200000"
cust_artifacting = "0.000000"
cust_fringing = "0.000000"
ntsc_scale = "2.500000"
ntsc_taps = "6.000000"
CDETAILS = "0.000000"
gamma_out = "2.000000"
HSHARPNESS = "1.500000"
SIGMA_HOR = "0.600000"
S_SHARP = "1.500000"
HSHARP = "2.000000"
MAXS = "0.300000"
HARNG = "0.500000"
spike = "0.000000"
m_glow = "2.000000"
glow = "0.100000"
gamma_c = "1.050000"
brightboost = "1.250000"
brightboost1 = "1.000000"
gsl = "1.000000"
scanline1 = "5.000000"
scanline2 = "40.000000"
beam_min = "1.250000"
beam_max = "0.950000"
scans = "2.000000"
shadowMask = "14.000000"
maskstr = "0.750000"
mcut = "1.000000"
slotmask = "0.750000"
slotmask1 = "1.000000"
deconrry = "1.000000"
deconrby = "-1.000000"
post_br = "1.500000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_mipmap = "false"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_mipmap = "false"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_mipmap = "false"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_mipmap = "false"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
1 Like

It’s a mask that I had just happened to have left in by accident when I was transforming Sony Megatron’s 8K Masks to all RGB variants because I preferred the height of the 8K (Slot) Masks over the 4K ones.

When using BFI these “noticeable” brightness differences end up equating to significant brightness differences and as subtle as the difference is in my opinion with BFI on vs off at 60Hz on my TV, I find myself not wanting to play without BFI and any gain in brightness equates to a much more CRT-like experience when treading just at the threshold of what might be construed as too dim.

Even though I really like my Dot Mask and it only loses brightness slightly vs Aperture Grille with the options I have available, I’m gravitating more and more to the brighter Aperture Grille.

So what a coincidence indeed. Take a look at my CyberLab SDR to HDR conversion steps and my Mega Bezel 4K HDR presets, they take a hybrid approach of getting things bright using HDR and with very slight mitigations and most of the mask saturation remains intact. I did those for an HDR400 display.

1 Like

Somehow this reverted to mask 12, should be mask 14 in guest-advanced- give it a try now

The problem when adjusting shaders is that brighter will almost always look better in a side-by-side comparison so long as nothing is getting clipped too severely. This naturally leads us to aperture grilles.

1 Like

I understand what you’re saying but I think in my case it has more to do with necessity because everything else is a bit below the threshold of where it needs to be when I combine things like BFI and my new “Energy Redistributing” scanline dynamics, which is just high contrast, high colour accuracy scanline dynamics and relies on me to either play in the dark or just get used to it.

If it were the former, I would have stuck with Aperture Grille a very long time ago but it has been years since Aperture Grille has been a major feature of my preset packs. So it’s more me just learning about and accepting the limitations of my display as I get even better at this and being willing to now entertain something other than pure RGB for my Mask colours, which is something that I’m known for I guess.

At some point I might get fedup of Aperture Grille again or the experiment might be over but for me it’s a sort of renaissance to have all these things combine to give me that CRT-like experience that I’m going for. I’m thinking that if I had something like a QM851G instead of a QM751G I would be able to use the other masks and have a similar experience because I would surely be over these thresholds that I’m faced with here.

So I think in this case brighter is actually better because everything else is just still too dim.

1 Like