Skip to content

Commit

Permalink
WebGLRenderer: Allow for binding and rendering into a 2d render targe…
Browse files Browse the repository at this point in the history
…t mipmap (mrdoob#29844)

* Allow for binding and rendering into a render target mipmap

* Fix MSRT mipmap rendering
  • Loading branch information
gkjohnson authored Dec 18, 2024
1 parent e92ee2d commit 9453444
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,7 @@ class WebGLRenderer {

//

if ( _currentRenderTarget !== null ) {
if ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {

// resolve multisample renderbuffers to a single-sample texture if necessary

Expand Down Expand Up @@ -2267,6 +2267,7 @@ class WebGLRenderer {

};

const _scratchFrameBuffer = _gl.createFramebuffer();
this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {

_currentRenderTarget = renderTarget;
Expand Down Expand Up @@ -2375,6 +2376,14 @@ class WebGLRenderer {

}

// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers
// being bound that are different sizes.
if ( activeMipmapLevel !== 0 ) {

framebuffer = _scratchFrameBuffer;

}

const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );

if ( framebufferBound && useDefaultFramebuffer ) {
Expand All @@ -2395,8 +2404,15 @@ class WebGLRenderer {
} else if ( isRenderTarget3D ) {

const textureProperties = properties.get( renderTarget.texture );
const layer = activeCubeFace || 0;
_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );
const layer = activeCubeFace;
_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel, layer );

} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {

// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.
// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.
const textureProperties = properties.get( renderTarget.texture );
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );

}

Expand Down

0 comments on commit 9453444

Please sign in to comment.