|
@@ -2714,10 +2714,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
texture.image = clampToMaxSize( texture.image, capabilities.maxTextureSize );
|
|
texture.image = clampToMaxSize( texture.image, capabilities.maxTextureSize );
|
|
|
|
|
|
- var image = texture.image,
|
|
|
|
- isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
|
|
|
|
- glFormat = paramThreeToGL( texture.format ),
|
|
|
|
- glType = paramThreeToGL( texture.type );
|
|
|
|
|
|
+ var image = texture.image;
|
|
|
|
+ var isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height );
|
|
|
|
+ var glFormat = paramThreeToGL( texture.format );
|
|
|
|
+ var glType = paramThreeToGL( texture.type );
|
|
|
|
|
|
setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
|
|
setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
|
|
|
|
|
|
@@ -2907,10 +2907,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- var image = cubeImage[ 0 ],
|
|
|
|
- isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
|
|
|
|
- glFormat = paramThreeToGL( texture.format ),
|
|
|
|
- glType = paramThreeToGL( texture.type );
|
|
|
|
|
|
+ var image = cubeImage[ 0 ];
|
|
|
|
+ var isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height );
|
|
|
|
+ var glFormat = paramThreeToGL( texture.format );
|
|
|
|
+ var glType = paramThreeToGL( texture.type );
|
|
|
|
|
|
setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo );
|
|
setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo );
|
|
|
|
|
|
@@ -2990,148 +2990,126 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// Render targets
|
|
// Render targets
|
|
|
|
|
|
- function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
|
|
|
|
|
|
+ // Setup storage for target texture and bind it to correct framebuffer
|
|
|
|
+ function setupFrameBufferTexture ( framebuffer, renderTarget, attachment, textureTarget ) {
|
|
|
|
|
|
|
|
+ var glFormat = paramThreeToGL( renderTarget.texture.format );
|
|
|
|
+ var glType = paramThreeToGL( renderTarget.texture.type );
|
|
|
|
+ state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
|
|
|
|
|
|
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
|
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- function setupRenderBuffer ( renderbuffer, renderTarget ) {
|
|
|
|
|
|
+ // Setup storage for internal depth/stencil buffers and bind to correct framebuffer
|
|
|
|
+ function setupRenderBufferStorage ( renderbuffer, renderTarget ) {
|
|
|
|
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
|
|
if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
|
|
if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
|
|
-
|
|
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
|
|
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
-
|
|
|
|
- /* For some reason this is not working. Defaulting to RGBA4.
|
|
|
|
- } else if ( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
|
|
-
|
|
|
|
- _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height );
|
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
-
|
|
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
|
|
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
-
|
|
|
|
} else {
|
|
} else {
|
|
-
|
|
|
|
|
|
+ // FIXME: We don't support !depth !stencil
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
|
|
}
|
|
}
|
|
|
|
|
|
- this.setRenderTarget = function ( renderTarget ) {
|
|
|
|
|
|
+ // Setup GL resources for a non-texture depth buffer
|
|
|
|
+ function setupDepthRenderbuffer(renderTarget) {
|
|
|
|
+
|
|
|
|
+ var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
|
|
var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
-
|
|
|
|
- if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
|
|
|
|
-
|
|
|
|
- var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
- var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
-
|
|
|
|
- if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
|
|
|
|
- if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;
|
|
|
|
-
|
|
|
|
- renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
-
|
|
|
|
- textureProperties.__webglTexture = _gl.createTexture();
|
|
|
|
-
|
|
|
|
- _infoMemory.textures ++;
|
|
|
|
-
|
|
|
|
- // Setup texture, create render and frame buffers
|
|
|
|
-
|
|
|
|
- var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ),
|
|
|
|
- glFormat = paramThreeToGL( renderTarget.texture.format ),
|
|
|
|
- glType = paramThreeToGL( renderTarget.texture.type );
|
|
|
|
-
|
|
|
|
- if ( isCube ) {
|
|
|
|
-
|
|
|
|
- renderTargetProperties.__webglFramebuffer = [];
|
|
|
|
- renderTargetProperties.__webglRenderbuffer = [];
|
|
|
|
-
|
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
|
|
-
|
|
|
|
- setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
-
|
|
|
|
- for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
-
|
|
|
|
- renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
|
|
|
|
- renderTargetProperties.__webglRenderbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
|
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
-
|
|
|
|
- setupFrameBuffer( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
|
|
|
|
- setupRenderBuffer( renderTargetProperties.__webglRenderbuffer[ i ], renderTarget );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
|
|
|
|
-
|
|
|
|
- if ( renderTarget.shareDepthFrom ) {
|
|
|
|
-
|
|
|
|
- renderTargetProperties.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer;
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- renderTargetProperties.__webglRenderbuffer = _gl.createRenderbuffer();
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
|
- setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
-
|
|
|
|
- state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
|
|
-
|
|
|
|
- setupFrameBuffer( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D );
|
|
|
|
-
|
|
|
|
- if ( renderTarget.shareDepthFrom ) {
|
|
|
|
-
|
|
|
|
- if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
|
|
|
|
-
|
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer );
|
|
|
|
-
|
|
|
|
- } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
|
|
-
|
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- setupRenderBuffer( renderTargetProperties.__webglRenderbuffer, renderTarget );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
|
-
|
|
|
|
|
|
+ if ( isCube ) {
|
|
|
|
+ renderTargetProperties.__webglDepthbuffer = [];
|
|
|
|
+ for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ]);
|
|
|
|
+ renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
|
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
|
|
+ renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
|
|
|
|
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );
|
|
|
|
+ }
|
|
|
|
+ _gl.bindFramebuffer(_gl.FRAMEBUFFER, null );
|
|
|
|
+ };
|
|
|
|
|
|
- // Release everything
|
|
|
|
|
|
+ // Set up GL resources for the render target
|
|
|
|
+ function setupRenderTarget(renderTarget) {
|
|
|
|
+ var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
+ var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
|
|
- if ( isCube ) {
|
|
|
|
|
|
+ renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
+
|
|
|
|
+ textureProperties.__webglTexture = _gl.createTexture();
|
|
|
|
+
|
|
|
|
+ _infoMemory.textures ++;
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
|
|
|
|
|
|
+ var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
|
|
+ var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height );
|
|
|
|
+ var glFormat = paramThreeToGL( renderTarget.texture.format );
|
|
|
|
+ var glType = paramThreeToGL( renderTarget.texture.type );
|
|
|
|
|
|
- } else {
|
|
|
|
|
|
+ //
|
|
|
|
+ // Setup framebuffer
|
|
|
|
+ //
|
|
|
|
|
|
- state.bindTexture( _gl.TEXTURE_2D, null );
|
|
|
|
|
|
+ if ( isCube ) {
|
|
|
|
+ renderTargetProperties.__webglFramebuffer = [];
|
|
|
|
+ for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
+ renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ //
|
|
|
|
+ // Setup color buffer
|
|
|
|
+ //
|
|
|
|
+ if ( isCube ) {
|
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
|
|
+ setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
+ for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
|
|
+ state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
|
+ setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
|
|
|
|
+
|
|
|
|
+ if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
|
+ state.bindTexture( _gl.TEXTURE_2D, null );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //
|
|
|
|
+ // Setup depth and stencil buffers
|
|
|
|
+ //
|
|
|
|
+ if ( renderTarget.depthBuffer ) {
|
|
|
|
+ setupDepthRenderbuffer(renderTarget);
|
|
|
|
+ }
|
|
|
|
|
|
- _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
|
|
|
|
- _gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.setRenderTarget = function ( renderTarget ) {
|
|
|
|
|
|
|
|
+ if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
|
|
|
|
+ setupRenderTarget(renderTarget);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
var framebuffer, width, height, vx, vy;
|
|
var framebuffer, width, height, vx, vy;
|
|
|
|
|
|
if ( renderTarget ) {
|
|
if ( renderTarget ) {
|