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 |
瀏覽器相容性
載入中…