# CRT and retro

> CRT Royale, CRT Lottes, Easymode and other CRT shaders for retro and pixel-art games on macOS, with scanlines, phosphor glow and curved glass, plus palette effects and motion clarity.

Web page: https://procrastinine.github.io/maclauncher/graphics/crt-and-retro/

For decades, pixel art was drawn for cathode-ray tube (CRT) televisions and monitors, and CRT shaders give pixel-art games on a Mac the look of those screens. Artists knew that the electron beam would soften their pixels, that dark scanlines would separate the rows, and that the picture would glow through a phosphor mask, and they drew with that in mind. The [CRT Pixels](https://primagames.com/featured/interview-crt-pixels-jordan-starkweather-tells-us-why-retro-games-need-retro-screens) project made this widely known with side-by-side close-ups of real tubes. On a modern display every pixel is a hard-edged square, which is crisp but differs from what the artists saw.

*Image comparison, Square pixels and Built-in CRT: Sonic and Tails in Chemical Plant Zone, Sonic the Hedgehog 2.* Sonic the Hedgehog 2 (1992) at its native 320×240, enlarged 4×, then through the built-in CRT effect with the simulated content height set to the game's 240 rows.

Sprites drawn for a tube change the most. In this frame of Joe Musashi from Shinobi III, the lightning, the robe's shading and the dark rooftops blend into one picture:

*Image comparison, Square pixels and CRT Lottes: Joe Musashi throwing a shuriken in Shinobi III.* Shinobi III: Return of the Ninja Master (1993) at its native 320×224, enlarged 4×, through CRT Lottes with its screen and frame size set to 320×224.

## The built-in CRT effect

MacLauncher's own **CRT** effect works with every game, and its parameters control the main parts of the look.

**Simulated content height** sets how many scanlines to draw; its default of 240 matches many classic games. Set it to the game's original height and the scanlines keep that spacing however you resize the window, or set it to 0 to follow the image size.

**Scanline beam width** and **Scanline darkness** set how thick the lit lines are and how dark the gaps between them get. **Pixel softness** and **Phosphor glow** add the gentle blur and bloom of a real tube. **Screen curvature**, **Rounded corners**, **Edge shading** and **Screen edge fade** shape the glass, and **CRT strength** blends the whole effect with the original image.

## More CRT shaders

MacLauncher also includes several established CRT shaders, each with a different look:

**CRT Royale**

*Image: The Sonic 2 frame through CRT Royale.* CRT Royale: a detailed simulation of the phosphor mask, beam shape, halation and screen geometry.

**Lottes**

*Image: The Sonic 2 frame through CRT Lottes.* CRT Lottes: Timothy Lottes' shader, with a strong shadow mask and bright bloom.

**Easymode**

*Image: The Sonic 2 frame through CRT Easymode.* CRT Easymode: a clean, bright look with fine scanlines.

**GTU**

*Image: The Sonic 2 frame through GTU.* GTU: a softer, composite-video style signal.

**zfast**

*Image: The Sonic 2 frame through zfast CRT.* zfast CRT: lightweight and quick.

- **[CRT Royale](https://github.com/akgunter/crt-royale-reshade)** is Alex Gunter's [ReShade](https://reshade.me/) port of TroggleMonkey's widely used shader.
- **CRT Lottes**, **CRT Easymode**, **GTU** and **zfast CRT** come from [RSRetroArch](https://github.com/Matsilagi/RSRetroArch)'s ReShade ports of the [RetroArch](https://www.retroarch.com/) originals.

Several of these were written for emulators, where the shader knows the console's real resolution. They have **Screen** or **Frame** width and height parameters, which should be set to the game's original resolution so the scanlines line up with its pixels. The Lottes, Easymode, GTU and zfast samples above use Sonic the Hedgehog 2's 320×240, while CRT Royale is shown at its default settings.

The [libretro Slang collection](https://github.com/libretro/slang-shaders), available from **Runtimes → Graphics → Shaders → Collections**, adds CRT halation along with pixel-art scalers, dedithering and restoration filters. You can also import any `.slangp` preset you already use in RetroArch, including CRT presets. [Shader collections and imports](https://procrastinine.github.io/maclauncher/graphics/shaders.md) describes both.

## Where a CRT goes in the chain

A CRT effect needs several screen pixels for every game pixel to draw its scanlines and mask, so it belongs after the image has been enlarged to the window, usually by a **Nearest** upscale:

1. **Upscale**, Nearest, to the window.
2. **CRT**, with the game's original height.

Color effects can go before or after it, depending on whether you want to grade the game or the simulated screen. [Building a chain](https://procrastinine.github.io/maclauncher/graphics/composing-effects.md) has more on ordering.

## Palette and other retro looks

The included **Pixel palette** effect reduces each color channel to a few levels, with optional ordered dithering, which gives any game the limited colors of old hardware:

*Image comparison, Original and Pixel palette: Riders on a road in The Witcher 3.* Pixel palette with six levels per color channel and its default ordered dithering, on the full 1920×1080 frame from The Witcher 3: Wild Hunt.

*Image comparison, Original and Pixel palette: A close-up of the riders.* At 1:1, the dither pattern that stands in for the missing colors.

## Motion clarity

A CRT also drew each frame as a brief flash of light. Modern displays keep each frame lit until the next one replaces it, which makes moving objects look less sharp. The **Motion clarity** control in the chain's **Output** section recreates some of the CRT's sharpness. **Black frame insertion** shows dark frames between real ones, and **CRT beam** scheduling spreads each frame over several subframes to imitate a scanning beam. **Subframes**, **Visible duty** and **Brightness** adjust the scheduling, and **Auto** turns it on when a shader in the chain asks for it. The display's refresh rate limits how much room there is for subframes, so high-refresh displays benefit most.

The graphics guide lists the CRT effect's parameters under [included effects](https://procrastinine.github.io/maclauncher/reference/graphics/README.md#included-effects) and describes [motion clarity](https://procrastinine.github.io/maclauncher/reference/graphics/README.md#motion-clarity) in full.

## Further reading

- [Why retro games need retro screens](https://primagames.com/featured/interview-crt-pixels-jordan-starkweather-tells-us-why-retro-games-need-retro-screens), an interview with the creator of CRT Pixels.
- [CRT emulation for pixel art](https://www.gamedeveloper.com/art/opinion-crt-emulation-for-pixel-art), a developer's take on what a convincing CRT simulation needs.
- [Why retro games look better on old-school CRT TVs](https://www.slashgear.com/2274532/why-retro-games-look-better-on-old-school-crt-tvs/), from SlashGear.
- [CRT simulation in a GPU shader, looks better than BFI](https://blurbusters.com/crt-simulation-in-a-gpu-shader-looks-better-than-bfi/), Blur Busters on rolling-scan CRT simulation for motion clarity.
- The [libretro shader introduction](https://docs.libretro.com/shader/introduction/), for RetroArch's shader presets.
