XRSession: updateRenderState() 方法
WebXR API 的 XRSession 接口的 updateRenderState() 方法会安排在渲染下一帧之前应用于活动渲染状态 (XRRenderState) 的更改。
语法
js
updateRenderState()
updateRenderState(state)
参数
state可选-
一个可选对象,用于配置
XRRenderState。如果未提供,将使用默认配置。baseLayer可选:一个XRWebGLLayer对象,WebXR 合成器将从中获取图像。默认情况下此值为null。要指定其他(或多个)图层,请参阅layers选项。depthFar可选:一个浮点值,指定从查看者到远裁剪面的距离(以米为单位),远裁剪面是与显示表面平行的平面,超出此平面将不再进行渲染。所有渲染将在depthNear和depthFar指定的距离之间进行。默认值为 1000 米(1 公里)。depthNear可选:一个浮点值,表示从查看者到与显示表面平行的平面的距离(以米为单位),该平面被视为近裁剪面。此平面靠查看者一侧的场景将不会被渲染。默认值为 0.1 米(10 厘米)。inlineVerticalFieldOfView可选:一个浮点值,表示为inlineXRSession计算投影矩阵时使用的默认视场(以弧度为单位)。投影矩阵的计算还会考虑输出画布的 纵横比。此属性不得为沉浸式会话指定,因此对于沉浸式会话,默认值为null。否则,默认值为 π * 0.5(π 值的一半)。layers可选:一个有序的XRLayer对象数组,指定应呈现给 XR 设备的图层。设置layers会覆盖baseLayer(如果存在),此时baseLayer的值为null。图层的顺序是从“后到前”。有关图层的 alpha 混合,请参阅XRCompositionLayer.blendTextureSourceAlpha属性。
返回值
无(undefined)。
异常
InvalidStateErrorDOMException-
在以下任何情况下抛出:
XRSession已结束,因此您无法更改其渲染状态。baseLayer是由一个不同于调用updateRenderState()的XRSession创建的。- 设置了
inlineVerticalFieldOfView选项,但会话是沉浸式的,因此不允许使用此属性。
NotSupportedErrorDOMException-
在以下任何情况下抛出:
layers选项在一个未创建layers功能的会话中使用。- 同时指定了
baseLayer和layers选项。
TypeError-
如果
layers选项包含重复的实例,则会抛出此异常。
示例
添加 baseLayer
此示例创建一个与沉浸式 XR 设备兼容的 WebGL 上下文,然后使用它创建一个 XRWebGLLayer。然后调用 updateRenderState() 方法来关联新的 XRWebGLLayer。
js
function onXRSessionStarted(xrSession) {
let glCanvas = document.createElement("canvas");
let gl = glCanvas.getContext("webgl", { xrCompatible: true });
loadWebGLResources();
xrSession.updateRenderState({
baseLayer: new XRWebGLLayer(xrSession, gl),
});
}
设置 layers 数组
要使用 WebXR 图层,XR 会话需要使用 layers 功能描述符创建(请参阅 XRSystem.requestSession())。然后,您可以创建各种 WebXR 图层,例如
其他图层,例如 XRProjectionLayer 或 XRWebGLLayer 也可用。
图层将按照 layers 数组中给出的顺序呈现,图层按“后到前”顺序给出。
js
const xrSession = navigator.xr.requestSession("immersive-ar", {
optionalFeatures: ["layers"],
});
function onXRSessionStarted(xrSession) {
const glCanvas = document.createElement("canvas");
const gl = glCanvas.getContext("webgl", { xrCompatible: true });
const xrGlBinding = new XRWebGLBinding(xrSession, gl);
const projectionLayer = new XRWebGLLayer(xrSession, gl);
const quadLayer = xrGlBinding.createQuadLayer({
pixelWidth: 1024,
pixelHeight: 1024,
});
xrSession.updateRenderState({
layers: [projectionLayer, quadLayer],
});
}
规范
| 规范 |
|---|
| WebXR Device API # dom-xrsession-updaterenderstate |
浏览器兼容性
加载中…