Skip to content

Default render_scale=0.5 + TAA + no sharpening makes output blurry #56

Description

@ElYaiko

The engine ships with defaults that produce noticeably soft/blurry rendering on first run:

Setting Default Effect
render_scale 0.5 G-buffer, HDR, and composed RTs rendered at half resolution, then upscaled back to display size
taa_enabled true Temporal AA blends frames (current frame contributes only ~6% after first 4 frames), softening detail further
cas_strength 0.0 No sharpening applied — neither to the TAA-blended output nor the upscaled half-res

Without explicitly calling setRenderScale(1.0) and setTaaEnabled(false), the image is noticeably blurry even for simple scenes (test3d's single cube + grid, pong, etc.). On a 800×600 window this renders at 400×300 internally.

Location: native/shared/src/renderer/mod.rs lines 5965–5966, 6116.

Suggestions:

  1. Default render_scale to 1.0 (native resolution) and let users opt into half-res for performance, or
  2. Enable cas_strength by a non-zero value (e.g. 0.3) when render_scale < 1.0 so the upscaled output has some sharpening, or
  3. At minimum document these defaults prominently (README, API docs, or a "quality presets" hint)

Related: the quality presets (QualityPreset.Medium etc.) don't touch render_scale or cas_strength, so even switching to Ultra leaves the image soft.

Activity

  1. proggeramlug commented on Jul 15, 2026

    @proggeramlug
    Contributor

    Audit note (2026-07-15): half of this is now fixed — retitling/rescoping rather than closing.

    The title names three causes. Verified against the code today:

    claim status
    "no sharpening" fixed — an RCAS contrast-adaptive sharpen pass is in renderer/postfx_chain.rs, with a setSharpenStrength() API
    "+ TAA" still in the chain (that's by design)
    "default render_scale=0.5" still true — renderer/mod.rs still defaults render_scale: 0.5

    So the remaining, real complaint is just the engine's default. Worth noting
    what a downstream game concluded when it measured this: the shooter now overrides
    to 0.75 (settings.ts), because 0.5 read "visibly upscale-soft at 4K" while
    0.75 was "dramatically sharper" — at a real frame cost (~30 fps vs ~54 at 0.5 on
    that box).

    That's the actual decision hiding in this issue: 0.5 is a performance default
    that a 4K user reads as broken image quality.
    Either raise the engine default,
    or keep it and make sure every game sets its own — but don't leave the engine
    shipping a default its own consumers all override.

  2. proggeramlug commented on Jul 28, 2026

    @proggeramlug
    Contributor

    Completed in draft PR #147 (9c1ab1b, aa58edb, d2c2939, 29abf80).

    What changed:

    • First-run rendering now uses scale 0.75 instead of the accidental half-resolution 0.50 default.
    • Off/Low/Medium/High/Ultra now own render scale, TAA mode, upscale filter, composite sharpening, and effect policy as one coherent matrix. Ultra is native 1.0; Medium is the balanced 0.75 default.
    • Toggling TAA no longer silently changes resolution or rebuilds resolution-dependent targets.
    • Presets use the existing final-composite sharpening path and leave the separate CAS pass disabled, avoiding an added pass, extra allocation, double sharpening, and halos.
    • Public TypeScript docs, README guidance, the performance harness, unit tests, render-target integration tests, and a production-chain visual golden were added/updated.

    Apple M1 Max / Metal visual evidence:

    • detail energy: legacy 0.50 = 3.7882; default 0.75 = 4.9969 (+31.9%)
    • mean difference to native: legacy 0.50 = 2.1083; default 0.75 = 1.3781 (34.6% closer)

    Matched old/new performance held the exact former 0.50/effects workload across four alternating 300-warmup/900-frame runs:

    • median full-frame mean: 2.2128 -> 2.2102 ms (-0.12%)
    • median P50: 2.4404 -> 2.4242 ms (-0.66%)
    • median P95: 2.7514 -> 2.6949 ms (-2.05%)
    • uploads: exactly 23,264 B/frame before and after
    • added persistent images/buffers/history/passes/upload bytes: 0

    The full local quick lane is green: 325 unit tests + 1 intentional ignore, 57 runnable GPU goldens + 2 intentional ignores, 4 render-target tests, strict clippy/format, Wasm/web, all-platform FFI parity, quality governance/negative controls, and canonical examples. No golden reference or acceptance threshold was changed.

    Evidence: issue-56-quality-presets.md and its machine-readable JSON companion.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions