From 48b05d3500acc084df50be9b4c90781ad9b8cb17 Mon Sep 17 00:00:00 2001
From: Michael Herzog
Date: Fri, 11 Feb 2022 23:55:11 +0100
Subject: [PATCH] Remove WebGLMultisampleRenderTarget. (#23455)
* Remove WebGLMultisampleRenderTarget.
* THREE.Legacy.js: Add WebGLMultisampleRenderTarget.
* Exampels: Clean up.
* WebGLRenderer: Use multisampling when possible without reporting errors.
* Update WebGLRenderer.js
Co-authored-by: mrdoob
---
.../WebGLMultisampleRenderTarget.html | 57 --------
docs/api/en/renderers/WebGLRenderTarget.html | 4 +
.../WebGLMultisampleRenderTarget.html | 57 --------
docs/api/zh/renderers/WebGLRenderTarget.html | 4 +
docs/list.json | 2 -
examples/jsm/objects/Reflector.js | 18 +--
examples/jsm/objects/Refractor.js | 18 +--
.../webgl2_multisampled_renderbuffers.html | 2 +-
src/Three.Legacy.js | 9 ++
src/Three.js | 1 -
src/renderers/WebGLMultisampleRenderTarget.js | 33 -----
src/renderers/WebGLRenderTarget.js | 4 +
src/renderers/WebGLRenderer.js | 13 +-
src/renderers/webgl/WebGLTextures.js | 132 ++++++++----------
src/renderers/webxr/WebXRManager.js | 48 ++-----
15 files changed, 109 insertions(+), 293 deletions(-)
delete mode 100644 docs/api/en/renderers/WebGLMultisampleRenderTarget.html
delete mode 100644 docs/api/zh/renderers/WebGLMultisampleRenderTarget.html
delete mode 100644 src/renderers/WebGLMultisampleRenderTarget.js
diff --git a/docs/api/en/renderers/WebGLMultisampleRenderTarget.html b/docs/api/en/renderers/WebGLMultisampleRenderTarget.html
deleted file mode 100644
index c7274dfce60bff..00000000000000
--- a/docs/api/en/renderers/WebGLMultisampleRenderTarget.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
- [page:WebGLRenderTarget] →
-
- [name]
-
-
- A special render target that can be used to utilize multi-sampled renderbuffers.
- Heads up: [name] can only be used with a WebGL 2 rendering context.
-
-
- Examples
-
-
- [example:webgl2_multisampled_renderbuffers webgl2 / multisampled / renderbuffers ]
-
-
- Constructor
-
-
- [name]([param:Number width], [param:Number height], [param:Object options])
-
-
- [page:Float width] - The width of the render target.
- [page:Float height] - The height of the render target.
- [page:Object options] - (optional) object that holds texture parameters for an auto-generated target
- texture and depthBuffer/stencilBuffer booleans.
-
-
- Properties
-
- [property:number samples]
-
- Specifies the number of samples to be used for the renderbuffer storage. However, the maximum supported
- size for multisampling is platform dependent and defined via *gl.MAX_SAMPLES*.
-
-
- [page:WebGLRenderTarget WebGLRenderTarget] properties are available on this class.
-
- Methods
-
- [page:WebGLRenderTarget WebGLRenderTarget] methods are available on this class.
-
- Source
-
-
- [link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-
-
-
diff --git a/docs/api/en/renderers/WebGLRenderTarget.html b/docs/api/en/renderers/WebGLRenderTarget.html
index 7f264688672929..823721c8e183c6 100644
--- a/docs/api/en/renderers/WebGLRenderTarget.html
+++ b/docs/api/en/renderers/WebGLRenderTarget.html
@@ -93,6 +93,10 @@ [property:DepthTexture depthTexture]
If set, the scene depth will be rendered to this texture. Default is null.
+ [property:Number samples]
+
+ Defines the count of MSAA samples. Can only be used with WebGL 2. Default is *0*.
+
Methods
diff --git a/docs/api/zh/renderers/WebGLMultisampleRenderTarget.html b/docs/api/zh/renderers/WebGLMultisampleRenderTarget.html
deleted file mode 100644
index 974ced3690800e..00000000000000
--- a/docs/api/zh/renderers/WebGLMultisampleRenderTarget.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
- [page:WebGLRenderTarget] →
-
- [name]
-
-
- A special render target that can be used to utilize multi-sampled renderbuffers.
- Heads up: [name] can only be used with a WebGL 2 rendering context.
-
-
- Examples
-
-
- [example:webgl2_multisampled_renderbuffers webgl2 / multisampled / renderbuffers ]
-
-
- Constructor
-
-
- [name]([param:Number width], [param:Number height], [param:Object options])
-
-
- [page:Float width] - The width of the render target.
- [page:Float height] - The height of the render target.
- [page:Object options] - (optional) object that holds texture parameters for an auto-generated target
- texture and depthBuffer/stencilBuffer booleans.
-
-
- Properties
-
- [property:number samples]
-
- Specifies the number of samples to be used for the renderbuffer storage. However, the maximum supported
- size for multisampling is platform dependent and defined via *gl.MAX_SAMPLES*.
-
-
- [page:WebGLRenderTarget WebGLRenderTarget] properties are available on this class.
-
- Methods
-
- [page:WebGLRenderTarget WebGLRenderTarget] methods are available on this class.
-
- Source
-
-
- [link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-
-
-
diff --git a/docs/api/zh/renderers/WebGLRenderTarget.html b/docs/api/zh/renderers/WebGLRenderTarget.html
index 072a5efe405acb..d124d812ffd65a 100644
--- a/docs/api/zh/renderers/WebGLRenderTarget.html
+++ b/docs/api/zh/renderers/WebGLRenderTarget.html
@@ -89,6 +89,10 @@ [property:DepthTexture depthTexture]
如果设置,那么场景的深度将会被渲染到此纹理上。默认为null
+ [property:Number samples]
+
+ Defines the count of MSAA samples. Can only be used with WebGL 2. Default is *0*.
+
方法
diff --git a/docs/list.json b/docs/list.json
index f799758761f637..78eb448f68d5f4 100644
--- a/docs/list.json
+++ b/docs/list.json
@@ -283,7 +283,6 @@
"Renderers": {
"WebGLMultipleRenderTargets": "api/en/renderers/WebGLMultipleRenderTargets",
- "WebGLMultisampleRenderTarget": "api/en/renderers/WebGLMultisampleRenderTarget",
"WebGLRenderer": "api/en/renderers/WebGLRenderer",
"WebGL1Renderer": "api/en/renderers/WebGL1Renderer",
"WebGLRenderTarget": "api/en/renderers/WebGLRenderTarget",
@@ -783,7 +782,6 @@
"渲染器": {
"WebGLMultipleRenderTargets": "api/zh/renderers/WebGLMultipleRenderTargets",
- "WebGLMultisampleRenderTarget": "api/zh/renderers/WebGLMultisampleRenderTarget",
"WebGLRenderer": "api/zh/renderers/WebGLRenderer",
"WebGL1Renderer": "api/zh/renderers/WebGL1Renderer",
"WebGLRenderTarget": "api/zh/renderers/WebGLRenderTarget",
diff --git a/examples/jsm/objects/Reflector.js b/examples/jsm/objects/Reflector.js
index b11d7dd3536fc1..0f4a918754a3d8 100644
--- a/examples/jsm/objects/Reflector.js
+++ b/examples/jsm/objects/Reflector.js
@@ -8,8 +8,7 @@ import {
UniformsUtils,
Vector3,
Vector4,
- WebGLRenderTarget,
- WebGLMultisampleRenderTarget
+ WebGLRenderTarget
} from 'three';
class Reflector extends Mesh {
@@ -27,7 +26,7 @@ class Reflector extends Mesh {
const textureHeight = options.textureHeight || 512;
const clipBias = options.clipBias || 0;
const shader = options.shader || Reflector.ReflectorShader;
- const multisample = options.multisample || 4;
+ const multisample = ( options.multisample !== undefined ) ? options.multisample : 4;
//
@@ -46,18 +45,7 @@ class Reflector extends Mesh {
const textureMatrix = new Matrix4();
const virtualCamera = new PerspectiveCamera();
- let renderTarget;
-
- if ( multisample > 0 ) {
-
- renderTarget = new WebGLMultisampleRenderTarget( textureWidth, textureHeight );
- renderTarget.samples = multisample;
-
- } else {
-
- renderTarget = new WebGLRenderTarget( textureWidth, textureHeight );
-
- }
+ const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, { samples: multisample } );
const material = new ShaderMaterial( {
uniforms: UniformsUtils.clone( shader.uniforms ),
diff --git a/examples/jsm/objects/Refractor.js b/examples/jsm/objects/Refractor.js
index 3c10d84caec905..edb0d1606247a4 100644
--- a/examples/jsm/objects/Refractor.js
+++ b/examples/jsm/objects/Refractor.js
@@ -9,8 +9,7 @@ import {
UniformsUtils,
Vector3,
Vector4,
- WebGLRenderTarget,
- WebGLMultisampleRenderTarget
+ WebGLRenderTarget
} from 'three';
class Refractor extends Mesh {
@@ -28,7 +27,7 @@ class Refractor extends Mesh {
const textureHeight = options.textureHeight || 512;
const clipBias = options.clipBias || 0;
const shader = options.shader || Refractor.RefractorShader;
- const multisample = options.multisample || 4;
+ const multisample = ( options.multisample !== undefined ) ? options.multisample : 4;
//
@@ -43,18 +42,7 @@ class Refractor extends Mesh {
// render target
- let renderTarget;
-
- if ( multisample > 0 ) {
-
- renderTarget = new WebGLMultisampleRenderTarget( textureWidth, textureHeight );
- renderTarget.samples = multisample;
-
- } else {
-
- renderTarget = new WebGLRenderTarget( textureWidth, textureHeight );
-
- }
+ const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, { samples: multisample } );
// material
diff --git a/examples/webgl2_multisampled_renderbuffers.html b/examples/webgl2_multisampled_renderbuffers.html
index 208c510d99f5b5..698e680a374864 100644
--- a/examples/webgl2_multisampled_renderbuffers.html
+++ b/examples/webgl2_multisampled_renderbuffers.html
@@ -127,7 +127,7 @@
//
const size = renderer.getDrawingBufferSize( new THREE.Vector2() );
- const renderTarget = new THREE.WebGLMultisampleRenderTarget( size.width, size.height );
+ const renderTarget = new THREE.WebGLRenderTarget( size.width, size.height, { samples: 4 } );
const renderPass = new RenderPass( scene, camera );
const copyPass = new ShaderPass( CopyShader );
diff --git a/src/Three.Legacy.js b/src/Three.Legacy.js
index 69ea7487eba24d..7786bdfc243214 100644
--- a/src/Three.Legacy.js
+++ b/src/Three.Legacy.js
@@ -1975,3 +1975,12 @@ export function ImmediateRenderObject() {
console.error( 'THREE.ImmediateRenderObject has been removed.' );
}
+
+export function WebGLMultisampleRenderTarget( width, height, options ) {
+
+ console.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.' );
+ const renderTarget = new WebGLRenderTarget( width, height, options );
+ renderTarget.samples = 4;
+ return renderTarget;
+
+}
diff --git a/src/Three.js b/src/Three.js
index 4f0f85adcfad8d..f173015554ae93 100644
--- a/src/Three.js
+++ b/src/Three.js
@@ -1,7 +1,6 @@
import { REVISION } from './constants.js';
export { WebGLMultipleRenderTargets } from './renderers/WebGLMultipleRenderTargets.js';
-export { WebGLMultisampleRenderTarget } from './renderers/WebGLMultisampleRenderTarget.js';
export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js';
export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js';
export { WebGLRenderer } from './renderers/WebGLRenderer.js';
diff --git a/src/renderers/WebGLMultisampleRenderTarget.js b/src/renderers/WebGLMultisampleRenderTarget.js
deleted file mode 100644
index 0d08ab6c1945cd..00000000000000
--- a/src/renderers/WebGLMultisampleRenderTarget.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { WebGLRenderTarget } from './WebGLRenderTarget.js';
-
-class WebGLMultisampleRenderTarget extends WebGLRenderTarget {
-
- constructor( width, height, options = {} ) {
-
- super( width, height, options );
-
- this.samples = 4;
-
- this.ignoreDepthForMultisampleCopy = options.ignoreDepth !== undefined ? options.ignoreDepth : true;
- this.useRenderToTexture = ( options.useRenderToTexture !== undefined ) ? options.useRenderToTexture : false;
- this.useRenderbuffer = this.useRenderToTexture === false;
-
- }
-
- copy( source ) {
-
- super.copy.call( this, source );
-
- this.samples = source.samples;
- this.useRenderToTexture = source.useRenderToTexture;
- this.useRenderbuffer = source.useRenderbuffer;
-
- return this;
-
- }
-
-}
-
-WebGLMultisampleRenderTarget.prototype.isWebGLMultisampleRenderTarget = true;
-
-export { WebGLMultisampleRenderTarget };
diff --git a/src/renderers/WebGLRenderTarget.js b/src/renderers/WebGLRenderTarget.js
index 62552e07905ed8..bbd21965b62127 100644
--- a/src/renderers/WebGLRenderTarget.js
+++ b/src/renderers/WebGLRenderTarget.js
@@ -37,6 +37,8 @@ class WebGLRenderTarget extends EventDispatcher {
this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
+ this.samples = options.samples !== undefined ? options.samples : 0;
+
}
setTexture( texture ) {
@@ -97,6 +99,8 @@ class WebGLRenderTarget extends EventDispatcher {
if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();
+ this.samples = source.samples;
+
return this;
}
diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js
index e3e2ca37734910..7ab8c5284112f9 100644
--- a/src/renderers/WebGLRenderer.js
+++ b/src/renderers/WebGLRenderer.js
@@ -31,7 +31,6 @@ import { WebGLGeometries } from './webgl/WebGLGeometries.js';
import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js';
import { WebGLInfo } from './webgl/WebGLInfo.js';
import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js';
-import { WebGLMultisampleRenderTarget } from './WebGLMultisampleRenderTarget.js';
import { WebGLObjects } from './webgl/WebGLObjects.js';
import { WebGLPrograms } from './webgl/WebGLPrograms.js';
import { WebGLProperties } from './webgl/WebGLProperties.js';
@@ -1189,13 +1188,11 @@ function WebGLRenderer( parameters = {} ) {
if ( _transmissionRenderTarget === null ) {
- const renderTargetType = ( isWebGL2 && _antialias === true ) ? WebGLMultisampleRenderTarget : WebGLRenderTarget;
-
- _transmissionRenderTarget = new renderTargetType( 1, 1, {
+ _transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {
generateMipmaps: true,
- type: HalfFloatType,
+ type: utils.convert( HalfFloatType ) !== null ? HalfFloatType : UnsignedByteType,
minFilter: LinearMipmapLinearFilter,
- useRenderToTexture: extensions.has( 'WEBGL_multisampled_render_to_texture' )
+ samples: ( isWebGL2 && _antialias === true ) ? 4 : 0
} );
}
@@ -1797,7 +1794,7 @@ function WebGLRenderer( parameters = {} ) {
// The multisample_render_to_texture extension doesn't work properly if there
// are midframe flushes and an external depth buffer. Disable use of the extension.
- if ( renderTarget.useRenderToTexture ) {
+ if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
renderTarget.useRenderToTexture = false;
@@ -1870,7 +1867,7 @@ function WebGLRenderer( parameters = {} ) {
framebuffer = __webglFramebuffer[ activeCubeFace ];
isCube = true;
- } else if ( renderTarget.useRenderbuffer ) {
+ } else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRenderToTexture( renderTarget ) === false ) {
framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;
diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js
index c54fd559d3e062..340428b4b5bc95 100644
--- a/src/renderers/webgl/WebGLTextures.js
+++ b/src/renderers/webgl/WebGLTextures.js
@@ -10,8 +10,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
const maxCubemapSize = capabilities.maxCubemapSize;
const maxTextureSize = capabilities.maxTextureSize;
const maxSamples = capabilities.maxSamples;
- const hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );
- const MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;
+ const MultisampledRenderToTextureExtension = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;
const _videoTextures = new WeakMap();
let _canvas;
@@ -1233,7 +1232,8 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
}
state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
- if ( renderTarget.useRenderToTexture ) {
+
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
@@ -1257,7 +1257,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
let glInternalFormat = _gl.DEPTH_COMPONENT16;
- if ( isMultisample || renderTarget.useRenderToTexture ) {
+ if ( isMultisample || useMultisampledRenderToTexture( renderTarget ) ) {
const depthTexture = renderTarget.depthTexture;
@@ -1277,7 +1277,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
const samples = getRenderTargetSamples( renderTarget );
- if ( renderTarget.useRenderToTexture ) {
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
@@ -1299,11 +1299,11 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
const samples = getRenderTargetSamples( renderTarget );
- if ( isMultisample && renderTarget.useRenderbuffer ) {
+ if ( isMultisample && useMultisampledRenderToTexture( renderTarget ) === false ) {
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
- } else if ( renderTarget.useRenderToTexture ) {
+ } else if ( useMultisampledRenderToTexture( renderTarget ) ) {
MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
@@ -1326,11 +1326,11 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
const samples = getRenderTargetSamples( renderTarget );
- if ( isMultisample && renderTarget.useRenderbuffer ) {
+ if ( isMultisample && useMultisampledRenderToTexture( renderTarget ) === false ) {
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
- } else if ( renderTarget.useRenderToTexture ) {
+ } else if ( useMultisampledRenderToTexture( renderTarget ) ) {
MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
@@ -1378,7 +1378,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
if ( renderTarget.depthTexture.format === DepthFormat ) {
- if ( renderTarget.useRenderToTexture ) {
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
@@ -1390,7 +1390,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
- if ( renderTarget.useRenderToTexture ) {
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
@@ -1537,41 +1537,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
}
- } else if ( renderTarget.useRenderbuffer ) {
-
- if ( isWebGL2 ) {
-
- renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
- renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
-
- _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
-
- const glFormat = utils.convert( texture.format, texture.encoding );
- const glType = utils.convert( texture.type );
- const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
- const samples = getRenderTargetSamples( renderTarget );
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
-
- state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
- _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
+ } else if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRenderToTexture( renderTarget ) === false ) {
- if ( renderTarget.depthBuffer ) {
+ renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
+ renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
- renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();
- setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
- }
-
- state.bindFramebuffer( _gl.FRAMEBUFFER, null );
+ const glFormat = utils.convert( texture.format, texture.encoding );
+ const glType = utils.convert( texture.type );
+ const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
+ const samples = getRenderTargetSamples( renderTarget );
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
- } else {
+ if ( renderTarget.depthBuffer ) {
- console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );
+ renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );
}
+ state.bindFramebuffer( _gl.FRAMEBUFFER, null );
+
}
}
@@ -1692,61 +1683,61 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
function updateMultisampleRenderTarget( renderTarget ) {
- if ( renderTarget.useRenderbuffer ) {
-
- if ( isWebGL2 ) {
+ if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRenderToTexture( renderTarget ) === false ) {
- const width = renderTarget.width;
- const height = renderTarget.height;
- let mask = _gl.COLOR_BUFFER_BIT;
- const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
- const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
+ const width = renderTarget.width;
+ const height = renderTarget.height;
+ let mask = _gl.COLOR_BUFFER_BIT;
+ const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
- if ( renderTarget.depthBuffer ) {
+ if ( renderTarget.depthBuffer ) {
- invalidationArray.push( depthStyle );
+ invalidationArray.push( depthStyle );
- }
+ }
- if ( ! renderTarget.ignoreDepthForMultisampleCopy ) {
+ const renderTargetProperties = properties.get( renderTarget );
+ const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : true;
- if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
- if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
+ if ( ignoreDepthValues === false ) {
- }
+ if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
+ if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
- const renderTargetProperties = properties.get( renderTarget );
+ }
- state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
- if ( renderTarget.ignoreDepthForMultisampleCopy ) {
+ if ( ignoreDepthValues === true ) {
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
- _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
- }
+ }
- _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
+ _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
- state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
- } else {
+ }
- console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );
+ }
- }
+ function getRenderTargetSamples( renderTarget ) {
- }
+ return Math.min( maxSamples, renderTarget.samples );
}
- function getRenderTargetSamples( renderTarget ) {
+ function useMultisampledRenderToTexture( renderTarget ) {
+
+ const renderTargetProperties = properties.get( renderTarget );
- return ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?
- Math.min( maxSamples, renderTarget.samples ) : 0;
+ return isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;
}
@@ -1883,6 +1874,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
this.setupDepthRenderbuffer = setupDepthRenderbuffer;
this.setupFrameBufferTexture = setupFrameBufferTexture;
+ this.useMultisampledRenderToTexture = useMultisampledRenderToTexture;
this.safeSetTexture2D = safeSetTexture2D;
this.safeSetTextureCube = safeSetTextureCube;
diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js
index 53c6ca7d82825a..04df05d6ad443e 100644
--- a/src/renderers/webxr/WebXRManager.js
+++ b/src/renderers/webxr/WebXRManager.js
@@ -7,7 +7,6 @@ import { WebGLAnimation } from '../webgl/WebGLAnimation.js';
import { WebGLRenderTarget } from '../WebGLRenderTarget.js';
import { WebXRController } from './WebXRController.js';
import { DepthTexture } from '../../textures/DepthTexture.js';
-import { WebGLMultisampleRenderTarget } from '../WebGLMultisampleRenderTarget.js';
import {
DepthFormat,
DepthStencilFormat,
@@ -31,13 +30,11 @@ class WebXRManager extends EventDispatcher {
let referenceSpace = null;
let referenceSpaceType = 'local-floor';
- const hasMultisampledRenderToTexture = renderer.extensions.has( 'WEBGL_multisampled_render_to_texture' );
let pose = null;
let glBinding = null;
let glProjLayer = null;
let glBaseLayer = null;
- let isMultisample = false;
let xrFrame = null;
const attributes = gl.getContextAttributes();
let initialRenderTarget = null;
@@ -267,7 +264,6 @@ class WebXRManager extends EventDispatcher {
} else {
- isMultisample = attributes.antialias;
let depthFormat = null;
let depthType = null;
let glDepthFormat = null;
@@ -292,36 +288,20 @@ class WebXRManager extends EventDispatcher {
session.updateRenderState( { layers: [ glProjLayer ] } );
- if ( isMultisample ) {
-
- newRenderTarget = new WebGLMultisampleRenderTarget(
- glProjLayer.textureWidth,
- glProjLayer.textureHeight,
- {
- format: RGBAFormat,
- type: UnsignedByteType,
- depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
- stencilBuffer: attributes.stencil,
- ignoreDepth: glProjLayer.ignoreDepthValues,
- useRenderToTexture: hasMultisampledRenderToTexture,
- encoding: renderer.outputEncoding
- } );
-
- } else {
-
- newRenderTarget = new WebGLRenderTarget(
- glProjLayer.textureWidth,
- glProjLayer.textureHeight,
- {
- format: RGBAFormat,
- type: UnsignedByteType,
- depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
- stencilBuffer: attributes.stencil,
- ignoreDepth: glProjLayer.ignoreDepthValues,
- encoding: renderer.outputEncoding
- } );
-
- }
+ newRenderTarget = new WebGLRenderTarget(
+ glProjLayer.textureWidth,
+ glProjLayer.textureHeight,
+ {
+ format: RGBAFormat,
+ type: UnsignedByteType,
+ depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
+ stencilBuffer: attributes.stencil,
+ encoding: renderer.outputEncoding,
+ samples: attributes.antialias ? 4 : 0
+ } );
+
+ const renderTargetProperties = renderer.properties.get( newRenderTarget );
+ renderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;
}