Mobile XR headsets (Quest, ARKit/ARCore passthrough devices) track the eye's gaze point g(t) with an inward-facing IR camera and render three concentric zones around it, defined by angular eccentricity θ from the gaze direction:
R(θ) = 1 for θ ≤ θ₁ (foveal — full res)
R(θ) = 1 − (1−s)·(θ−θ₁)/(θ₂−θ₁) for θ₁ < θ < θ₂ (blend)
R(θ) = s for θ ≥ θ₂ (periphery — scale s)
Human visual acuity itself falls off roughly as 1/θ away from the fovea (cone density drops ~50% by 5° eccentricity), so the eye cannot tell the periphery apart from full resolution even though far fewer pixels are shaded there. Per-frame GPU pixel cost is the resolution-weighted area integral:
Cost = ∫∫ R(θ(x,y))² dA over the frame
Saved = 1 − Cost / (W·H)
EffRes = √Cost (RMS linear resolution scale — cost scales with the square
of linear resolution since it applies along both axes)
This 2D simulator renders the same falloff as a live top-down resolution heatmap: the frame is a grid of cells, each shaded from dark (heavily downsampled periphery) to bright blue (full-res fovea) by R(θ) at its own eccentricity from the gaze point, with cell size itself shrinking toward the periphery to make the density drop visible directly. A second panel plots R(θ) itself as a curve against eccentricity in degrees, with the foveal/blend boundary lines moving live as you drag the sliders. Toggle "uniform" to flatten R(θ) to 1 everywhere and watch the cost readout jump back to 100%.
- Auto saccade — the gaze point jumps between fixation targets on a timer, mimicking real saccadic eye movement.
- Manual (drag) — drag on the heatmap to steer the gaze point yourself.
- Foveal radius / blend width / periphery scale — the three R(θ) zone parameters above.
- Grid density — how many cells the heatmap is divided into (does not change the physics, only the visualization resolution).