ludic/packages/ludic.render3d
Orkuncakilkaya 18d23ca20d feat(render3d): a bole that does not quake, leaves out of the lens, a light with a reach
layer_flutter's mask was the vertex's height alone, so on a ten metre aspen every part of
the trunk above 1.2 m trembled with the leaves and the bole read as cloth. What separates
a leaf from a bole is distance from the model's centre line, not height; the mask is
radial now, and small plants keep the old one because a flower is all leaf.

NEAR_FADE dithers tree foliage out inside arm's length of the camera, in the depth
prepass, so the lit pass never sees those pixels and the equal-depth optimisation is
untouched. gl_Position.w is the view depth, so it costs one varying and no uniform.
Blades, cards and flowers are excluded - they live at the player's feet - and the shadow
pass keeps every leaf.

daylight_hand takes a reach in metres. The falloff was an inverse square windowed between
26 and 6 with both numbers hard-coded: two per cent of its own near field at ten metres,
so a torch lit your boots. It is a gentle power out to the reach now.

Measured in Maroon Lake, twice per side: the crown mask moves 1.7% of an aspen frame and
nothing at all in the meadow under it; the near fade moves 7.1% of a first-person frame
at a conifer and 0% where there is no foliage in the lens; the torch's reach lifts the lit
ground 20 to 45% and leaves the sky bit-identical.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-20 00:06:50 +03:00
..
shaders feat(render3d): a bole that does not quake, leaves out of the lens, a light with a reach 2026-09-20 00:06:50 +03:00
actor.ludic fix(render3d): a body hidden from the camera still stands in the sun 2026-09-19 21:32:11 +03:00
assets.manifest feat(gl): OpenGL 4.1 and the ludic.render3d renderer 2026-09-10 03:31:12 +03:00
camera.ludic feat(render3d): DLSS super resolution and Reflex through NVIDIA Streamline 2026-09-15 19:26:12 +03:00
collide.ludic feat(render3d): replace the world at run time, water bodies, terrain_sea 2026-09-13 00:03:40 +03:00
daylight.ludic feat(render3d): a bole that does not quake, leaves out of the lens, a light with a reach 2026-09-20 00:06:50 +03:00
drawstats.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
env.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
FEATURES.md feat(render3d): a bole that does not quake, leaves out of the lens, a light with a reach 2026-09-20 00:06:50 +03:00
fmath.ludic feat(render3d): gpu.ludic - the seam for a second graphics API, and what the GPU can do 2026-09-15 09:52:12 +03:00
gltf.ludic render3d(vulkan): GPU-driven trees - one merged mesh per material, one draw per material; on by default 2026-09-15 16:44:00 +03:00
gpu.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
gpu_manifest.ludic feat(render3d): read the SPIR-V manifest the way a Vulkan backend will 2026-09-15 10:41:43 +03:00
gpu_vk.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
gpu_vk_draw.ludic fix(window): the title a program passes to gl_open / gvk_open reaches the window 2026-09-17 14:02:23 +03:00
gpu_vk_res.ludic feat(render3d): HDR10 output, and DLSS that stays still 2026-09-15 20:06:18 +03:00
grass.ludic feat(render3d): the grass knows a body is standing in it 2026-09-19 18:40:08 +03:00
mesh.ludic perf(render3d): Vulkan draws find pipelines by integer and reuse descriptor sets 2026-09-15 13:22:51 +03:00
overlay.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
package.ludic feat(gl): OpenGL 4.1 and the ludic.render3d renderer 2026-09-10 03:31:12 +03:00
post.ludic feat(render3d): contact darkening, so things sit ON the ground 2026-09-19 19:49:05 +03:00
prof.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
programs.ludic feat(render3d): one wind, and everything in the valley is moved by it 2026-09-19 18:24:43 +03:00
quat.ludic feat(gl): OpenGL 4.1 and the ludic.render3d renderer 2026-09-10 03:31:12 +03:00
r3d.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
render.ludic feat(render3d): anti-aliasing that exists, and a lens for the viewfinder 2026-09-19 17:38:25 +03:00
scatter.ludic feat(render3d): a bole that does not quake, leaves out of the lens, a light with a reach 2026-09-20 00:06:50 +03:00
shadow.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
skin.ludic refactor(render3d): vertex data and draws behind gpu.ludic 2026-09-15 10:21:55 +03:00
sky.ludic perf(render3d): the sky light baked once at start, the terrain load in four steps, actor cull bounds by height 2026-09-15 15:03:06 +03:00
stream.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
streamline.ludic feat(render3d): gate R3D_* switches behind R3D_DEV in windowed builds 2026-09-16 13:21:51 +03:00
terrain.ludic feat(render3d): rain that leaves something behind 2026-09-19 19:43:29 +03:00
texture.ludic feat(render3d): texture filtering and shadow resolution a game can change while it runs 2026-09-15 14:25:55 +03:00
water.ludic feat(render3d): the lake answers to a body standing in it 2026-09-19 20:23:27 +03:00