Skip to content

quality: Aquarium screensaver — commit to a style instead of near-realism #202

Description

@BernardJen

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

  • Direction (A or B) chosen and recorded here before implementation
  • Fish read as fish in a still frame, not as lozenges
  • Hard edges somewhere in the frame — outlines, or genuinely sharp shafts
  • Wider, more deliberate colour range than the current near-monochrome blue
  • Visible variety between fish, not one silhouette repeated
  • Flocking, tank-boundary behaviour and orientation from feat: aquarium screensaver (schooling fish) #66 all still hold
  • Readable at 12% washout
  • Frame cost at 6000×1200 recorded; no worse than 69.6 fps
  • Before/after stills at 3000×600 in the PR

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions