
Postfx Effects
- 97 installs
- 8 repo stars
- Updated August 4, 2026
- bbeierle12/skill-mcp-claude
postfx-effects is a Claude skill that adds cinematic post-processing effects like chromatic aberration, vignette, depth of field, grain, and color grading to 3D scenes.
About
This skill adds post-processing visual effects to 3D scenes, including chromatic aberration, vignette, depth of field, film grain, color grading, LUT support, tone mapping, scanlines, and god rays. It uses @react-three/postprocessing and provides patterns for cinematic, retro, and atmospheric looks. A developer uses it to add mood, style, and visual storytelling polish to Three.js scenes.
- Chromatic aberration, vignette, and depth of field
- Film grain, color grading, LUT, tone mapping, and scanlines
- Ready-made cinematic effect stack combining multiple effects
Postfx Effects by the numbers
- 97 all-time installs (skills.sh)
- Ranked #133 of 247 Game Development skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
postfx-effects capabilities & compatibility
- Capabilities
- postfx bloom · postfx composer · postfx router
What postfx-effects says it does
Post-processing visual effects including chromatic aberration, vignette, depth of field, film grain, color grading, and LUT support.
Essential for mood, style, and visual storytelling.
npx skills add https://github.com/bbeierle12/skill-mcp-claude --skill postfx-effectsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 97 |
|---|---|
| repo stars | ★ 8 |
| Last updated | August 4, 2026 |
| Repository | bbeierle12/skill-mcp-claude ↗ |
What it does
Add cinematic post-processing effects to 3D scenes: chromatic aberration, vignette, depth of field, film grain, color grading, and LUT.
Who is it for?
Adding cinematic or retro polish to a Three.js scene
Skip if: Bloom/glow-specific work (use postfx-bloom) or pipeline setup (use postfx-composer)
When should I use this skill?
Adding cinematic polish, retro aesthetics, camera simulation, or atmospheric effects
What you get
A styled scene with cinematic, retro, or atmospheric post-processing applied
- Configured post-processing effects
- Cinematic effect stack
By the numbers
- 9+ effects covered (aberration, vignette, DOF, grain, grading, LUT, tone mapping, scanlines, god rays)
Files
Post-Processing Effects
Cinematic and stylistic effects using @react-three/postprocessing.
Quick Start
npm install @react-three/postprocessing postprocessingimport { Canvas } from '@react-three/fiber';
import { EffectComposer, ChromaticAberration, Vignette, Noise } from '@react-three/postprocessing';
function CinematicScene() {
return (
<Canvas>
<Scene />
<EffectComposer>
<ChromaticAberration offset={[0.002, 0.002]} />
<Vignette darkness={0.5} offset={0.3} />
<Noise opacity={0.05} />
</EffectComposer>
</Canvas>
);
}Core Effects
Chromatic Aberration
RGB channel separation for lens distortion or glitch effects.
import { ChromaticAberration } from '@react-three/postprocessing';
import { BlendFunction } from 'postprocessing';
import { Vector2 } from 'three';
// Subtle cinematic fringing
function SubtleChromaticAberration() {
return (
<ChromaticAberration
offset={new Vector2(0.001, 0.001)}
radialModulation
modulationOffset={0.2}
/>
);
}
// 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 (
<ChromaticAberration
ref={offsetRef}
offset={new Vector2(0.002, 0.002)}
blendFunction={BlendFunction.NORMAL}
/>
);
}Vignette
Darkened edges for focus and cinematic framing.
import { Vignette } from '@react-three/postprocessing';
// Soft cinematic vignette
function CinematicVignette() {
return (
<Vignette
offset={0.3} // Distance from center before darkening
darkness={0.5} // How dark edges become
eskil={false} // Use natural vignette formula
/>
);
}
// Harsh spotlight effect
function SpotlightVignette() {
return <Vignette offset={0.1} darkness={0.9} eskil={true} />;
}Depth of Field
Simulated camera focus with bokeh blur.
import { DepthOfField } from '@react-three/postprocessing';
// Focus on specific distance
function StaticDOF() {
return (
<DepthOfField
focusDistance={0.02}
focalLength={0.05}
bokehScale={3}
height={480}
/>
);
}
// 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 <DepthOfField ref={dofRef} focusDistance={0} focalLength={0.02} bokehScale={2} />;
}Noise / Film Grain
import { Noise } from '@react-three/postprocessing';
import { BlendFunction } from 'postprocessing';
// Subtle film grain
function FilmGrain() {
return <Noise opacity={0.04} blendFunction={BlendFunction.OVERLAY} />;
}
// Heavy VHS noise
function VHSNoise() {
return <Noise opacity={0.15} blendFunction={BlendFunction.SCREEN} />;
}Color Grading
import { HueSaturation, BrightnessContrast } from '@react-three/postprocessing';
// Desaturated cinematic look
function CinematicGrade() {
return (
<>
<HueSaturation hue={0} saturation={-0.2} />
<BrightnessContrast brightness={-0.05} contrast={0.1} />
</>
);
}
// Warm sunset mood
function SunsetGrade() {
return (
<>
<HueSaturation hue={0.05} saturation={0.15} />
<BrightnessContrast brightness={0.02} contrast={0.05} />
</>
);
}
// Cold sci-fi atmosphere
function SciFiGrade() {
return (
<>
<HueSaturation hue={-0.1} saturation={-0.1} />
<BrightnessContrast brightness={-0.1} contrast={0.15} />
</>
);
}LUT (Lookup Table)
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 <LUT lut={lut} tetrahedralInterpolation />;
}Tone Mapping
import { ToneMapping } from '@react-three/postprocessing';
import { ToneMappingMode } from 'postprocessing';
function CinematicToneMapping() {
return <ToneMapping mode={ToneMappingMode.ACES_FILMIC} />;
}Scanlines / CRT Effect
import { Scanline } from '@react-three/postprocessing';
function CRTScanlines() {
return <Scanline density={1.25} opacity={0.15} blendFunction={BlendFunction.OVERLAY} />;
}God Rays
import { GodRays } from '@react-three/postprocessing';
function VolumetricLight() {
const sunRef = useRef();
return (
<>
<mesh ref={sunRef} position={[0, 5, -10]}>
<sphereGeometry args={[1, 32, 32]} />
<meshBasicMaterial color="#FFF8E0" />
</mesh>
<EffectComposer>
{sunRef.current && <GodRays sun={sunRef.current} exposure={0.5} decay={0.9} blur />}
</EffectComposer>
</>
);
}Combining Effects
Cinematic Stack
function CinematicStack() {
return (
<EffectComposer>
<ToneMapping mode={ToneMappingMode.ACES_FILMIC} />
<HueSaturation saturation={-0.15} />
<BrightnessContrast brightness={-0.05} contrast={0.1} />
<ChromaticAberration offset={[0.001, 0.001]} />
<Vignette darkness={0.4} offset={0.3} />
<Noise opacity={0.03} blendFunction={BlendFunction.OVERLAY} />
</EffectComposer>
);
}Retro VHS Stack
function VHSStack() {
return (
<EffectComposer>
<HueSaturation saturation={-0.3} />
<BrightnessContrast contrast={0.2} />
<ChromaticAberration offset={[0.005, 0.002]} />
<Scanline density={1.5} opacity={0.1} />
<Noise opacity={0.1} blendFunction={BlendFunction.SCREEN} />
<Vignette darkness={0.6} offset={0.2} />
</EffectComposer>
);
}Dream Sequence Stack
function DreamStack() {
return (
<EffectComposer>
<DepthOfField focusDistance={0.01} focalLength={0.1} bokehScale={4} />
<Bloom luminanceThreshold={0.3} intensity={0.8} />
<HueSaturation saturation={0.2} hue={0.05} />
<BrightnessContrast brightness={0.1} />
<Vignette darkness={0.3} offset={0.4} />
</EffectComposer>
);
}Animated Effects
Time-Driven Color Shift
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 (
<EffectComposer>
<HueSaturation ref={hueRef} saturation={0} hue={0} />
<Vignette ref={vignetteRef} darkness={0.4} offset={0.3} />
</EffectComposer>
);
}Audio-Reactive Effects
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 (
<EffectComposer>
<ChromaticAberration ref={chromaRef} offset={[0.001, 0.001]} />
<Vignette ref={vignetteRef} darkness={0.4} offset={0.3} />
</EffectComposer>
);
}Temporal Collapse Theme
Effects stack for cosmic countdown aesthetic:
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 (
<EffectComposer>
<ToneMapping mode={ToneMappingMode.ACES_FILMIC} />
<HueSaturation hue={-0.05} saturation={-0.1} />
<BrightnessContrast brightness={-0.05} contrast={0.1} />
<ChromaticAberration ref={chromaRef} offset={[0.002, 0.001]} />
<Vignette darkness={0.5} offset={0.25} />
<Noise opacity={0.02} blendFunction={BlendFunction.OVERLAY} />
</EffectComposer>
);
}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 |
function OptimizedEffects() {
return (
<EffectComposer multisampling={0}>
<ToneMapping mode={ToneMappingMode.ACES_FILMIC} />
<Vignette darkness={0.4} />
<Noise opacity={0.02} />
<Bloom intensity={1} mipmapBlur levels={4} />
</EffectComposer>
);
}Reference
- See
postfx-composerfor EffectComposer setup and render targets - See
postfx-bloomfor dedicated bloom techniques - See
postfx-routerfor effect selection guidance
{
"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.",
"tags": [
"3d",
"shaders",
"three.js",
"code-generation"
],
"sub_skills": [],
"source": "claude-user",
"type": "template",
"depends_on": [
"postfx-composer"
],
"enhances": [
"r3f-fundamentals",
"particles-gpu"
],
"last_reviewed_at": null,
"review_score": null,
"relevance_tier": null
}
Related skills
FAQ
What effects does postfx-effects include?
Chromatic aberration, vignette, depth of field, film grain, color grading, LUT, tone mapping, scanlines, and god rays.
Can I combine several effects?
Yes. It provides a cinematic stack combining tone mapping, color grading, aberration, vignette, and grain.