@@ -139,61 +139,85 @@ export class IOManager {
139139 }
140140
141141 /**
142- * Updates the output buffers of all passes in a given pipeline .
142+ * Restores the original output buffers.
143143 *
144- * @param pipeline - The pipeline to update.
144+ * @param passes - The passes to update.
145145 */
146146
147- private updateOutput ( pipeline : RenderPipeline ) : void {
148-
149- const passes = pipeline . passes . filter ( x => x . enabled ) ;
147+ private restoreOutputBuffers ( passes : Pass < Material | null > [ ] ) : void {
150148
151- for ( let i = 0 , j = 1 , l = passes . length ; i < l ; ++ i , ++ j ) {
149+ const outputDefaultBuffers = this . outputDefaultBuffers ;
152150
153- const pass = passes [ i ] ;
151+ for ( const pass of passes ) {
154152
155153 if ( pass . output . defaultBuffer === null ) {
156154
157155 continue ;
158156
159157 }
160158
161- const outputDefaultBuffers = this . outputDefaultBuffers ;
162-
163159 if ( outputDefaultBuffers . has ( pass . output . defaultBuffer ) ) {
164160
165- // Restore the original buffer.
166161 const originalBuffer = outputDefaultBuffers . get ( pass . output . defaultBuffer ) ! ;
167162 outputDefaultBuffers . delete ( pass . output . defaultBuffer ) ;
168163 pass . output . defaultBuffer = originalBuffer ;
169164
170165 }
171166
172- if ( pipeline . autoRenderToScreen && j === l && pass . output . defaultBuffer !== null ) {
167+ }
168+
169+ }
170+
171+ /**
172+ * Updates the output buffers of all passes in a given pipeline.
173+ *
174+ * @param pipeline - The pipeline to update.
175+ */
176+
177+ private updateOutput ( pipeline : RenderPipeline ) : void {
178+
179+ const passes = pipeline . passes . filter ( x => x . enabled ) ;
180+
181+ if ( pipeline . autoRenderToScreen && passes . length > 0 ) {
182+
183+ this . restoreOutputBuffers ( passes ) ;
184+
185+ const outputDefaultBuffers = this . outputDefaultBuffers ;
186+ const lastPass = passes [ passes . length - 1 ] ;
187+
188+ if ( lastPass . output . defaultBuffer !== null ) {
173189
174190 // Remember the original buffer and set the default buffer to null.
175- outputDefaultBuffers . set ( pass . output . defaultBuffer , pass . output . defaultBuffer . value ) ;
176- pass . output . defaultBuffer = null ;
191+ outputDefaultBuffers . set ( lastPass . output . defaultBuffer , lastPass . output . defaultBuffer . value ) ;
192+ lastPass . output . defaultBuffer = null ;
193+
194+ if ( passes . filter ( x => x . output . defaultBuffer === lastPass . output . defaultBuffer ) . length > 1 ) {
195+
196+ console . warn ( "Encountered multiple passes that use the same default output buffer" ) ;
197+
198+ }
177199
178200 }
179201
180202 }
181203
182204 // Connect clear passes with subsequent passes.
183- for ( let i = 0 , j = 1 , l = passes . length ; i < l ; ++ i , ++ j ) {
205+ for ( let i = 0 , j = 1 , l = passes . length ; j < l ; ++ i , ++ j ) {
184206
185207 const pass = passes [ i ] ;
186208
187- if ( j < l && pass instanceof ClearPass ) {
209+ if ( ! ( pass instanceof ClearPass ) ) {
188210
189- // Assign the output resources of the next pass to this clear pass.
190- const nextPass = passes [ j ] ;
191- nextPass . output . defines . forEach ( ( value , key ) => pass . output . defines . set ( key , value ) ) ;
192- nextPass . output . uniforms . forEach ( ( value , key ) => pass . output . uniforms . set ( key , value ) ) ;
193- pass . output . defaultBuffer = nextPass . output . defaultBuffer ;
211+ continue ;
194212
195213 }
196214
215+ // Assign the output resources of the next pass to this clear pass.
216+ const nextPass = passes [ j ] ;
217+ nextPass . output . defines . forEach ( ( value , key ) => pass . output . defines . set ( key , value ) ) ;
218+ nextPass . output . uniforms . forEach ( ( value , key ) => pass . output . uniforms . set ( key , value ) ) ;
219+ pass . output . defaultBuffer = nextPass . output . defaultBuffer ;
220+
197221 }
198222
199223 }
0 commit comments