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."

Subscribe to Brandon Wilson

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe