Repository navigation
Default render_scale=0.5 + TAA + no sharpening makes output blurry #56
Description
Activity
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 asetSharpenStrength()API"+ TAA" still in the chain (that's by design) "default render_scale=0.5"still true — renderer/mod.rsstill defaultsrender_scale: 0.5So 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.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.
The engine ships with defaults that produce noticeably soft/blurry rendering on first run:
render_scale0.5taa_enabledtruecas_strength0.0Without explicitly calling
setRenderScale(1.0)andsetTaaEnabled(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.rslines 5965–5966, 6116.Suggestions:
render_scaleto1.0(native resolution) and let users opt into half-res for performance, orcas_strengthby a non-zero value (e.g.0.3) whenrender_scale < 1.0so the upscaled output has some sharpening, orRelated: the quality presets (
QualityPreset.Mediumetc.) don't touchrender_scaleorcas_strength, so even switching toUltraleaves the image soft.