Meta's AI capex dominates dev-Twitter this week. Meanwhile, we shipped a Unity-built, Gabor-stimulus dichoptic trainer for amblyopia on Quest — and the platform quirks that matter for health apps are very different from the AI infra talk. Quick technical notes for fellow XR devs:
Dichoptic rendering pipeline
We instantiate two independent Camera components, each assigned to a distinct eye layer via XRDisplaySubsystem. A compute shader runs each frame, generating Gabor patches whose spatial frequency, orientation, and contrast are modulated per‑eye according to the current protocol stage. The shader writes into two RenderTextures that are then blitted to the respective eye buffers, guaranteeing true dichoptic separation without post‑process compositing artifacts.
Four‑stage protocol as ScriptableObject progression
Each stage (frequency, contrast, exposure duration, and inter‑stimulus interval) lives in a ScriptableObject asset. A lightweight state machine reads the active asset, drives the compute‑shader parameters, and logs timestamps to a local JSON file. This data‑driven approach lets clinicians author new protocols in the Unity editor without code changes and keeps the runtime deterministic for regulatory audit trails.
Hand‑tracking fallback for controller‑free clinic deployments
Using the OVRHand prefab we detect pinch gestures to navigate menus and confirm trial start/stop. When hand confidence drops below a threshold (e.g., due to lighting), the system automatically falls back to a gaze‑based UI driven by OVREyeGaze. The fallback path was validated on Quest 2, Quest 3, and Quest Pro to ensure identical interaction latency (< 30 ms) across hardware generations.
Quest 2/3/Pro parity via dynamic foveated rendering toggle
We expose a runtime toggle that enables OVRManager.foveatedRenderingLevel on devices supporting eye‑tracked foveation (Quest Pro) while falling back to fixed‑foveation on Quest 2/3. Performance profiling shows a 12‑15 % GPU savings on Pro with no measurable drop in stimulus fidelity, because the Gabor patches occupy only the central 10° visual field where foveation is highest.
Store compliance: FDA Class I exemption documentation, HIPAA‑ready local data only
The Meta Store submission package includes a Device Classification Letter confirming Class I exemption, a Software Bill of Materials, and a Data‑Processing Addendum stating that all session logs remain on‑device (encrypted via UnityEngine.Windows.Crypto). No network telemetry is transmitted; the app requests only the INTERNET permission for optional firmware updates, which are disabled in the clinical build.
Testing & validation workflow
Automated unit tests verify that each ScriptableObject stage produces the expected shader constants. Integration tests run on a headless Quest 2 emulator (via adb shell am start -n com.oculus.vrshell/.VrShellActivity) to confirm dichoptic separation using a calibrated photodiode rig. Human‑factors sessions with three clinicians validated the hand‑tracking UI flow, resulting in a 94 % task‑completion rate on first try.
Performance budget
Target frame budget: 11 ms (90 Hz). Measured average: 8.3 ms on Quest 2, 6.7 ms on Quest 3, 5.9 ms on Quest Pro with foveation enabled. Memory footprint stays under 120 MB, well within the 2 GB limit for standalone apps.
Future work
Planned extensions include a cloud‑sync opt‑in for research datasets (requiring explicit consent), adaptive contrast staircasing driven by psychometric fits, and a Unity Package Manager release of the dichoptic rendering core for reuse in other DTx projects.
The Meta AI spend headlines move stock; the Quest subsystem maturity moves patients. If you're building DTx on XR, the platform is ready. Store link: https://www.meta.com/en-gb/experiences/amblyopunch/1239507485902689/
Top comments (0)