|
@@ -10,8 +10,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
const maxCubemapSize = capabilities.maxCubemapSize;
|
|
const maxCubemapSize = capabilities.maxCubemapSize;
|
|
const maxTextureSize = capabilities.maxTextureSize;
|
|
const maxTextureSize = capabilities.maxTextureSize;
|
|
const maxSamples = capabilities.maxSamples;
|
|
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();
|
|
const _videoTextures = new WeakMap();
|
|
let _canvas;
|
|
let _canvas;
|
|
@@ -1233,7 +1232,8 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
}
|
|
}
|
|
|
|
|
|
state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
- if ( renderTarget.useRenderToTexture ) {
|
|
|
|
|
|
+
|
|
|
|
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
|
|
|
|
|
|
MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( 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;
|
|
let glInternalFormat = _gl.DEPTH_COMPONENT16;
|
|
|
|
|
|
- if ( isMultisample || renderTarget.useRenderToTexture ) {
|
|
|
|
|
|
+ if ( isMultisample || useMultisampledRenderToTexture( renderTarget ) ) {
|
|
|
|
|
|
const depthTexture = renderTarget.depthTexture;
|
|
const depthTexture = renderTarget.depthTexture;
|
|
|
|
|
|
@@ -1277,7 +1277,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
|
|
|
|
- if ( renderTarget.useRenderToTexture ) {
|
|
|
|
|
|
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
|
|
|
|
|
|
MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
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 );
|
|
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 );
|
|
_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 );
|
|
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 glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
|
|
|
|
- if ( isMultisample && renderTarget.useRenderbuffer ) {
|
|
|
|
|
|
+ if ( isMultisample && useMultisampledRenderToTexture( renderTarget ) === false ) {
|
|
|
|
|
|
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
_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 );
|
|
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.depthTexture.format === DepthFormat ) {
|
|
|
|
|
|
- if ( renderTarget.useRenderToTexture ) {
|
|
|
|
|
|
+ if ( useMultisampledRenderToTexture( renderTarget ) ) {
|
|
|
|
|
|
MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
|
|
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 ) {
|
|
} 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 );
|
|
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 ) {
|
|
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.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
|
|
this.setupDepthRenderbuffer = setupDepthRenderbuffer;
|
|
this.setupDepthRenderbuffer = setupDepthRenderbuffer;
|
|
this.setupFrameBufferTexture = setupFrameBufferTexture;
|
|
this.setupFrameBufferTexture = setupFrameBufferTexture;
|
|
|
|
+ this.useMultisampledRenderToTexture = useMultisampledRenderToTexture;
|
|
|
|
|
|
this.safeSetTexture2D = safeSetTexture2D;
|
|
this.safeSetTexture2D = safeSetTexture2D;
|
|
this.safeSetTextureCube = safeSetTextureCube;
|
|
this.safeSetTextureCube = safeSetTextureCube;
|