Godot Analog Presentation
From godot-game-skills by @themarco · View on GitHub
Build and debug Godot 4 VHS/CRT presentation with separate signal and display stages, reactive camera effects, distinct in-world screen materials and comfort controls. Use for analog camera or television rendering.
This skill ships inside the godot-game-skills package. Install the package to get this skill plus everything else in the bundle.
sv install themarco/godot-game-skillsGodot Analog Presentation
Add tape/VHS-style presentation to a Godot 4 game: signal degradation (noise, tracking, dropouts, chroma error) as one stage, display emulation (tube, grain) as a separate stage. Apply the same separation to in-world displays when needed; prerecorded content can retain its own presentation preset.
Workflow
- Separate signal from display. Degrade the recorded signal first, then
display that result on an emulated tube. Either stage can be toggled independently, and the display stage must also accept a clean image.
- Order effects deliberately. Document your pass order (e.g. tape signal,
then tube display, then grain). Changing order changes the look; treat it as an authored choice, not plumbing.
- Distinguish live feed from in-world media. The player-camera feed may
carry extra wear and reactive damage; recordings shown on in-world screens keep their own preset. Share a base material factory, then layer live-only wear on top — never the reverse.
- Drive damage from gameplay with attack and release. Threat proximity or
events raise corruption fast and let it settle slowly, so footage breaks before the cause is visible and recovers after it is gone. Keep the corruption value in the controller, not in the shader.
- Protect comfort and accessibility. Provide a reduced-intensity path that
lowers flicker, slip, and loss effects, and a temporary clean-debug view that suppresses all presentation without changing saved preferences.
- Check the real renderer. Screen-reading shaders behave differently per
renderer. Consult the official docs for your engine version — the screen-reading shaders for screen texture sampling, the Viewport docs and BackBufferCopy docs for capture nodes — and verify API names against your version rather than trusting remembered calls.
For pass-ordering notes and a comfort-field pattern, read references/stage_order.md.
Adaptation criteria
Preset values, damage intensity, attack/release rates, and which effects exist at all are art direction — tune them against your own scenes and target hardware. Effect sample counts are not GPU time estimates; measure on device.
Common failures
- Reading the screen buffer with a call that does not exist in the project's
engine version — always verify against versioned docs.
- One-frame exposure lag from sampling a stale copy after the source changed.
- Debug suppression that silently rewrites the player's saved preferences.
- Live-feed damage leaking onto in-world recordings via a shared material.
- Judging the look from headless or thumbnail captures instead of the real
display path at full frame rate.
Verification
- Headless runs can assert controller state (holds, corruption curves,
preference preservation) but cannot show the look. Graphical captures must run on the target renderer with production settings.
- Compare captures with presentation on, off, and in reduced-comfort mode;
confirm the off state leaves saved preferences untouched.
Example invocations
- "Use $godot-analog-presentation to add a mild tracking-error burst when the
player takes damage."
- "Use $godot-analog-presentation to review why the pause menu still flickers
when the VHS stage is disabled."