Mapping the Unseen: How a VR Game Turned My Amblyopia Therapy into a Daily Quest
Cartographers of North Korea once mapped the hidden borders of a nation with no official charts, turning curiosity into a map. That same spirit of exploration now guides a new vision‑training tool: AmblyoPunch. I stumbled on it while searching for a way to make my lazy‑eye exercises feel less like a chore and more like a game I’d actually want to play.
I was diagnosed with moderate amblyopia in my right eye in my early twenties. The standard prescription — patch the strong eye for hours a day — felt like a punishment. Compliance dropped, and the visual‑acuity gains stalled. When a friend posted a short clip of a Meta Quest experience where you punch floating “Gabor coins” and dodge red spikes, the idea of a dichoptic, game‑first approach clicked. I bought a Quest 2, downloaded AmblyoPunch from the Meta store, and set the lazy‑eye selector to “Right,” severity to “Moderate,” and strabismus type to “Exotropia.” The app’s automatic four‑stage pipeline took over from there.
Under the hood: dichoptic rendering on Quest
AmblyoPunch is a native Quest application (Unity + OpenXR). The core trick is presenting two slightly different scenes — one per eye — without the user noticing the split. The left‑eye camera renders full contrast; the right‑eye camera receives a dimmed, washed‑out version in Stage 2, then gradually brightens across Stage 3. This is done by rendering two off‑screen textures at 72 fps, each fed to its respective display panel. The Gabor‑pattern coins are signed‑distance‑field gradients at random angles, a classic vision‑science stimulus that drives cortical contrast and orientation selectivity. Because Quest’s fixed‑foveated rendering already splits the view, the extra per‑eye color‑grade pass adds < 1 ms GPU time, keeping the frame budget under the 13.8 ms window.
Hand‑tracking and controller input share the same interaction layer. The game polls XRController and XRHand each frame, normalizing the punch vector into world space. Collision with a coin increments score; collision with a spike costs one of three hearts. Logic is deliberately lightweight — no physics engine, just AABB checks — so CPU stays well under 2 ms per frame even on the original Quest 1.
The four‑stage clinical journey in code
| Stage | Visual goal | Rendering change | Progression rule |
|---|---|---|---|
| 1 – Monocular warm‑up | Lazy eye only | Right‑eye texture cleared to black | ≥ 70 % success over last 10 interactions |
| 2 – Breaking suppression | Dominant eye heavily dimmed | Right‑eye color‑grade → 0.15× luminance | Same 70 % gate |
| 3 – Rebalancing | Gradual luminance restore | Linear interpolation of right‑eye gain over N sub‑steps | Same gate |
| 4 – Fusion (Panum’s area) | Slight horizontal disparity | Constant vergence offset (± 2–4 px) per eye | ≥ 80 % for strabismus profiles |
“Automatic” mode advances the stage index when the rolling‑window metric crosses the threshold; a drop below 40 % demotes you one stage. Thresholds live in a JSON config loaded at start, so a clinician can tweak them without a code rebuild. A wrist‑menu UI (Unity UI Toolkit) shows the live success‑rate chart.
My first month: from “patch‑fatigue” to “daily quest”
Day 1 felt absurd — standing in a stylized village, fists raised, swatting drifting Gabor coins that shimmered like heat‑haze. Red spikes forced a duck that made my coffee table a hazard. Success rate hovered around 55 %; the app kept me in Stage 1 for three sessions. By end of week 1 the rolling average nudged past 70 % and the dominant‑eye dimming kicked in. The world didn’t look darker — it just felt like the right eye was “listening” more.
Week 2 introduced gradual rebalance. Coin contrast in my right eye rose subtly; spikes stopped feeling left‑eye‑only. Hand‑tracking latency felt imperceptible; the punch registered the moment my fingertips crossed the coin’s bounding box. I started treating each session like a speed‑run: 10 minutes, three hearts, aim for a clean run. The local leaderboard became a quiet motivator.
By week 3 I entered Stage 4. The tiny horizontal offset forced my brain to fuse the two images into a single depth cue. The first time a coin popped out in true 3D, I flinched. That moment, more than any Snellen chart, proved the fusion training was working. My ophthalmologist’s follow‑up showed a 0.15 logMAR improvement in the right eye — modest, but the first measurable gain in years.
Week 4 settled into rhythm. I still play most evenings, not because I have to, but because the village‑city‑space progression feels like a genuine game loop. Worlds unlock sequentially (village → city → space → moon → Mars → Venus) with faster spawn rates and smaller coins, naturally sharpening hand‑eye coordination. Misses now feel like skill gaps, not therapy failures.
What the engineering teaches about accessible VR
Building a dichoptic experience on a consumer headset forces hard choices:
-
Per‑eye render passes – Quest’s single‑display architecture requires manually binding two framebuffers; Unity’s
XRDisplaySubsystemlets you blit each eye’s texture to the correct swap‑chain slice. - Color‑grade stability – A 0.15× luminance reduction must stay consistent across frame drops; a compute‑shader LUT avoids per‑pixel branching.
- Latency budget – Hand‑tracking adds ~15 ms end‑to‑end; the game predicts hand position one frame ahead (simple linear extrapolation) to keep punches crisp.
- Data‑driven progression – All thresholds live in JSON; changing them for a study needs no rebuild, just a new config file.
These decisions keep the app lightweight (≈ 120 MB) and deterministic — important when a clinician wants reproducible session logs. The app writes a tiny CSV (timestamp, stage, success‑rate, heart count) to persistent storage; pull it via adb pull for offline analysis.
Not a medical device — but a useful adjunct
The product page is explicit: AmblyoPunch is a training/assistive game, not a treatment or cure. It does not replace professional eye‑care guidance. I still see my optometrist every six months, and the patch remains an option for days when the headset feels too heavy. What changed is adherence: I now look forward to the session instead of dreading it. The gamified loop — coins, spikes, worlds, leaderboards — turns a repetitive visual‑cortex workout into something that feels like progress in a video game.
If you’re a developer curious about dichoptic rendering, or someone with amblyopia tired of patches, the Quest store page has the download link and a short demo video. The experience runs on Quest 1, 2, Pro, and 3, and supports both controllers and hand‑tracking.
Give it a try and see whether a few minutes of punching Gabor coins can redraw the map of your own vision: https://www.meta.com/en-gb/experiences/amblyopunch/1239507485902689/
Top comments (0)