@@ -418,15 +418,14 @@ class Renderer {
418418 this . _background = null ;
419419
420420 /**
421+ * Cache for the fullscreen quad.
421422 * This fullscreen quad is used for internal render passes
422423 * like the tone mapping and color space output pass.
423424 *
424425 * @private
425- * @type {QuadMesh }
426+ * @type {Map<Texture, QuadMesh> }
426427 */
427- this . _quad = new QuadMesh ( new NodeMaterial ( ) ) ;
428- this . _quad . name = 'Output Color Transform' ;
429- this . _quad . material . name = 'outputColorTransform' ;
428+ this . _quadCache = new Map ( ) ;
430429
431430 /**
432431 * A reference to the current render context.
@@ -1788,12 +1787,52 @@ class Renderer {
17881787 */
17891788 _renderOutput ( renderTarget ) {
17901789
1791- const quad = this . _quad ;
1790+ const cacheKey = this . _nodes . getOutputCacheKey ( ) ;
17921791
1793- if ( this . _nodes . hasOutputChange ( renderTarget . texture ) ) {
1792+ let quadData = this . _quadCache . get ( renderTarget . texture ) ;
1793+ let quad ;
1794+
1795+ if ( quadData === undefined ) {
1796+
1797+ quad = new QuadMesh ( new NodeMaterial ( ) ) ;
1798+ quad . name = 'Output Color Transform' ;
1799+ quad . material . name = 'outputColorTransform' ;
17941800
17951801 quad . material . fragmentNode = this . _nodes . getOutputNode ( renderTarget . texture ) ;
1796- quad . material . needsUpdate = true ;
1802+
1803+ quadData = {
1804+ quad,
1805+ cacheKey
1806+ } ;
1807+
1808+ this . _quadCache . set ( renderTarget . texture , quadData ) ;
1809+
1810+ // dispose logic
1811+
1812+ const dispose = ( ) => {
1813+
1814+ quad . material . dispose ( ) ;
1815+
1816+ this . _quadCache . delete ( renderTarget . texture ) ;
1817+
1818+ renderTarget . texture . removeEventListener ( 'dispose' , dispose ) ;
1819+
1820+ } ;
1821+
1822+ renderTarget . texture . addEventListener ( 'dispose' , dispose ) ;
1823+
1824+ } else {
1825+
1826+ quad = quadData . quad ;
1827+
1828+ if ( quadData . cacheKey !== cacheKey ) {
1829+
1830+ quad . material . fragmentNode = this . _nodes . getOutputNode ( renderTarget . texture ) ;
1831+ quad . material . needsUpdate = true ;
1832+
1833+ quadData . cacheKey = cacheKey ;
1834+
1835+ }
17971836
17981837 }
17991838
0 commit comments