9 Answers
Here's a tight checklist I stick to when I want believable scanlines: enable integer scaling/1:1 pixel mapping, disable linear filtering, pick a dedicated scanline shader (or a CRT shader with scanline toggles), set scanline opacity to a moderate value (around 0.25–0.5), keep width narrow (1–2 pixels), and add tiny jitter if available. I also slightly bump contrast and avoid any post-processing sharpening from the monitor. If the emulator supports shader chaining, put the scanlines after the nearest-neighbor scaler and before any final CRT curvature or vignette. Test with a few games like 'Super Mario World' to make sure HUD elements stay readable. I find that subtlety wins — too strong and it feels gimmicky; just right and it brings back afternoons on a tube TV. That warm, imperfect look never gets old.
I tend to obsess over the little details, so when I dial in scanlines I do a few small but consistent things. First, I force the emulator's internal resolution to an integer multiple of the original source (e.g., 3x for a 256-wide image becomes 768), and I disable any smoothing filters that blend pixels. That combination keeps pixels hard-edged so the scanline shader can sit cleanly between rows.
Next, I choose a shader that supports masks and persistence: an aperture-grille or dot-mask option makes the scanlines feel like they're interacting with the pixels instead of just being overlaid. I usually set intensity around 30–50% and give each scanline a slight vertical offset or jitter; it mimics how old sets weren't perfectly stable. Finally, I fiddle with gamma and contrast to get the phosphor glow right, because scanlines are as much about the light bleed as they are about the dark lines. It takes a few minutes but the result is way more immersive for playing classics like 'Mega Man 2'.
Pixel-perfect nostalgia is a tiny obsession of mine, and scanlines are the easiest trick to sell that feeling. I usually start by nailing the pixel grid: enable integer scaling so every emulated pixel maps to an exact block on your display (no fractional scaling, no blurring). Turn off linear filtering/texture smoothing in the emulator so the shader sees hard edges to work with.
From there I layer the scanlines shader on top of a simple nearest-neighbor scale. For authenticity I like a thin 1–2px scanline with a multiply/blend mode and an opacity around 25–50% depending on the game — higher for washed-out 8-bit palettes, lower for richer 16/32-bit art. Add optional jitter or phase-shift to simulate the uneven draw of old CRTs and a tiny amount of vertical blur or phosphor bloom if you want glow. Finally, tweak gamma and contrast slightly (gamma ~1.0–1.1, contrast +5–10%) and check on different backgrounds so the blacks don’t crush. I often test with 'Super Metroid' and 'Sonic the Hedgehog' to see how scanlines treat both dark dithered areas and bright sprite edges — it makes a big difference to the vibe, and I usually end up keeping them on for late-night retro sessions.
Short checklist vibe: use nearest-neighbor scaling + integer multiples, enable a scanline or CRT shader, tweak scanline opacity and width, and add slight blur or bloom for glow. Make sure the emulator's display mode keeps the original aspect ratio (for NTSC 4:3 or PAL 4:3) and set the refresh rate to match the region (60Hz/50Hz). Avoid bilinear filtering unless you want soft pixels — authentic scanlines like crisp edges with a dark band between rows. If your emulator supports vertical jitter, low-level phosphor persistence, or shadow-mask emulation, try those for extra realism. I test with a few screenshots to get the balance right and end up smiling every time the old visuals pop.
There's something almost cinematic about getting scanlines right: it turns a pixel image into a memory. I tend to approach it like a designer — think of pixels as paint, and scanlines as the canvas texture. Start by getting a clean, integer-scaled image with nearest filtering, then layer either a thin consistent scanline or a variable dot mask depending on whether you want a 'TV' or 'monitor' look. Adjust opacity so the black lines disappear in darker scenes but remain visible on midtones; you want them to read as texture, not a distraction.
Adding a touch of curvature or vignette helps sell the illusion, and matching color bleed or gamma to how CRTs handled bright colors makes highlights feel right. I often test on scenes from 'Super Metroid' or 'Final Fantasy VI' because their palettes reveal subtleties. In the end, the best scanlines are the ones you barely notice until you switch them off — that's when you know you nailed it, and I always grin when that happens.
If you're chasing that warm, slightly fuzzy TV glow that made playing 'Chrono Trigger' on a CRT feel like magic, here's how I get authentic scanlines in emulators.
Start with pixel-perfect scaling: set the emulator to use nearest-neighbor (point) filtering and choose an integer scale (2x, 3x, 4x) so pixels line up perfectly. That prevents half-pixel blurring that ruins scanline alignment. Then apply a dedicated scanline or CRT shader — the simple scanline shaders are great for crisp horizontal lines, while shaders like 'crt-royale' or 'crt-pi' simulate phosphor bloom, curvature, and shadow masks for more realism.
Tweak shader parameters: reduce scanline opacity until the lines look like printed dark bands rather than black bars, set line thickness to match your scale (1 pixel at 3x, 2 at 4x sometimes), and add a touch of blur or bloom to mimic phosphor glow. Also match refresh rate (50 vs 60Hz), enable V-sync to avoid tearing, and if available add slight vertical jitter or mask patterns for that authentic wobble. I usually test with 'Super Metroid' and adjust until it feels like the old TV — it's a little ritual that always makes me smile.
Late-night tinkering turned me into a bit of a scanline hawk. When I want believable scanlines quickly, I pick a shader designed for CRT effects (something like 'CRT Royale' or a simple 'scanlines' glslp), set integer scaling, switch off bilinear filtering, and then adjust the shader's scanline opacity and width. I like subtlety: too thick or too dark and the image looks like it’s printed on ruled paper; too faint and you lose the point. If the shader supports it, I add a shadow mask or a faint phosphor glow to break up the flatness. Also remember to disable any TV/monitor sharpening, and if your display has a 'game mode', use it to reduce latency and avoid extra processing. I usually tweak settings while playing a few screens of 'The Legend of Zelda: A Link to the Past' to see how sprites and backgrounds hold up. End result? A cozy, scanlined presentation that feels vintage but stays readable—perfect for chill runs.
If you want the technical side: think in layers and sampling. I split the pipeline mentally: first, get the source to an integer-multiple resolution; second, apply a pixel-preserving shader that adds a 1-pixel dark line every N rows (N matching the original pixel aspect); third, optionally pass through a CRT emulate shader for curvature, shadow mask, and phosphor bloom. Shader parameters to watch are scanline_strength/opacity, scanline_width (usually 1–2), scanline_phase/jitter, and any mask/stripe settings. For NTSC-style warmth add a tiny chroma bleed and subpixel jitter — but be conservative so text remains legible. Emulators like RetroArch let you chain shaders, which is ideal: run a nearest filter, then scanlines, then a gentle CRT. Also check vsync and refresh rate — a mismatch creates tearing that breaks immersion more than any shader will fix. I experiment with different settings across 'Chrono Trigger' and pixel-heavy platforms to ensure sprites don’t gain ugly halos; it’s surprisingly satisfying the first time the screen finally looks like an old living-room TV.
My tinkering side loves the shader chain approach: render the game at a clean integer-scaled framebuffer, then run a fidelity-first shader (nearest filtering), followed by a scanline shader, and finally a light bloom/curvature pass. That ordering preserves pixel integrity while letting the scanline shader modulate brightness without corrupting the underlying geometry. Technical parameters I watch are scanline blend mode (multiply vs. additive), per-line opacity, and whether the shader simulates an aperture grille or a dot mask; multiply usually looks natural because it darkens without washing highlights.
For sync, I lock to the original frame rate and enable V-sync in the host so scanline position remains stable. If you want interlaced authenticity for systems that used 480i, use a shader or emulator option that simulates interlace flicker or field alternation. RetroArch, MAME, and some standalone front-ends expose all these knobs; the satisfying part is dialing them in until sprites have that soft halo and the lines feel like part of the screen. I enjoy the subtle differences more than I'd admit to friends.