“Human depth perception relies on stereopsis: each eye sees a slightly offset view due to Inter-Pupillary Distance (IPD ~63mm). In WebXR, the GPU renders two separate viewports per frame (Left Eye, Right Eye) with distinct projection matrices. Fixed Foveated Rendering (FFR) reduces fragment shader resolution in peripheral vision to save 30-50% GPU fillrate.”
Dual viewport projection matrices, inter-pupillary distance (IPD), and fixed foveated rendering.
// Dual-Eye Render Loop
for (const view of pose.views) {
const viewport = baseLayer.getViewport(view);
gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
// view.projectionMatrix: 4x4 matrix tailored to eye FOV
// view.transform.inverse.matrix: 4x4 eye position matrix
renderScene(view.projectionMatrix, view.transform.inverse.matrix);
}WebXR driver queries user hardware IPD and lens distortion profile
For each frame: XRViewerPose provides two XRView objects (Left Eye, Right Eye)
GPU binds Left Viewport: applies Left Eye View & Projection Matrix
GPU binds Right Viewport: applies Right Eye View & Projection Matrix (offset by IPD)
Displays send left/right views to respective eye displays simultaneously
Multi-View WebGL extension (OVR_multiview2) renders both eye viewports in a single draw call, cutting CPU geometry draw call overhead in half.