Signatur
Beschreibung
Die Eigenschaft fixedFoveation eines XRProjectionLayer steuert das sogenannte Fixed Foveated Rendering: Der Compositor rendert die Bildmitte, auf die das Auge meist schaut, in voller Auflösung. Zum Rand der Linsen hin wird die Auflösung verringert. So sinkt die GPU-Last, ohne dass die Bildqualität spürbar schlechter wird. Das hilft vor allem bei mobilen Headsets mit begrenzter Rechenleistung.
Der Wert ist eine Gleitkommazahl von 0 bis 1. 0 bedeutet keine Foveation, also überall volle Auflösung. 1 bedeutet maximale Foveation. Werte dazwischen stellen gerätespezifische Zwischenstufen ein. Die Eigenschaft ist lesbar und schreibbar. Du kannst sie also zur Laufzeit ändern, etwa abhängig von der Bildrate oder der Szenenkomplexität.
Unterstützt das Gerät keine Foveation, ist der Wert null. Zuweisungen haben dann keine Wirkung. Weist du einen Wert außerhalb des Bereichs zu, wird er auf 0 bis 1 begrenzt. Wie stark eine bestimmte Stufe wirkt, legt die Implementierung fest.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | number | gerätespezifisch | Beim Schreiben: gewünschte Foveationsstufe zwischen 0 (keine) und 1 (maximal). Werte außerhalb dieses Bereichs werden begrenzt. |
Rückgabewert
0 und 1, oder null, wenn das Gerät Fixed Foveation nicht unterstützt.Beispiele
Projektionsebene anlegen und Foveation setzen
const session = await navigator.xr.requestSession('immersive-vr', {
requiredFeatures: ['layers']
});
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2', { xrCompatible: true });
const binding = new XRWebGLBinding(session, gl);
const layer = binding.createProjectionLayer({ textureType: 'texture' });
if (layer.fixedFoveation !== null) {
layer.fixedFoveation = 0.5; // mittlere Foveation
}
session.updateRenderState({ layers: [layer] });
console.log('Foveation:', layer.fixedFoveation);
Unterstützung prüfen
const describeFoveation = (layer) => {
const f = layer.fixedFoveation;
if (f === null) return 'Fixed Foveation wird nicht unterstützt';
return `Aktuelle Stufe: ${f.toFixed(2)}`;
};
console.log(describeFoveation(layer));
Foveation an die Bildrate anpassen
let last = performance.now();
const onFrame = (time, frame) => {
const delta = time - last;
last = time;
if (layer.fixedFoveation !== null) {
// Über ~13,9 ms (unter 72 fps) Foveation erhöhen, sonst langsam senken
const step = delta > 13.9 ? 0.05 : -0.01;
layer.fixedFoveation = Math.min(1, Math.max(0, layer.fixedFoveation + step));
}
// ... Szene rendern ...
frame.session.requestAnimationFrame(onFrame);
};
session.requestAnimationFrame(onFrame);
// Wichtig · Fallstricke
- Kompatibilität: Die WebXR Layers API ist experimentell. Sie ist praktisch nur in Chromium-basierten XR-Browsern verfügbar, etwa im Meta Quest Browser. Firefox und Safari unterstützen sie nicht. Fordere das Feature
'layers'beirequestSession()an und prüfe es vorher. - Prüfe vor dem Schreiben immer auf
null. Auf Geräten ohne Foveation passiert bei einer Zuweisung nichts, und es wird auch kein Fehler ausgelöst. - Hohe Werte können an den Bildrändern sichtbare Artefakte erzeugen, etwa Treppeneffekte oder unscharfe Schrift. Platziere Text und Bedienelemente deshalb mittig oder auf separaten Quad-Ebenen (
XRQuadLayer). - Die Wirkung einer bestimmten Stufe ist gerätespezifisch. Dieselbe Zahl kann auf verschiedenen Headsets unterschiedlich stark wirken.
- Ist Eye-Tracking verfügbar, kann der Compositor dynamisch foveieren.
fixedFoveationbetrifft nur die feste, linsenzentrierte Variante. - Für klassische
XRWebGLLayergibt es die gleichnamige EigenschaftXRWebGLLayer.fixedFoveation.