light opimage2d → image2dimport fullseye as fs; fs.ledger.shadow_cast_2d(occluder, x, y, steps=None, softness=0.0) (実装を直接呼ぶなら import gfx2d; gfx2d.shadow_cast_2d(occluder, x, y, steps=None, softness=0.0)、台帳から引くなら opsgfx2d.get("shadow_cast_2d"))Visibility of every pixel from a point light at (x, y), as image2d.
Ray-marches the segment from each pixel to the light, sampling occluder
(2-D, [0, 1], 1 = fully blocking) at steps points with nearest
lookup, and returns 1 - max(occluder along the ray). For a binary
occluder that is exactly 0 or 1 — no tolerance involved.
The sample excludes the pixel itself, so an occluder is lit on its own light-facing surface and casts behind itself.
softness > 0 blurs the visibility map by that sigma afterwards, which is
a penumbra-shaped lie rather than a penumbra: a real one widens with
distance from the occluder. It is offered because it looks right and named
so it cannot be mistaken for physics.
steps defaults to the image diagonal, which samples about once per
pixel. An occluder thinner than the step spacing can be missed; that is
the honest limit of a fixed-step march and the reason steps is an
argument.
py -3.11 examples/gfx2d_scene.pyimage2d を入力に取れる)light)radial_light · light_mask · normal_map_decode · normal_map_shade
Provenance: gfx2d.py — GFX2D operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.