Week of June 8–14: Two Engines, One Sanctuary on Vision Pro
A week building meditation environments for Apple Vision Pro across RealityKit and Unreal Engine — rippling water, time-of-day lighting, and a 13-round performance marathon to get UE's first light on the headset.
This was a Vision Pro week, top to bottom. Every commit landed in one of two repos — Sanctuary, the RealityKit sound-bath app I shipped to TestFlight last week, and a brand-new sibling, Sanctuary-UE, an Unreal Engine port I started to find out whether the headset has more to give than RealityKit was letting me take.
On the RealityKit side, the theme was place. A sound bath is only as immersive as the room you're sitting in, so I spent the week building real environments instead of abstract voids: a bamboo grove, a lakeside with live rippling water and mist off an 8K panorama dome, and a zen room lit by the actual time of day — the sun casts real shadows based on your local clock now. That water cost me an afternoon to a classic gotcha: I was writing a vertex buffer with the wrong stride because SIMD3<Float> is 16 bytes in memory, not the 12 you'd assume from three floats. Pack the raw floats yourself or the GPU reads garbage. The bamboo fought me too — RealityKit still won't render the foliage's alpha-cutout textures, so Midday falls back to the zen room until I find a workaround. Alongside the scenery I layered in the things that make it feel alive: per-session-type skies, crystal singing bowls rebuilt as struck inharmonic bells (the first pass sounded like a church organ), box-breathing voice guidance, and a live in-session mixer for voice, bowls, and drone.
The bigger bet was Sanctuary-UE. RealityKit's content limits kept showing up — the alpha bug, lighting I couldn't push — so I scaffolded the same experience in Unreal Engine to see if a real-time renderer could carry a richer world on the Vision Pro's GPU. Getting "first light" on an Apple Vision Pro through Unreal is its own gauntlet: migrating to UE 5.7.4 for native Xcode 26 support, fighting visionOS privacy strings (ARKit silently aborts immersion without NSWorldSensingUsageDescription), disabling anti-aliasing that's broken on the platform per Epic's own forums, and stripping the immersive-role plist overrides that collide with Epic's Swift splash. But it booted — a Buddhist Monastery Showcase, running in VR on the headset.
From there it became a performance-tuning marathon. I ran something like thirteen optimization rounds dialing in the frame budget: aggressive distance culling (28m radius, keep the five nearest lights), a hardware-paced half-rate lock at 45fps, and a long back-and-forth on cascaded shadow maps — they kept either tanking the framerate or diluting to invisibility when I restored the landscapes. Once a locomotion test proved there was GPU headroom to spare, I brought the full landscapes, decals, and foliage back. One of my favorite bugs of the week: rotating the world to aim the meditation seat at the Buddha statue double-transformed every child actor into geometric soup, because I was rotating children that were already inheriting their parent's transform. Rotate only the root actors. Lesson re-learned.
So: two engines, one experience, and a real question answered — the Vision Pro has more rendering headroom than RealityKit alone reveals. Next week is about deciding which path Sanctuary actually ships on, and whether the answer is "both."