Hmm yeah I actually rotate my monitor just like in the arcade but I suppose you cant rotate the monitor vertically and so are playing vertical games rotated onto a horizontal screen?
Just checked and it does work in MBZ__1__ADV.slangp. It defaults to vertical scanlines on a vertically oriented game and the parameter to switch scanline direction works correctly.
Maybe it doesn’t work in the Megatron variant because the Megatron bits are handling the scanlines?
Righto, I don’t have a practical way to physically rotate my monitor.
Any prospect of getting vertical scanlines working in vertical games on the horizontal screen in Megatron, or at least the Mega Bezel Megatron variant? I’m in love with your shader and I want to be able to use it for everything.
Update: I was able to get vertical scanlines working in Megatron with the following super hacky workaround:
-In MAME core, rotate the game 90 degrees. The scanlines stay horizontal, so they are now vertical with respect to the game.
-In Retroarch, rotate the video output back 90 degrees. The game is now vertically oriented with vertical scanlines, but the aspect ratio is all wrong and the image is way too wide. Mega Bezel is confused because it thinks the X axis of my monitor is 2160 pixels and the Y is 2160. To get my desired actual pixel resolution of 1440x1920, some trickery is needed:
-What Mega Bezel displays as the Y resolution is the actual Y resolution divided by my monitor’s 1.77 aspect ratio, and what it displays as the X resolution is the actual X divided by the inverse of the aspect ratio, 0.5625.
-To get the actual 0.75 aspect ratio that I want, I must therefore set the explicit aspect ratio as: 4.21299177, or (4/0.5625)/(3/1.77)
-Following that, I must set the non-integer scaling ratio to 37.5, which is my desired X axis resolution of 1440 divided by my monitor’s X axis resolution of 3840. Otherwise, the huge aspect ratio setting results in an image much larger than my screen.
-The result is that I get an image that Mega Bezel says is 810x3414, but it looks correct. Applying the rules above: 810/0.5625 = 1440 3414/1.77 = 1920.375
-The only real side effect is that the Mega Bezel resolution info is rotated and so is my overlay, the latter being easily fixable.
While this series of steps does work, I’d certainly rather not have to apply it to every single vertical arcade game… but if it’s unlikely the Megatron shader can be made to generate vertical scanlines, I’m prepared to do it!
Just put all your vertical games in the same directory and save a directory preset.
This would help some, but it’s a lot of manual work to pick out the hundreds of vertical arcade games and move them. Then I’d also have to update their paths in Launchbox, which I use heavily.
Even having done that, my workaround requires the games to be rotated within the MAME core, which is not a Retroarch setting, so it can’t have a content directory preset – I’d have to do that individually for every vertical game.
If there’s any prospect of this functionality being implemented in the shader, it’d save me a lot of work.
Maybe you can start here as this is something that I know has been discussed extensively before:
You can also use FB-NEO for your vertical games exclusively after putting them in their separate folder.
Well I would say yes lets get this sorted for you BUT as I was writing that I realised the shader wont really work with a non rotated monitor. The reason is because it relies on the sub pixel layout being ordered left to right as RGB (or some variant). In your case it wont be and youll have a wierd stair casing effect on each pixel as RGB sub pixels will be laid out on different vertical sub pixels. Hmm ok so maybe it wont be accurate but we may get away with it as we do with QD-OLEDs etc. Lets try! Just I need to find the time now!
I know it has been said, but these filters in HDR are truly amazing once you get them working. I am in shock how incredible they look. Side note - I noticed the higher the TVL the brighter the image is, I would think it would be backwards, no? 300 TVL is much dimmer on my LG OLED than the 600 and 1000 preset for JVC D-Series.
at a given resolution, the more tvl you give the more phosphors are present and so the image will have less black lines and will always look brighter. The brightest is when phosphors blend together, but you will not want that unless you always play at very far away distance from your screen.
I personally play at 4k sdr on a 28 inc screen and i do not like cranking the brigthness everytime i play a retro game for this shader, so i come up with balanced tweaks to brigthness and use an 800tvl for perfect phospors density, if i put 1000tvl they blend togheter, the image is noticibly brighter but there’s no aperture grill madness i always like. Probably slotmask are great for when the phospors blend together, but that tends to dim it more with more black lines in the mask.
On my screen this looks much more a premium pvm than many other shaders which often have poor masks that do not allow for that kind of aperture grill like in megatron one.
The downside is features and some polishing. Like auto ntsc on megatron is not working properly, in the images i sent you, i set it to phase 3 manually cause on auto it sets to 2 and is not ideal. Also i miss the magic bloom which could really help megatron often dim image.
I personally do not like switching to high brightness display everytime, i found for me the tricks to make it brighter look close to having max brightness cranked up on display so i can keep a one standard for all usage cases.
Essentially, it comes down to how many subpixels are being turned on or off depending on the mask. Think about it: to illuminate a full white screen, assuming a standard RGB subpixel layout, without a mask you would, of course, have the following going on:
RGBRGBRGBRGBRGBRGBRGB
With a 1000 TVL Trinitron mask on a 4K TV, to illuminate the same white screen, you’ll instead have the following:
RxBxGxRxBxGxRxBxGxRxB
As you can see, only half the subpixels are lit under such a setup, so effectively that’s half your brightness gone. Now let’s look at 600 TVL:
RxxxBxxxGxxxRxxxBxxxG
Only a quarter of the subpixels are lit up here, so yet another halving. That said, here’s 300 TVL:
RxxRxxxBxxBxxxGxxGxxx
This actually has the same number of subpixels lit up as before, and actually, testing it on my screen, it’s actually a bit brighter than the 600TVL 4K mask for some reason. Not exactly sure why there would be a difference in brightness here.
Great to hear you’re liking the shader! With respect to bloom and brightness etc This is the core decision when writing CRT simulations: do you try and get accurate masks or do you try and get the brightness by turning on more sub pixels (usually via bloom or not 100% masks) i.e the pixels that should be black if you are simulating say an aperture grille accurately.
CRTs are usually far far brighter at the point of the scanning point. Overall when you turn off the amount of sub pixels you need to accurately simulate a CRT (probably near 90% of the sub pixels) then most CRTs are brighter than any LED TV and definitely any OLED. Then turn on something like BFI technology and youre starting to look at 2000+ nits in a flat screen to accurately simulate.
Long and short is that lower brightness means a less faithful simulation of a CRT but you get the benefit of a simpler setup and wider compatibility. The exception to the rule is AMOLED screens on a mobile phone these are by far the best displays if they had 4K resolutions. They are much clearer in motion than my QDOLED and are far brighter. But still not as clear as a CRT which are still king.
Messing around with my subpixel mask function, it looks like this one may work:
vec3 shadow[6][4] = {
{blue, blue, blue, black},
{green, green, green, black},
{red, red, red, black},
{blue, black, blue, blue},
{green, black, green, green},
{red, black, red, red},
};
It gets a lot of rainbowing if the scaling’s off, though.
This is a photo of a real arcade CRT Monitor.
There’s no “Magic Bloom” that you can turn up and down. Anything like that, that you see in real life is due to the laws of physics being at play.
That’s what Sony Megatron Color Video Monitor is about and that’s actually what makes it great!
There are so many other shaders which already do it in the “hacky” way for want of a better word. Do we really need another one?
When Sony Megatron Color Video Monitor is setup correctly and works properly, especially when paired with that same NTSC shader. The results are just mind blowing! At some point when the polish is completed and all the masks work on all the different layout types and actual displays, I think I would like to do some presets and also get the word out there even more. It would make no sense to do it right now because it’s still a bit tricky to get just right for many users.
A new preset pack should definitely help with that.
But once you see what this shader can really do it feels as if nothing else is needed. This shader is also probably one of the best options for arcades which are replacing their dead or dying CRTs with LCD monitors.
It really helps how light on resources and efficient it is. My cellphone hardly breaks a sweat on in, yet it provides probably the best visuals or at least it’s up there with the best!
Once this is done and all masks and features work properly, this will probably be one if the best if not best shader out there.
To me polish would include a little database for paper white and luminance settings or some preset sharing like what’s going on with other shaders so that people users can just load a preset and it’s almost guaranteed to look good on their TV/displau because someone else with that display or a similar one already vetted it.
I don’t agree that this is not working properly. Are you sure you understand how it’s supposed to work? What do you mean by less than ideal? 2 phase will always be less sharp than 3 phase and have more colour bleed at the same resolution so you can adjust the resolution scale factor to suit.
The shader selects the phase automatically based on the input resolution. On some systems that use different resolutions in a single game, the phase can actually change within the same game.
I am no expert, that’s just my observation of how it works.
Magic glow is a toggle in crt guest shader, im not asking to have it natively integrated and always enabled, i might ask that features like those are indeed integrated. Would you say that all the features in the current megatron presets are essential only? More features do not change the current shader, makes it more in par with new discoveries and tricks for various panels. I mean, i know the quality of this shader and is always the one i go back to as my main, so it’s not at all a diminuishing of your work on this shader, it’s really more as there are little things that keep me from going to other shaders, why having only mask accuracy in here when there’s more than meets the eyes. Or if you can guide me on how to integrate crt guest magic bloom in here i could end up doing it myself no problem.
That’s not the aperture grill im referring to, it is more like that of pvm 2730qm in the first images which i find insane, but more full like that of the real first image. So far i could only make it in this shader and as you say i think it’s personally the best for mask creation.
About ntsc on normal shaders like the default from mega bezel reflective shader the auto ntsc never leaves as default the one with more color bleed, like in sonic phase 2 on megatron is dark blue and the red shooes are violet…like not even the worst composite will give you those results. In mega bezel auto ntsc works properly. Also in ninja gaiden fences and shinobi iii waterfall.
I’ll leave most of what you said for @MajorPainTheCactus to respond to. I support his pure, accurate approach, ethos and scope 100%. He has also explained the rationale behind this in prior posts.
In this shader the solution to brightness, bloom and glow all comes from the display and not any sort of computational solution. It’s extremely fast for what it does. Once you add logic including other shaders it’s going to slow things down.
The NTSC Shaders have been successfully integrated with Sony Megatron Color Video Monitor, just as Mega Bezel Reflection Shader has integrated Sony Megatron Color Video Monitor so the proof of concept is there that this beautiful shader and module can be combined with other shaders.
RetroArch now has the Prepend/Append feature so it’s even easier to combine stuff. This isn’t always so straight forward as scaling and filtering settings also need to be on point. I also remember @HyperspaceMadness mentioning that he has a tool which was made to make it easier to build and combine shaders. I think it’s what he uses to make Mega Bezel Presets.
On the flip side, since the work has been done to bring HDR Support to RetroArch, what do you think the results might be like if other shaders started to include support for HDR? Perhaps that’s something that you can try asking other shader developers to start supporting and adding to their shaders.
I think that would be revolutionary.
Is this for a 90 deg rotated slot mask?
So one thing about ntsc signal is that you should be able to slot in any emulation of it you want - I think Ive got one slotted in for the CTV300 (or its called something like that) preset. You should be able to swap that one out for another as its essentially just a filter done on the frontend of the shader - a ‘pre shader’ if you like.
yeah, rotated slot. (padding to character minimum)
Speaking of NTSC emulation, I went ahead and decoupled crt-guest-advanced-ntsc’s NTSC passes into their own standalone preset, since it has improvements over the existing NTSC-Adaptive. It should work with Megatron, I think. Here it is:
shaders = "5"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "PrePass0"
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/ntsc/ntsc-pass1.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "NPass1"
float_framebuffer1 = "true"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "4.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass2.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = ""
float_framebuffer2 = "true"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "0.500000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass3.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = ""
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/custom-fast-sharpen.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "NtscPass"
float_framebuffer4 = "false"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"