|
@@ -23979,6 +23979,48 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
}
|
|
|
|
|
|
+ function getInternalDepthFormat( useStencil, depthType ) {
|
|
|
+
|
|
|
+ let glInternalFormat;
|
|
|
+ if ( useStencil ) {
|
|
|
+
|
|
|
+ if ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {
|
|
|
+
|
|
|
+ glInternalFormat = _gl.DEPTH24_STENCIL8;
|
|
|
+
|
|
|
+ } else if ( depthType === FloatType ) {
|
|
|
+
|
|
|
+ glInternalFormat = _gl.DEPTH32F_STENCIL8;
|
|
|
+
|
|
|
+ } else if ( depthType === UnsignedShortType ) {
|
|
|
+
|
|
|
+ glInternalFormat = _gl.DEPTH24_STENCIL8;
|
|
|
+ console.warn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {
|
|
|
+
|
|
|
+ glInternalFormat = _gl.DEPTH_COMPONENT24;
|
|
|
+
|
|
|
+ } else if ( depthType === FloatType ) {
|
|
|
+
|
|
|
+ glInternalFormat = _gl.DEPTH_COMPONENT32F;
|
|
|
+
|
|
|
+ } else if ( depthType === UnsignedShortType ) {
|
|
|
+
|
|
|
+ glInternalFormat = _gl.DEPTH_COMPONENT16;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return glInternalFormat;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
function getMipLevels( texture, image ) {
|
|
|
|
|
|
if ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {
|
|
@@ -24493,23 +24535,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
if ( texture.isDepthTexture ) {
|
|
|
|
|
|
- // populate depth texture with dummy data
|
|
|
-
|
|
|
- glInternalFormat = _gl.DEPTH_COMPONENT16;
|
|
|
-
|
|
|
- if ( texture.type === FloatType ) {
|
|
|
-
|
|
|
- glInternalFormat = _gl.DEPTH_COMPONENT32F;
|
|
|
-
|
|
|
- } else if ( texture.type === UnsignedIntType ) {
|
|
|
-
|
|
|
- glInternalFormat = _gl.DEPTH_COMPONENT24;
|
|
|
-
|
|
|
- } else if ( texture.type === UnsignedInt248Type ) {
|
|
|
-
|
|
|
- glInternalFormat = _gl.DEPTH24_STENCIL8;
|
|
|
-
|
|
|
- }
|
|
|
+ glInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );
|
|
|
|
|
|
//
|
|
|
|
|
@@ -25216,74 +25242,37 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
// Setup storage for internal depth/stencil buffers and bind to correct framebuffer
|
|
|
function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {
|
|
|
|
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
|
|
- if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
|
|
|
-
|
|
|
- let glInternalFormat = _gl.DEPTH_COMPONENT24;
|
|
|
-
|
|
|
- if ( isMultisample || useMultisampledRTT( renderTarget ) ) {
|
|
|
-
|
|
|
- const depthTexture = renderTarget.depthTexture;
|
|
|
-
|
|
|
- if ( depthTexture && depthTexture.isDepthTexture ) {
|
|
|
-
|
|
|
- if ( depthTexture.type === FloatType ) {
|
|
|
-
|
|
|
- glInternalFormat = _gl.DEPTH_COMPONENT32F;
|
|
|
-
|
|
|
- } else if ( depthTexture.type === UnsignedIntType ) {
|
|
|
-
|
|
|
- glInternalFormat = _gl.DEPTH_COMPONENT24;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- const samples = getRenderTargetSamples( renderTarget );
|
|
|
-
|
|
|
- if ( useMultisampledRTT( renderTarget ) ) {
|
|
|
-
|
|
|
- multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
|
+ if ( renderTarget.depthBuffer ) {
|
|
|
|
|
|
- } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
|
+ // retrieve the depth attachment types
|
|
|
+ const depthTexture = renderTarget.depthTexture;
|
|
|
+ const depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;
|
|
|
+ const glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );
|
|
|
+ const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
|
|
|
|
|
|
+ // set up the attachment
|
|
|
const samples = getRenderTargetSamples( renderTarget );
|
|
|
+ const isUseMultisampledRTT = useMultisampledRTT( renderTarget );
|
|
|
+ if ( isUseMultisampledRTT ) {
|
|
|
|
|
|
- if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
|
|
|
-
|
|
|
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
|
|
|
+ multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
- } else if ( useMultisampledRTT( renderTarget ) ) {
|
|
|
+ } else if ( isMultisample ) {
|
|
|
|
|
|
- multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
|
|
|
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
|
|
|
+ _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
|
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
|
|
} else {
|
|
|
|