Signatur
Beschreibung
Die schreibgeschützte Eigenschaft nativeProjectionScaleFactor eines XRWebGLBinding-Objekts gibt den Skalierungsfaktor an, der die vom Browser gewählte Standardauflösung einer Projektionsschicht (XRProjectionLayer) in die native Auflösung der Displays des XR-Geräts umrechnet. Ein Wert von 1.0 bedeutet, dass die Standardauflösung bereits nativ ist; Werte über 1.0 zeigen an, dass der Browser aus Leistungsgründen standardmäßig mit geringerer Auflösung rendert.
Den Wert übergibt man typischerweise als Option scaleFactor an XRWebGLBinding.createProjectionLayer(), wenn eine Anwendung pixelgenau mit voller Gerätauflösung rendern möchte – etwa für gut lesbaren Text, feine Linien oder UI-Elemente. Umgekehrt dient er als Obergrenze für eine adaptive Qualitätssteuerung: Man kann zwischen einem niedrigeren Faktor (schnellere Bildrate) und dem nativen Faktor (maximale Schärfe) wählen.
Die Eigenschaft ist das Gegenstück der Layers API zur statischen Methode XRWebGLLayer.getNativeFramebufferScaleFactor(), die für das klassische XRWebGLLayer denselben Zweck erfüllt. Der Wert ist gerätespezifisch und sollte immer zur Laufzeit ausgelesen und nie fest im Code hinterlegt werden.
Rückgabewert
Beispiele
Projektionsschicht in nativer Auflösung erzeugen
const startXR = async () => {
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);
console.log('Nativer Faktor:', binding.nativeProjectionScaleFactor);
// Schicht mit voller Geräteauflösung anlegen
const layer = binding.createProjectionLayer({
textureType: 'texture',
scaleFactor: binding.nativeProjectionScaleFactor
});
session.updateRenderState({ layers: [layer] });
};
document.querySelector('#enter-vr').addEventListener('click', startXR);
Qualitätsstufe begrenzen (adaptive Auflösung)
// Wählt einen Faktor zwischen Leistungs- und Qualitätsmodus
const chooseScaleFactor = (binding, quality) => {
const native = binding.nativeProjectionScaleFactor;
const presets = { low: 0.7, medium: 1.0, high: native };
// Nie über die native Auflösung hinaus rendern
return Math.min(presets[quality] ?? 1.0, native);
};
const createLayer = (binding, quality) =>
binding.createProjectionLayer({
textureType: 'texture',
scaleFactor: chooseScaleFactor(binding, quality)
});
// Verwendung: const layer = createLayer(binding, 'medium');
Funktionserkennung mit Rückfall auf XRWebGLLayer
const createBaseLayer = (session, gl) => {
if ('XRWebGLBinding' in window &&
'nativeProjectionScaleFactor' in XRWebGLBinding.prototype) {
const binding = new XRWebGLBinding(session, gl);
return binding.createProjectionLayer({
scaleFactor: binding.nativeProjectionScaleFactor
});
}
// Klassischer Weg ohne Layers API
const factor = XRWebGLLayer.getNativeFramebufferScaleFactor(session);
return new XRWebGLLayer(session, gl, { framebufferScaleFactor: factor });
};
// Wichtig · Fallstricke
- Experimentell: Die WebXR Layers API wird derzeit nur von Chromium-basierten Browsern (u. a. Meta Quest Browser) unterstützt; Firefox und Safari bieten sie nicht an. Immer per Funktionserkennung prüfen und die Sitzung mit
requiredFeaturesbzw.optionalFeatures: ['layers']anfordern. - Sicherer Kontext: Nur über HTTPS verfügbar; die Sitzung muss durch eine Benutzeraktion gestartet werden.
- Leistung: Native Auflösung bedeutet oft deutlich mehr Pixel pro Bild. Auf mobilen Headsets kann das die Bildrate unter die Displayfrequenz drücken und Übelkeit verursachen – den Faktor bei aufwendigen Szenen besser reduzieren.
- Der Wert ist gerätespezifisch und kann sich zwischen Geräten und Browserversionen unterscheiden; nicht fest im Code hinterlegen.
- Der Skalierungsfaktor wird bei der Erzeugung der Schicht festgelegt. Soll die Auflösung später geändert werden, muss eine neue Projektionsschicht erzeugt und per
session.updateRenderState()gesetzt werden.