@@ -10,44 +10,16 @@ import {
1010 WebGLRenderTarget
1111} from "three" ;
1212
13- const dummyCamera = /* @__PURE__ */ new Camera ( ) ;
14- let geometry = null ;
15-
16- /**
17- * Returns a shared fullscreen triangle.
18- *
19- * The screen size is 2x2 units (NDC). A triangle needs to be 4x4 units to fill the screen.
20- *
21- * @private
22- * @return {BufferGeometry } The fullscreen geometry.
23- */
24-
25- function getFullscreenTriangle ( ) {
26-
27- if ( geometry === null ) {
28-
29- const vertices = new Float32Array ( [ - 1 , - 1 , 0 , 3 , - 1 , 0 , - 1 , 3 , 0 ] ) ;
30- const uvs = new Float32Array ( [ 0 , 0 , 2 , 0 , 0 , 2 ] ) ;
31- geometry = new BufferGeometry ( ) ;
32-
33- // Added for backward compatibility (setAttribute was added in three r110).
34- if ( geometry . setAttribute !== undefined ) {
35-
36- geometry . setAttribute ( "position" , new BufferAttribute ( vertices , 3 ) ) ;
37- geometry . setAttribute ( "uv" , new BufferAttribute ( uvs , 2 ) ) ;
38-
39- } else {
40-
41- geometry . addAttribute ( "position" , new BufferAttribute ( vertices , 3 ) ) ;
42- geometry . addAttribute ( "uv" , new BufferAttribute ( uvs , 2 ) ) ;
43-
44- }
45-
46- }
13+ const fullscreenGeometry = /* @__PURE__ */ ( ( ) => {
4714
15+ const vertices = new Float32Array ( [ - 1 , - 1 , 0 , 3 , - 1 , 0 , - 1 , 3 , 0 ] ) ;
16+ const uvs = new Float32Array ( [ 0 , 0 , 2 , 0 , 0 , 2 ] ) ;
17+ const geometry = new BufferGeometry ( ) ;
18+ geometry . setAttribute ( "position" , new BufferAttribute ( vertices , 3 ) ) ;
19+ geometry . setAttribute ( "uv" , new BufferAttribute ( uvs , 2 ) ) ;
4820 return geometry ;
4921
50- }
22+ } ) ( ) ;
5123
5224/**
5325 * An abstract pass.
@@ -62,6 +34,21 @@ function getFullscreenTriangle() {
6234
6335export class Pass {
6436
37+ /**
38+ * A shared fullscreen triangle.
39+ *
40+ * The screen size is 2x2 units (NDC). A triangle needs to be 4x4 units to fill the screen.
41+ * @see https://michaldrobot.com/2014/04/01/gcn-execution-patterns-in-full-screen-passes/
42+ * @type {BufferGeometry }
43+ * @internal
44+ */
45+
46+ static get fullscreenGeometry ( ) {
47+
48+ return fullscreenGeometry ;
49+
50+ }
51+
6552 /**
6653 * Constructs a new pass.
6754 *
@@ -70,7 +57,7 @@ export class Pass {
7057 * @param {Camera } [camera] - A camera. Fullscreen effect passes don't require a camera.
7158 */
7259
73- constructor ( name = "Pass" , scene = new Scene ( ) , camera = dummyCamera ) {
60+ constructor ( name = "Pass" , scene = new Scene ( ) , camera = new Camera ( ) ) {
7461
7562 /**
7663 * The name of this pass.
@@ -268,7 +255,7 @@ export class Pass {
268255
269256 } else {
270257
271- screen = new Mesh ( getFullscreenTriangle ( ) , value ) ;
258+ screen = new Mesh ( Pass . fullscreenGeometry , value ) ;
272259 screen . frustumCulled = false ;
273260
274261 if ( this . scene === null ) {
@@ -406,6 +393,12 @@ export class Pass {
406393
407394 }
408395
396+ if ( this . fullscreenMaterial !== null ) {
397+
398+ this . fullscreenMaterial . dispose ( ) ;
399+
400+ }
401+
409402 }
410403
411404}
0 commit comments