Loading...
Loading...
Use when lighting, rendering or compositing in Blender: light a character, product or hero shot, interior at dusk or night, three-point or motivated lighting, sun and sky, HDRI, EEVEE vs Cycles settings, light leaks or noise, flat or muddy renders, subject not standing out, AgX/ACES color management, render passes, EXR, light groups, bloom and vignette in the 5.x compositor, rule of thirds and value checks, toon/NPR looks, or judging a render like a lighter.
npx skill4agent add scenario-labs/skills scenario-blender-lighting-renderingnpx skills add scenario-labs/skills --skill <name>scripts/bx_light.pysys.path.append("<this skill>/scripts"); import bx_light as BLexposureBL.light_groupsBL.lightgroup_mix| Input | Why it changes the plan | Default when silent |
|---|---|---|
| Still or animation | Continuity, flicker and temporal denoise | Still |
| Engine | EEVEE: stylized, fast iteration, volumes, NPR, viewport comp with passes. Cycles: glass close-ups, bounce realism, reference | EEVEE to iterate, plus a Cycles reference render |
| Style | Toon terminators need a small, unjittered key | Stylized-realistic |
| Subject and focus point | Rig target (the face), mask for the analysis | Character head, else bbox center |
| Time and motivation | Color scheme: warm practicals, cool sky, sun | Night/dusk interior: warm key (2,700 K [added]), cool fill |
| Delivery | PNG display plus EXR master; external grade? | PNG + 32-bit multilayer EXR |
| Color fidelity | Brand RGB: Khronos PBR Neutral; skin: ACES 2.0 or AgX High Contrast | AgX |
| Late balance changes, comp hand-off | Cycles light groups per role, multilayer EXR | groups when rendering in Cycles |
BL.screen_xyBL.aim_camera_at_frame_point(head, 1/3 or 2/3, 0.62)pb = BL.volume_probe_for_room(inner_lo, inner_hi, cell=0.5, wall=0.2)BL.probe_report(pb, inner_lo, inner_hi)BL.bake_probes()BL.outdoor_sun_sky(..., azimuth_space="world")probe_reportBL.three_pointBL.motivated_interiorBL.outdoor_sun_skyBL.light_report(target=head, face=head)BL.clay(True)internal_ratio >= 2.5BL.eye_lightBL.shadow_casterBL.fake_sunBL.split_worldBL.hazeobj.light_linkingBL.link_lightBL.light_contributions(lights, mask, dir)BL.lightgroup_check(exr, mask)r = BL.render(base)mask = BL.mask_cryptomatte(r["exr"], names)BL.mask_workbenchrep = BL.analyse(r["png"], mask, exr=r["exr"])BL.verdict(rep)BL.value_study(...)BL.color_setup(view, look, exposure)BL.color_audit()BL.preset_eevee(quality="final", interior=...)BL.preset_cycles(quality="final", budget="film")mix = BL.lightgroup_mix(gains, exr=r["exr"])BL.set_gainBL.comp_finish(bloom=0.25, vignette=0.3, contrast=0.05, source=mix["socket"])BL.matte(tree, names)BL.relative_pxsun_azimuthBL.contact_sheetBL.sheet_stats| Value | Relative to | Source |
|---|---|---|
| Level of a white card: point P/(4π²d²), area P/(π²d²), sun S/π | | measured, both engines |
| Source as big as its distance delivers 75 % of the nominal level | apparent size | measured |
| AgX display: 0.18 to 0.463, 1.0 to 0.773, 4.0 to 0.910 | linear value | measured |
| Key 40 deg off axis, 35 deg up, 3 subject radii, size = radius | subject, camera | [added] defaults |
| Frontal flag: key < 20 deg off the camera axis | camera axis | [added] |
| Sun angle about 2 deg; continuity ±30 deg | set | Andy |
| Kelvin: candle 1,500, incandescent 2,000 to 2,500, daylight 6,500 (practical default 2,700 [added]) | light | Andrew |
| EEVEE: RT 1:1 and GI 1:2 for finals, Fast GI steps 16, shadow steps 12 to 16 (leaks), shadow rays 2 (penumbra) | render | Andrew |
| Volume probe: outer samples on the inner walls (samples at local (i+1)/(N+1)x2-1); leak 0.22 at 0.44 m inside, 0.054 at 0.2 m, 0.002 at the wall, 0.009 past the wall; surfel density 100 | room | Andrew, measured |
| Brand color error (of 255): Khronos 3.8, AgX 27 to 42, Standard 33 | white furnace | measured |
| Haze density about 0.05 for a room | volume | Andrew |
| Cycles film: 3 bounces, clamp 0, no caustics, 100 test / 500 to 1,500 final samples | render | Andy |
| EXR: multilayer, half float, DWAA for comp; 32-bit masters | output | Robin, Andy |
| Verdict: surround separation ≥ 0.10, edge merge ≤ 35 %, clay form ratio ≥ 2.5, value range ≥ 0.30, clip ≤ 0.5 % | display luma | [added], calibrated |
rep = BL.analyse(png, mask, exr=exr); problems = BL.verdict(rep) # [] = pass
flags = BL.light_report(target=head, face=head)["flags"]; audit = BL.color_audit()
probe = BL.probe_report(pb, inner_lo, inner_hi)["flags"] # EEVEE interiors: []
groups = BL.lightgroup_check(exr, mask) # Cycles: rel_error ~0, shares
shares = BL.light_contributions(lights, mask, out_dir) # per-light share on subjectvalue_studyreferences/critique.md| Mistake | What it looks like | Fix |
|---|---|---|
| Frontal key | Flat, "flash photo", clay form ratio about 1.3 | Key 30 to 60 deg off axis, above the eye line |
| Practical behind the subject used as the key | Dull face, bright wall steals focus | Cheated key on the source's side, linked to the subject |
| Bare point practical near a wall | Blown wall, shelf becomes the focal point | Spot with the shade's cone; blocker |
| EEVEE interior without probe, or a probe box drawn to the walls | Shadows lifted blue/gray everywhere, muddy | Outer samples at the inner walls ( |
| Small bulb as a face key | Pores and texture, harsh face | Large source (head-sized or more); flag in |
| Brightening by scaling lamps | World and emissives left behind, ratios drift | |
| AttributeError | Linking and light groups are Object properties |
| Re-rendering to rebalance lights | Hours per tweak | Cycles light groups + |
| Rig lights inside walls | A rim that contributes nothing | |
| Unlinked faked key | Set brightens with the subject, no separation | |
| Judging clipping on AgX PNG | Highlights look fine, EXR at 20+ | Read |
| Big soft jittered key on a toon material | Dithered, noisy terminator | Small unjittered key for NPR (Wyatt: crisp shadows for toon) |
| Inverted hull outline | Character goes dark or flat | Outline material transparent to shadow rays ( |
| AOV named in shader only | Pass silently missing | |
| Pixel-sized comp effects | Look changes between preview and final | |
| Exclude instead of indirect-only in layers | Missing shadows in the comp | |
BLENDER_EEVEEuse_raytracinguse_bloom/ssr/gtao/soft_shadowsSPHERE/PLANE/VOLUMElightprobe_cache_bakeCombined_<group>light_linkinglightgroupbpy.types.Lightscene.compositing_node_groupShaderNodeMixdatafiles/assets/nodes/compositing_nodes_essentials.blendbpy.ops.wm.set_working_color_spacematrix_worldview_layer.update()read_image(subimage, ...)references/procedures.mdreferences/critique.mdreferences/expert-notes.mdreferences/sources.md