files/en-us/web/api/xrwebglbinding/getsubimage/index.md
{{APIRef("WebXR Device API")}}{{SeeCompatTable}}
The getSubImage() method of the {{domxref("XRWebGLBinding")}} interface returns a {{domxref("XRWebGLSubImage")}} object representing the WebGL texture to render.
getSubImage(layer, frame)
getSubImage(layer, frame, eye)
layer
XRCompositionLayer objects except {{domxref("XRProjectionLayer")}}, see {{domxref("XRWebGLBinding.getViewSubImage()")}} for rendering projection layers).frame
eye {{optional_inline}}
left
right
none
none.A {{domxref("XRWebGLSubImage")}} object.
A {{jsxref("TypeError")}} is thrown,
layer is not in the session's layer array.layer is a {{domxref("XRProjectionLayer")}}.layout property is default.layout property is stereo and eye is none.XRQuadLayerThe following example renders an {{domxref("XRQuadLayer")}}.
const xrGlBinding = new XRWebGLBinding(xrSession, gl);
const quadLayer = xrGlBinding.createQuadLayer({
space: xrReferenceSpace,
viewPixelWidth: 512,
viewPixelHeight: 512,
});
// Position 2 meters away from the origin with a width and height of 1.5 meters
quadLayer.transform = new XRRigidTransform({ z: -2 });
quadLayer.width = 1.5;
quadLayer.height = 1.5;
const framebuffer = gl.createFramebuffer();
xrSession.updateRenderState({ layers: [quadLayer] });
xrSession.requestAnimationFrame(onXRFrame);
function onXRFrame(time, xrFrame) {
xrSession.requestAnimationFrame(onXRFrame);
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
let subImage = xrGlBinding.getSubImage(quadLayer, xrFrame);
gl.framebufferTexture2D(
gl.FRAMEBUFFER,
gl.COLOR_ATTACHMENT0,
subImage.colorTexture,
0,
);
let viewport = subImage.viewport;
gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
// Render content for the quad layer
}
{{Specifications}}
{{Compat}}