--- name: postfx-effects description: Post-processing visual effects including chromatic aberration, vignette, depth of field, film grain, color grading, and LUT support. Use when adding cinematic polish, retro aesthetics, camera simulation, or atmospheric effects to 3D scenes. Essential for mood, style, and visual storytelling. --- # Post-Processing Effects Cinematic and stylistic effects using @react-three/postprocessing. ## Quick Start ```bash npm install @react-three/postprocessing postprocessing ``` ```tsx import { Canvas } from '@react-three/fiber'; import { EffectComposer, ChromaticAberration, Vignette, Noise } from '@react-three/postprocessing'; function CinematicScene() { return ( ); } ``` ## Core Effects ### Chromatic Aberration RGB channel separation for lens distortion or glitch effects. ```tsx import { ChromaticAberration } from '@react-three/postprocessing'; import { BlendFunction } from 'postprocessing'; import { Vector2 } from 'three'; // Subtle cinematic fringing function SubtleChromaticAberration() { return ( ); } // Intense glitch effect function GlitchChromaticAberration() { const offsetRef = useRef(); useFrame(({ clock }) => { if (offsetRef.current) { const glitch = Math.random() > 0.95 ? 0.01 : 0.002; offsetRef.current.offset.set(glitch, glitch * 0.5); } }); return ( ); } ``` ### Vignette Darkened edges for focus and cinematic framing. ```tsx import { Vignette } from '@react-three/postprocessing'; // Soft cinematic vignette function CinematicVignette() { return ( ); } // Harsh spotlight effect function SpotlightVignette() { return ; } ``` ### Depth of Field Simulated camera focus with bokeh blur. ```tsx import { DepthOfField } from '@react-three/postprocessing'; // Focus on specific distance function StaticDOF() { return ( ); } // Focus follows target object function TrackingDOF({ targetRef }) { const dofRef = useRef(); const { camera } = useThree(); useFrame(() => { if (targetRef.current && dofRef.current) { const distance = camera.position.distanceTo(targetRef.current.position); dofRef.current.target = distance; } }); return ; } ``` ### Noise / Film Grain ```tsx import { Noise } from '@react-three/postprocessing'; import { BlendFunction } from 'postprocessing'; // Subtle film grain function FilmGrain() { return ; } // Heavy VHS noise function VHSNoise() { return ; } ``` ### Color Grading ```tsx import { HueSaturation, BrightnessContrast } from '@react-three/postprocessing'; // Desaturated cinematic look function CinematicGrade() { return ( <> ); } // Warm sunset mood function SunsetGrade() { return ( <> ); } // Cold sci-fi atmosphere function SciFiGrade() { return ( <> ); } ``` ### LUT (Lookup Table) ```tsx import { LUT } from '@react-three/postprocessing'; import { LookupTexture } from 'postprocessing'; function LUTGrading() { const [lut, setLut] = useState(null); useEffect(() => { LookupTexture.createLookupTexture('/luts/cinematic.cube').then(setLut); }, []); if (!lut) return null; return ; } ``` ### Tone Mapping ```tsx import { ToneMapping } from '@react-three/postprocessing'; import { ToneMappingMode } from 'postprocessing'; function CinematicToneMapping() { return ; } ``` ### Scanlines / CRT Effect ```tsx import { Scanline } from '@react-three/postprocessing'; function CRTScanlines() { return ; } ``` ### God Rays ```tsx import { GodRays } from '@react-three/postprocessing'; function VolumetricLight() { const sunRef = useRef(); return ( <> {sunRef.current && } ); } ``` ## Combining Effects ### Cinematic Stack ```tsx function CinematicStack() { return ( ); } ``` ### Retro VHS Stack ```tsx function VHSStack() { return ( ); } ``` ### Dream Sequence Stack ```tsx function DreamStack() { return ( ); } ``` ## Animated Effects ### Time-Driven Color Shift ```tsx function TimeDrivenEffects() { const hueRef = useRef(); const vignetteRef = useRef(); useFrame(({ clock }) => { const t = clock.elapsedTime; if (hueRef.current) hueRef.current.hue = Math.sin(t * 0.1) * 0.1; if (vignetteRef.current) vignetteRef.current.darkness = 0.4 + Math.sin(t * 2) * 0.1; }); return ( ); } ``` ### Audio-Reactive Effects ```tsx function AudioReactiveEffects({ audioData }) { const chromaRef = useRef(); const vignetteRef = useRef(); useFrame(() => { if (!audioData) return; const bass = audioData[0] / 255; const mid = audioData[4] / 255; if (chromaRef.current) { const offset = 0.001 + bass * 0.005; chromaRef.current.offset.set(offset, offset * 0.5); } if (vignetteRef.current) { vignetteRef.current.darkness = 0.3 + mid * 0.3; } }); return ( ); } ``` ## Temporal Collapse Theme Effects stack for cosmic countdown aesthetic: ```tsx function TemporalCollapseEffects() { const chromaRef = useRef(); useFrame(({ clock }) => { if (chromaRef.current) { const pulse = Math.sin(clock.elapsedTime * 1.5) * 0.001; chromaRef.current.offset.set(0.002 + pulse, 0.001 + pulse * 0.5); } }); return ( ); } ``` ## Performance Tips | Technique | Impact | Solution | |-----------|--------|----------| | Multiple blur effects | High | Combine DOF with bloom carefully | | High DOF resolution | High | Use `height={480}` or lower | | LUT loading | Medium | Preload, cache texture | | Many effects | Medium | Order effects efficiently | ```tsx function OptimizedEffects() { return ( ); } ``` ## Reference - See `postfx-composer` for EffectComposer setup and render targets - See `postfx-bloom` for dedicated bloom techniques - See `postfx-router` for effect selection guidance