- Selective neighborhood clamp: only modify history when there's actual
motion or disocclusion — static pixels pass history through untouched,
preventing jitter-chasing from the shifting variance box
- Tonemapped accumulation: Reinhard tonemap before blend compresses bright
edges so they don't disproportionately cause jitter
- Jitter-aware sample weighting: blend 3-20% based on sample proximity
- Soft MV dead zone: smoothstep instead of step avoids spatial discontinuity
- Aggressive velocity response: 30%/px motion, 50% cap, 80% disocclusion
- Terrain loading: radius 3 (49 tiles) to prevent spawn hitches,
processOneReadyTile for smooth progress bar updates
FSR2 temporal upscaling:
- De-jitter scene color sampling (outUV - jitterUV) for frame-to-frame
consistency, eliminating the primary source of temporal jitter
- Remove luminance instability dampening (was causing excessive blur)
- Simplify to uniform 8% blend (de-jittered values are consistent)
- Gamma 2.0 for moderate neighborhood clamping
- Motion vector dead zone: zero sub-0.01px motion from float precision noise
Loading screen:
- Reduce tile load radius from 3 to 2 (25 tiles) for faster loading
- Process one tile per iteration for smooth progress bar updates
- Motion shader: zero out sub-0.01px motion to eliminate float precision
noise in reprojection (distant geometry with large world coords)
- Accumulate: tighten neighborhood clamp gamma 3.0→1.5 to catch slightly
misaligned history causing ghost doubles
- Reduce max jitter-aware blend 30%→20% for less visible oscillation
- Add luminance instability dampening: reduce blend when current frame
disagrees with history to prevent shimmer on small/distant features
Adds a wowee-git PKGBUILD suitable for submission to the Arch User
Repository. Tracks the main branch HEAD; pkgver is auto-generated from
the commit count + short hash so no manual bumping is needed on new
releases.
Key design decisions:
- Real binaries installed to /usr/lib/wowee/ to avoid PATH clutter
- /usr/bin/wowee wrapper sets WOW_DATA_PATH to the user's XDG data dir
(~/.local/share/wowee/Data) so the asset path works without any
user configuration
- /usr/bin/wowee-extract-assets helper runs asset_extract pointed at
the same XDG data dir; users run this once against their WoW client
- Submodules (imgui, vk-bootstrap) fetched from local git mirrors
during prepare() as required by AUR source array rules
- vulkan-headers listed as makedepend (required by imgui Vulkan backend
and vk-bootstrap at compile time; not needed at runtime)
Note: stormlib is an AUR dependency (aur/stormlib). Users will need
an AUR helper (yay, paru) to install it, or install it manually first.
vulkan-headers provides <vulkan/vulkan.h> which is required at compile
time by imgui (imgui_impl_vulkan.cpp) and vk-bootstrap. On Arch,
vulkan-devel is not a package name — the headers must be installed
explicitly via vulkan-headers.
Also replace vulkan-devel with the correct individual packages:
vulkan-headers (build-time headers)
vulkan-icd-loader / vulkan-tools (runtime + utilities)
Fixes build failure: fatal error: vulkan/vulkan.h: No such file or directory
- Motion vectors: single unjittered reprojection matrix (80 bytes) instead of
two jittered matrices (160 bytes), eliminating numerical instability from
jitter amplification through large world coordinates
- Sharpen pass: fix Y-flip for correct UV sampling, double-buffer descriptor
sets to avoid race with in-flight command buffers
- MSAA: auto-disable when FSR2 enabled, grey out AA setting in UI
- Accumulation: variance-based neighborhood clamping in YCoCg space,
correct history layout transitions
- Frame index: wrap at 256 for stable Halton sequence
Full FSR 2.2 pipeline with depth-based motion vector reprojection,
temporal accumulation with YCoCg neighborhood clamping, and RCAS
contrast-adaptive sharpening.
Architecture (designed for FSR 3.x frame generation readiness):
- Camera: Halton(2,3) sub-pixel jitter with unjittered projection
stored separately for motion vector computation
- Motion vectors: compute shader reconstructs world position from
depth + inverse VP, reprojects with previous frame's VP
- Temporal accumulation: compute shader blends 5-10% current frame
with 90-95% clamped history, adaptive blend for disocclusion
- History: ping-pong R16G16B16A16 buffers at display resolution
- Sharpening: RCAS fragment pass with contrast-adaptive weights
Integration:
- FSR2 replaces both FSR1 and MSAA when enabled
- Scene renders to internal resolution framebuffer (no MSAA)
- Compute passes run between scene and swapchain render passes
- Camera cut detection resets history on teleport
- Quality presets shared with FSR1 (0.50-0.77 scale factors)
- UI: "Upscaling" combo with Off/FSR 1.0/FSR 2.2 options
- Reduce max finalization steps per frame: 2→1 (normal), 8→4 (taxi)
- Reduce terrain chunk upload batch: 32→16 chunks per step
- Reduce idle M2 model upload budget: 16→6 per step
- Reduce idle WMO model upload budget: 4→2 per step
Tiles still stream in quickly but spread GPU upload work across
more frames, eliminating the frame spikes right after spawning.
Root cause: bonesDirty was a single bool shared across both
double-buffered frame indices. When bones were copied to frame 0's
SSBO and bonesDirty cleared, frame 1's newly-allocated SSBO would
contain garbage/zeros and never get populated — causing animated
M2 instances to flash invisible on alternating frames.
Fix: Make bonesDirty per-frame-index (bool[2]) so each buffer
independently tracks whether it needs bone data uploaded. When
bones are recomputed, both indices are marked dirty. When uploaded
during render, only the current frame index is cleared. New buffer
allocations in prepareRender force their frame index dirty.
Add 2-second cooldown timer before re-checking for unloaded tiles
when workers are idle, preventing excessive streamTiles() calls
that caused frame hitches right after world load.