|
@@ -835,7 +835,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
const glFormat = utils.convert( renderTarget.texture.format );
|
|
const glFormat = utils.convert( renderTarget.texture.format );
|
|
const glType = utils.convert( renderTarget.texture.type );
|
|
const glType = utils.convert( renderTarget.texture.type );
|
|
const glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );
|
|
const glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );
|
|
- state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
|
|
+
|
|
|
|
+ if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
|
|
|
|
+
|
|
|
|
+ state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
|
|
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
|
|
@@ -1011,8 +1021,10 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
// Set up GL resources for the render target
|
|
// Set up GL resources for the render target
|
|
function setupRenderTarget( renderTarget ) {
|
|
function setupRenderTarget( renderTarget ) {
|
|
|
|
|
|
|
|
+ const texture = renderTarget.texture;
|
|
|
|
+
|
|
const renderTargetProperties = properties.get( renderTarget );
|
|
const renderTargetProperties = properties.get( renderTarget );
|
|
- const textureProperties = properties.get( renderTarget.texture );
|
|
|
|
|
|
+ const textureProperties = properties.get( texture );
|
|
|
|
|
|
renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
|
|
@@ -1022,13 +1034,14 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
|
|
const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
|
|
const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );
|
|
const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );
|
|
|
|
+ const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;
|
|
const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
|
|
const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
|
|
|
|
|
|
// Handles WebGL2 RGBFormat fallback - #18858
|
|
// Handles WebGL2 RGBFormat fallback - #18858
|
|
|
|
|
|
- if ( isWebGL2 && renderTarget.texture.format === RGBFormat && ( renderTarget.texture.type === FloatType || renderTarget.texture.type === HalfFloatType ) ) {
|
|
|
|
|
|
+ if ( isWebGL2 && texture.format === RGBFormat && ( texture.type === FloatType || texture.type === HalfFloatType ) ) {
|
|
|
|
|
|
- renderTarget.texture.format = RGBAFormat;
|
|
|
|
|
|
+ texture.format = RGBAFormat;
|
|
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' );
|
|
console.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' );
|
|
|
|
|
|
@@ -1059,9 +1072,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
|
|
|
|
|
|
- const glFormat = utils.convert( renderTarget.texture.format );
|
|
|
|
- const glType = utils.convert( renderTarget.texture.type );
|
|
|
|
- const glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );
|
|
|
|
|
|
+ const glFormat = utils.convert( texture.format );
|
|
|
|
+ const glType = utils.convert( texture.type );
|
|
|
|
+ const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType );
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
@@ -1094,7 +1107,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
if ( isCube ) {
|
|
if ( isCube ) {
|
|
|
|
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
- setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, supportsMips );
|
|
|
|
|
|
+ setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
|
|
|
|
|
|
for ( let i = 0; i < 6; i ++ ) {
|
|
for ( let i = 0; i < 6; i ++ ) {
|
|
|
|
|
|
@@ -1102,9 +1115,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- if ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {
|
|
|
|
|
|
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
|
|
|
|
|
|
- generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
+ generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1112,13 +1125,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
|
- setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, supportsMips );
|
|
|
|
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
|
|
|
|
|
|
+ let glTextureType = _gl.TEXTURE_2D;
|
|
|
|
+
|
|
|
|
+ if ( isRenderTarget3D ) {
|
|
|
|
+
|
|
|
|
+ // Render targets containing layers, i.e: Texture 3D and 2d arrays
|
|
|
|
+
|
|
|
|
+ if ( isWebGL2 ) {
|
|
|
|
+
|
|
|
|
+ const isTexture3D = texture.isDataTexture3D;
|
|
|
|
+ glTextureType = isTexture3D ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ console.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ state.bindTexture( glTextureType, textureProperties.__webglTexture );
|
|
|
|
+ setTextureParameters( glTextureType, texture, supportsMips );
|
|
|
|
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, glTextureType );
|
|
|
|
|
|
- if ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {
|
|
|
|
|
|
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
|
|
|
|
|
|
- generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
+ generateMipmap( _gl.TEXTURE_2D, texture, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|