Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/renderers/common/Renderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -1260,7 +1260,7 @@ class Renderer {
frameBufferTarget.scissorTest = this._scissorTest;
frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
frameBufferTarget.autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.autoAllocateDepthBuffer : false;
frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;

return frameBufferTarget;

Expand Down
9 changes: 5 additions & 4 deletions src/renderers/common/XRManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ class XRManager extends EventDispatcher {
resolveStencilBuffer: false
} );

renderTarget.autoAllocateDepthBuffer = true;
renderTarget._autoAllocateDepthBuffer = true;

const material = new MeshBasicMaterial( { color: 0xffffff, side: FrontSide } );
material.map = renderTarget.texture;
Expand Down Expand Up @@ -732,7 +732,7 @@ class XRManager extends EventDispatcher {
resolveStencilBuffer: false
} );

renderTarget.autoAllocateDepthBuffer = true;
renderTarget._autoAllocateDepthBuffer = true;

const material = new MeshBasicMaterial( { color: 0xffffff, side: BackSide } );
material.map = renderTarget.texture;
Expand Down Expand Up @@ -806,7 +806,7 @@ class XRManager extends EventDispatcher {
for ( const layer of this._layers ) {

layer.renderTarget.isXRRenderTarget = this._session !== null;
layer.renderTarget.hasExternalTextures = layer.renderTarget.isXRRenderTarget;
layer.renderTarget._hasExternalTextures = layer.renderTarget.isXRRenderTarget;

if ( layer.renderTarget.isXRRenderTarget && this._supportsLayers ) {

Expand Down Expand Up @@ -974,7 +974,7 @@ class XRManager extends EventDispatcher {
multiview: this._useMultiview
} );

this._xrRenderTarget.hasExternalTextures = true;
this._xrRenderTarget._hasExternalTextures = true;
this._xrRenderTarget.depth = this._useMultiview ? 2 : 1;

this._supportsLayers = session.enabledFeatures.includes( 'layers' );
Expand Down Expand Up @@ -1036,6 +1036,7 @@ class XRManager extends EventDispatcher {
}
);

this._xrRenderTarget._isOpaqueFramebuffer = true;
this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );

}
Expand Down
22 changes: 18 additions & 4 deletions src/renderers/common/XRRenderTarget.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class XRRenderTarget extends RenderTarget {
* @type {boolean}
* @default false
*/
this.hasExternalTextures = false;
this._hasExternalTextures = false;

/**
* Whether a depth buffer should automatically be allocated
Expand All @@ -53,16 +53,30 @@ class XRRenderTarget extends RenderTarget {
* @type {boolean}
* @default true
*/
this.autoAllocateDepthBuffer = true;
this._autoAllocateDepthBuffer = true;


/**
* Whether this render target is associated with a XRWebGLLayer.
*
* A XRWebGLLayer points to an opaque framebuffer. Basically,
* this means that you don't have access to its bound color,
* stencil and depth buffers. We need to handle this framebuffer
* differently since its textures are always bound.
*
* @type {boolean}
* @default false
* */
this._isOpaqueFramebuffer = false;

}

copy( source ) {

super.copy( source );

this.hasExternalTextures = source.hasExternalTextures;
this.autoAllocateDepthBuffer = source.autoAllocateDepthBuffer;
this._hasExternalTextures = source._hasExternalTextures;
this._autoAllocateDepthBuffer = source._autoAllocateDepthBuffer;

return this;

Expand Down
18 changes: 9 additions & 9 deletions src/renderers/webgl-fallback/WebGLBackend.js
Original file line number Diff line number Diff line change
Expand Up @@ -364,13 +364,13 @@ class WebGLBackend extends Backend {

// The multisample_render_to_texture extension doesn't work properly if there
// are midframe flushes and an external depth texture.
if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget.autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {

console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );

}

renderTarget.autoAllocateDepthBuffer = false;
renderTarget._autoAllocateDepthBuffer = false;

}

Expand Down Expand Up @@ -2002,7 +2002,7 @@ class WebGLBackend extends Backend {
const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
const isRenderTargetArray = renderTarget.depth > 1;
const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
const hasExternalTextures = ( isXRRenderTarget === true && renderTarget.hasExternalTextures === true );
const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );

let msaaFb = renderTargetContextData.msaaFrameBuffer;
let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
Expand All @@ -2019,7 +2019,7 @@ class WebGLBackend extends Backend {

fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];

} else if ( isXRRenderTarget && hasExternalTextures === false ) {
} else if ( isXRRenderTarget && _hasExternalTextures === false ) {

fb = this._xrFramebuffer;

Expand Down Expand Up @@ -2095,7 +2095,7 @@ class WebGLBackend extends Backend {

const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;

if ( renderTarget.autoAllocateDepthBuffer === true ) {
if ( renderTarget._autoAllocateDepthBuffer === true ) {

const renderbuffer = gl.createRenderbuffer();
this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
Expand All @@ -2120,7 +2120,7 @@ class WebGLBackend extends Backend {

multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );

} else if ( hasExternalTextures && useMultisampledRTT ) {
} else if ( _hasExternalTextures && useMultisampledRTT ) {

multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );

Expand Down Expand Up @@ -2171,7 +2171,7 @@ class WebGLBackend extends Backend {

// rebind external XR textures

if ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) {
if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {

state.bindFramebuffer( gl.FRAMEBUFFER, fb );

Expand All @@ -2197,7 +2197,7 @@ class WebGLBackend extends Backend {

const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;

if ( renderTarget.autoAllocateDepthBuffer === true ) {
if ( renderTarget._autoAllocateDepthBuffer === true ) {

const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
Expand Down Expand Up @@ -2528,7 +2528,7 @@ class WebGLBackend extends Backend {

}

return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget.autoAllocateDepthBuffer !== false;
return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;

}

Expand Down