Owns the small boilerplate that every post-processing stage repeats:
the shared caps-aware fullscreen-triangle geometry, the mesh that
wraps it, a single-mesh Scene, and the unit OrthographicCamera
that THREE.WebGLRenderer.render / WebGPURenderer.render
need as their second argument.
Centralising this here means:
The caps-aware createFullscreenTriangleGeometry call lives
in exactly one place, so future Y-orientation tweaks don't have
to be applied per pass.
The frustumCulled = false invariant (without it the renderer
sometimes culls the triangle because its bounding sphere is small
relative to NDC) is held in one constructor.
The render scene/camera pair is shared, so consumers stop carrying
this.scene / this.camera / this.mesh triples on their own.
The bloom chain reuses one FullscreenPass across its three
materials (threshold, downsample, upsample) by calling
FullscreenPass.setMaterial between draws — mirroring what the
pre-extraction code already did against the bare mesh.material.
Reusable fullscreen-triangle render pass.
Owns the small boilerplate that every post-processing stage repeats: the shared caps-aware fullscreen-triangle geometry, the mesh that wraps it, a single-mesh
Scene, and the unitOrthographicCamerathat THREE.WebGLRenderer.render / WebGPURenderer.render need as their second argument.Centralising this here means:
frustumCulled = falseinvariant (without it the renderer sometimes culls the triangle because its bounding sphere is small relative to NDC) is held in one constructor.this.scene/this.camera/this.meshtriples on their own.The bloom chain reuses one
FullscreenPassacross its three materials (threshold, downsample, upsample) by calling FullscreenPass.setMaterial between draws — mirroring what the pre-extraction code already did against the baremesh.material.