Browse Source

WebXRManager: Honor WebXR native layer scaling. (#24877)

* add optional parameter limit framebuffer scale with native scale

* Update WebXRManager.html

* Update WebXRManager.html

* Update WebXRManager.js

Co-authored-by: Michael Herzog <[email protected]>
RICHΛRD ΛNΛYΛ 2 years ago
parent
commit
52fb52dd29
2 changed files with 18 additions and 3 deletions
  1. 3 2
      docs/api/en/renderers/webxr/WebXRManager.html
  2. 15 1
      src/renderers/webxr/WebXRManager.js

+ 3 - 2
docs/api/en/renderers/webxr/WebXRManager.html

@@ -104,9 +104,10 @@
 		Specifies the amount of foveation used by the XR compositor for the layer. Must be a value between `0` and `1`.
 		</p>
 
-		<h3>[method:undefined setFramebufferScaleFactor]( [param:Float framebufferScaleFactor] )</h3>
+		<h3>[method:undefined setFramebufferScaleFactor]( [param:Float factor], [param:Boolean limited] )</h3>
 		<p>
-		[page:Float framebufferScaleFactor] — The framebuffer scale factor to set.<br /><br />
+		[page:Float factor] — The framebuffer scale factor to set.<br />
+		[page:Boolean limited] — Whether the framebuffer scale factor should be reduced to the native limit if the value ends up being higher than the device's capabilities. Default is `false`.<br /><br />
 
 		Specifies the scaling factor to use when determining the size of the framebuffer when rendering to a XR device.
 		The value is relative to the default XR device display resolution. Default is `1`. A value of `0.5` would specify

+ 15 - 1
src/renderers/webxr/WebXRManager.js

@@ -26,6 +26,7 @@ class WebXRManager extends EventDispatcher {
 
 		let session = null;
 		let framebufferScaleFactor = 1.0;
+		let limitWithNativeFramebufferScaleFactor = false;
 
 		let referenceSpace = null;
 		let referenceSpaceType = 'local-floor';
@@ -185,9 +186,10 @@ class WebXRManager extends EventDispatcher {
 
 		}
 
-		this.setFramebufferScaleFactor = function ( value ) {
+		this.setFramebufferScaleFactor = function ( value, limited = false ) {
 
 			framebufferScaleFactor = value;
+			limitWithNativeFramebufferScaleFactor = limited;
 
 			if ( scope.isPresenting === true ) {
 
@@ -268,6 +270,18 @@ class WebXRManager extends EventDispatcher {
 
 				}
 
+				if ( limitWithNativeFramebufferScaleFactor === true && XRWebGLLayer.getNativeFramebufferScaleFactor ) {
+
+					const nativeFramebufferScaleFactor = XRWebGLLayer.getNativeFramebufferScaleFactor( session );
+
+					if ( nativeFramebufferScaleFactor < framebufferScaleFactor ) {
+
+						framebufferScaleFactor = nativeFramebufferScaleFactor;
+
+					}
+
+				}
+
 				if ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {
 
 					const layerInit = {