Signatur
Beschreibung
Mit createEquirectLayer() legst du über ein XRWebGLBinding eine Kompositionsebene (Layer) an, deren Textur equirektangular projiziert ist. Der XR-Compositor legt die Textur direkt auf die Innenseite einer (Teil-)Kugel um den Betrachter. So zeigst du 360°- oder 180°-Panoramen, Skyboxen oder Stereo-Bilder an, ohne die Kugel selbst in WebGL rendern zu müssen.
Der Vorteil gegenüber einer selbst gerenderten Kugel: Der Compositor tastet die Textur direkt mit der Auflösung des Displays ab. Dadurch entfällt ein zusätzlicher Resampling-Schritt, das Bild wird schärfer, und die Anwendung muss die Ebene nicht in jedem Frame neu zeichnen. Das gilt vor allem mit isStatic: true.
Voraussetzung ist eine Sitzung, die mit dem Feature "layers" angefordert wurde. Den erzeugten Layer trägst du über XRSession.updateRenderState({ layers: [...] }) ein. Die Reihenfolge im Array bestimmt, welche Ebene über welcher liegt. Sobald layer.needsRedraw gesetzt ist, holst du dir mit XRWebGLBinding.getSubImage() die Farbtextur und zeichnest hinein.
Größe und abgedeckten Ausschnitt der Kugel steuerst du mit radius, centralHorizontalAngle, upperVerticalAngle und lowerVerticalAngle. Diese Werte lassen sich auch nachträglich direkt am Layer ändern. Die Ausrichtung legst du über space und transform fest.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options Pflicht | XREquirectLayerInit | Konfigurationsobjekt mit den folgenden Eigenschaften. | |
| $options.space Pflicht | XRSpace | Raum, in dem der Kugelmittelpunkt verankert ist, meist ein Referenzraum wie "local". |
|
| $options.viewPixelWidth Pflicht | number | Breite der Textur pro Ansicht in Pixeln. | |
| $options.viewPixelHeight Pflicht | number | Höhe der Textur pro Ansicht in Pixeln. | |
| $options.layout | "mono" | "stereo" | "stereo-left-right" | "stereo-top-bottom" | "mono" | Anordnung der Ansichten in der Textur. "default" ist hier nicht erlaubt. |
| $options.transform | XRRigidTransform | Identität | Position und Ausrichtung der Kugel relativ zu space. |
| $options.radius | number | 0 | Radius der Kugel in Metern. 0 steht für eine unendlich große Kugel (Skybox-Verhalten). |
| $options.centralHorizontalAngle | number | 2 * Math.PI | Horizontal abgedeckter Winkel in Radiant, z. B. Math.PI für 180°. |
| $options.upperVerticalAngle | number | Math.PI / 2 | Oberer Grenzwinkel in Radiant. |
| $options.lowerVerticalAngle | number | -Math.PI / 2 | Unterer Grenzwinkel in Radiant. |
| $options.colorFormat | GLenum | gl.RGBA | Internes Format der Farbtextur. |
| $options.depthFormat | GLenum | 0 | Format einer optionalen Tiefentextur. 0 bedeutet: keine Tiefentextur. |
| $options.textureType | "texture" | "texture-array" | "texture" | Legt fest, ob eine 2D-Textur oder ein Textur-Array (nur WebGL 2) angelegt wird. |
| $options.mipLevels | number | 1 | Anzahl der Mipmap-Stufen. |
| $options.isStatic | boolean | false | Bei true zeichnest du nur einmal (bzw. nur, wenn needsRedraw gesetzt ist). Der Compositor darf den Speicher dann optimieren. |
| $options.clearOnAccess | boolean | true | Legt fest, ob die Textur bei jedem Zugriff über getSubImage() geleert wird. |
Rückgabewert
updateRenderState({ layers }) einträgst.