|
@@ -245,8 +245,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ var _isWebGL2 = (typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext);
|
|
var extensions = new THREE.WebGLExtensions( _gl );
|
|
var extensions = new THREE.WebGLExtensions( _gl );
|
|
|
|
|
|
|
|
+ extensions.get( 'WEBGL_depth_texture' );
|
|
extensions.get( 'OES_texture_float' );
|
|
extensions.get( 'OES_texture_float' );
|
|
extensions.get( 'OES_texture_float_linear' );
|
|
extensions.get( 'OES_texture_float_linear' );
|
|
extensions.get( 'OES_texture_half_float' );
|
|
extensions.get( 'OES_texture_half_float' );
|
|
@@ -609,23 +611,33 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
var textureProperties = properties.get( renderTarget.texture );
|
|
var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
|
|
- if ( ! renderTarget || textureProperties.__webglTexture === undefined ) return;
|
|
|
|
|
|
+ if ( ! renderTarget ) return;
|
|
|
|
|
|
- _gl.deleteTexture( textureProperties.__webglTexture );
|
|
|
|
|
|
+ if ( textureProperties.__webglTexture !== undefined ) {
|
|
|
|
+
|
|
|
|
+ _gl.deleteTexture( textureProperties.__webglTexture );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( renderTarget.depthTexture ) {
|
|
|
|
+
|
|
|
|
+ renderTarget.depthTexture.dispose();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
|
|
if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
|
|
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
|
|
- _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
|
|
|
|
|
|
+ if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
|
|
- _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
|
|
|
|
|
|
+ if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3141,7 +3153,27 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var mipmap, mipmaps = texture.mipmaps;
|
|
var mipmap, mipmaps = texture.mipmaps;
|
|
|
|
|
|
- if ( texture instanceof THREE.DataTexture ) {
|
|
|
|
|
|
+ if ( texture instanceof THREE.DepthTexture ) {
|
|
|
|
+
|
|
|
|
+ // populate depth texture with dummy data
|
|
|
|
+
|
|
|
|
+ var internalFormat = _gl.DEPTH_COMPONENT;
|
|
|
|
+
|
|
|
|
+ if ( texture.type === THREE.FloatType ) {
|
|
|
|
+
|
|
|
|
+ if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');
|
|
|
|
+ internalFormat = _gl.DEPTH_COMPONENT32F;
|
|
|
|
+
|
|
|
|
+ } else if ( _isWebGL2 ) {
|
|
|
|
+
|
|
|
|
+ // WebGL 2.0 requires signed internalformat for glTexImage2D
|
|
|
|
+ internalFormat = _gl.DEPTH_COMPONENT16;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );
|
|
|
|
+
|
|
|
|
+ } else if ( texture instanceof THREE.DataTexture ) {
|
|
|
|
|
|
// use manually created mipmaps if available
|
|
// use manually created mipmaps if available
|
|
// if there are no manual mipmaps
|
|
// if there are no manual mipmaps
|
|
@@ -3483,6 +3515,36 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // Setup resources for a Depth Texture for a FBO (needs an extension)
|
|
|
|
+ function setupDepthTexture ( framebuffer, renderTarget ) {
|
|
|
|
+
|
|
|
|
+ var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
|
|
+ if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');
|
|
|
|
+
|
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
|
|
+
|
|
|
|
+ if ( !( renderTarget.depthTexture instanceof THREE.DepthTexture ) ) {
|
|
|
|
+
|
|
|
|
+ throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // upload an empty depth texture with framebuffer size
|
|
|
|
+ if ( !properties.get( renderTarget.depthTexture ).__webglTexture ||
|
|
|
|
+ renderTarget.depthTexture.image.width !== renderTarget.width ||
|
|
|
|
+ renderTarget.depthTexture.image.height !== renderTarget.height ) {
|
|
|
|
+ renderTarget.depthTexture.image.width = renderTarget.width;
|
|
|
|
+ renderTarget.depthTexture.image.height = renderTarget.height;
|
|
|
|
+ renderTarget.depthTexture.needsUpdate = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ _this.setTexture( renderTarget.depthTexture, 0 );
|
|
|
|
+
|
|
|
|
+ var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
|
|
|
|
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
// Setup GL resources for a non-texture depth buffer
|
|
// Setup GL resources for a non-texture depth buffer
|
|
function setupDepthRenderbuffer( renderTarget ) {
|
|
function setupDepthRenderbuffer( renderTarget ) {
|
|
|
|
|
|
@@ -3490,23 +3552,33 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
|
|
|
|
|
|
- if ( isCube ) {
|
|
|
|
|
|
+ if ( renderTarget.depthTexture ) {
|
|
|
|
|
|
- renderTargetProperties.__webglDepthbuffer = [];
|
|
|
|
|
|
+ if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');
|
|
|
|
|
|
- for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
|
|
+ setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
|
|
- _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
|
|
|
|
- renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
|
- setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );
|
|
|
|
|
|
+ if ( isCube ) {
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ renderTargetProperties.__webglDepthbuffer = [];
|
|
|
|
|
|
- } else {
|
|
|
|
|
|
+ for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
+
|
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
|
|
|
|
+ renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
|
|
|
|
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );
|
|
|
|
|
|
- _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
|
|
- renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
|
|
|
|
- setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
|
|
+ renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
|
|
|
|
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3791,6 +3863,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
if ( p === THREE.RGBAFormat ) return _gl.RGBA;
|
|
if ( p === THREE.RGBAFormat ) return _gl.RGBA;
|
|
if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE;
|
|
if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE;
|
|
if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;
|
|
if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;
|
|
|
|
+ if ( p === THREE.DepthFormat ) return _gl.DEPTH_COMPONENT;
|
|
|
|
|
|
if ( p === THREE.AddEquation ) return _gl.FUNC_ADD;
|
|
if ( p === THREE.AddEquation ) return _gl.FUNC_ADD;
|
|
if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT;
|
|
if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT;
|