Owner verdict on the version shipped in #189: "too fake, but it is already better
than the bike thing."
Same underlying problem as #201 and the same fix: it aims at plausible realism and
lands short, which reads worse than committing to a style. Ranked as the lesser of
the two, so this is the follow-up, not the priority.
Why it reads as fake
The scene is well constructed — boids flocking with soft margin steering, SDF fish
with a travelling-wave tail beat, god rays that brighten each fish as it passes
through, caustics on the sand, kelp, out-of-focus foreground blades. Nothing is
broken. But:
- The fish are smooth grey-blue lozenges.
sdFish-style shapes with
countershading and a forked caudal fin, rendered with soft lighting. At a glance
they read as shapes that are meant to be fish rather than as either real fish
or drawn ones.
- Everything is soft. Gradient water, gradient light shafts, soft caustics,
soft depth haze. There is almost no hard edge in the frame, and without hard
edges nothing reads as an object with a boundary.
- The palette is narrow — near-monochrome pale blue with a few orange accents.
That was a deliberate fix for the washed-out first draft, but it went to "tasteful
and flat" rather than to "vivid".
The ambitious version
Pick a direction and commit. Two coherent options; one of them should be chosen
and recorded here before implementation, not blended.
A — Stylised / illustrated (consistent with the direction chosen for #201):
- Cel-shaded fish with ink outlines and two flat tones. An outline is nearly free
from an SDF, and it is what makes a fish read as a fish rather than as a blob.
- Bold, saturated species colours — clownfish orange, tang blue, yellow — instead
of a school of near-identical silvers.
- Hard-edged light shafts and caustics, as a painter would draw them.
- Fewer, larger, more characterful fish rather than a cloud of small ones.
B — Push realism properly, if the aquarium is wanted convincing rather than
drawn:
- Real refraction of the background through each fish's body, and a specular
sheen that moves with the surface.
- Depth of field: sharp mid-ground, genuinely defocused fore and background.
- Volumetric shafts with dust motes, not gradient wedges.
- Varied species silhouettes and swim gaits — a tang does not move like a
clownfish.
A is recommended. It matches the direction set for #201, it plays to the
strengths of the existing SDF work, and it is achievable in-shader. B is a
substantially larger job and risks landing in the same uncanny middle this issue
exists to escape.
On three.js and modelled fish
Raised for #201 and it applies here too. If the goal is recognisable species with
real anatomy, that means modelled and rigged geometry, which means glTF assets, an
art pipeline and licensing — a different project from restyling a procedural scene,
and worth its own issue rather than being folded into this one. See the reasoning
in #201; the short version is that three.js does not make cel shading easier and
would put a second GL abstraction on the one shared context created in
gl-base.js.
Verification
npm run screensaver -- aquarium --wall
W toggles 6000×1200, L cycles washout. Judge from stills as well as motion —
the softness is much more obvious in a frozen frame.
Real-GPU cost today is 69.6 fps at 6000×1200 (ANGLE/Metal, M3 Pro), so there is
headroom for either direction.
Acceptance criteria
Owner verdict on the version shipped in #189: "too fake, but it is already better
than the bike thing."
Same underlying problem as #201 and the same fix: it aims at plausible realism and
lands short, which reads worse than committing to a style. Ranked as the lesser of
the two, so this is the follow-up, not the priority.
Why it reads as fake
The scene is well constructed — boids flocking with soft margin steering, SDF fish
with a travelling-wave tail beat, god rays that brighten each fish as it passes
through, caustics on the sand, kelp, out-of-focus foreground blades. Nothing is
broken. But:
sdFish-style shapes withcountershading and a forked caudal fin, rendered with soft lighting. At a glance
they read as shapes that are meant to be fish rather than as either real fish
or drawn ones.
soft depth haze. There is almost no hard edge in the frame, and without hard
edges nothing reads as an object with a boundary.
That was a deliberate fix for the washed-out first draft, but it went to "tasteful
and flat" rather than to "vivid".
The ambitious version
Pick a direction and commit. Two coherent options; one of them should be chosen
and recorded here before implementation, not blended.
A — Stylised / illustrated (consistent with the direction chosen for #201):
from an SDF, and it is what makes a fish read as a fish rather than as a blob.
of a school of near-identical silvers.
B — Push realism properly, if the aquarium is wanted convincing rather than
drawn:
sheen that moves with the surface.
clownfish.
A is recommended. It matches the direction set for #201, it plays to the
strengths of the existing SDF work, and it is achievable in-shader. B is a
substantially larger job and risks landing in the same uncanny middle this issue
exists to escape.
On three.js and modelled fish
Raised for #201 and it applies here too. If the goal is recognisable species with
real anatomy, that means modelled and rigged geometry, which means glTF assets, an
art pipeline and licensing — a different project from restyling a procedural scene,
and worth its own issue rather than being folded into this one. See the reasoning
in #201; the short version is that three.js does not make cel shading easier and
would put a second GL abstraction on the one shared context created in
gl-base.js.Verification
Wtoggles 6000×1200,Lcycles washout. Judge from stills as well as motion —the softness is much more obvious in a frozen frame.
Real-GPU cost today is 69.6 fps at 6000×1200 (ANGLE/Metal, M3 Pro), so there is
headroom for either direction.
Acceptance criteria