Inspiration
Two things. The first is Alone in the Dark: a house that felt hostile long before anything moved in it. I wanted to find out what that kind of dread becomes when there is no screen between you and the door handle.
The second is frustration. Too many standalone VR games look flat, washed out and a generation behind, as if "mobile chip" were an excuse to give up on image quality. I don't believe that. The Mansion is my attempt to prove that a standalone headset can deliver state-of-the-art visuals, at a high frame rate, if every draw call, shader and light is treated as part of the art direction.
What it does
The Mansion is a VR descent into a late-Victorian manor where nothing has moved for decades, and yet nothing feels still. There is no combat. You explore room by room, by candlelight, and everything is physical: you turn handles and feel doors resist, pull open drawers, pick up keys, wind a gramophone, or lean over a billiard table with a two-handed cue.
Each room is designed as an escape-game puzzle box. Letters, objects and mechanisms only make sense once you understand who lived here, and what they were trying to keep out. Or in.
The project is still in development: the house, the lighting and the physical interactions are in place, while the story and part of the gameplay are still to come.
How we built it
- Engine: Unity 6.7 with URP, OpenXR and the Meta XR provider, targeting Meta Quest at 90 FPS minimum, up to 120.
- Draw calls: aggressive batching, shared materials and LODs, plus a room-state system that ties visibility to doors. A room is only rendered when the player is inside it or when one of its doors is open, so closed doors act as occlusion for free.
- Shaders: a family of tiered master shaders (SimpleLit, MediumLit, ComplexLit) built in Shader Graph, so each asset only pays for the lighting it needs. PBR maps are channel-packed to cut texture samples and memory bandwidth.
- Lighting: almost everything is baked. Lightmaps and Adaptive Probe Volumes carry the mood, a custom point-light path in HLSL handles candles, and fake blob shadows driven by probe data replace real-time shadows. Volumetric beams and a custom fog volume finish the picture.
- Frame rate: Application SpaceWarp, foveated rendering and a dynamic resolution system with FPS tiers and hysteresis.
- Hands: AutoHand on top of the XR Interaction Toolkit for physics-driven grabbing, with custom components for door handles, hinges, drawers and the two-handed cue.
- Tooling: custom editor tools to batch-rig furniture physics, pack texture channels, copy UV channels and bake collision data into vertex colors.
Challenges we ran into
The frame budget. At 90 Hz each frame has
$$t_{90} = \frac{1}{90} \approx 11.1\ \text{ms}$$
and at 120 Hz only
$$t_{120} = \frac{1}{120} \approx 8.3\ \text{ms}$$
for both eyes, on a mobile chip, in a house full of wood, fabric and candle flames. Holding that means winning on several fronts at once:
- CPU: keeping draw calls low enough that the render thread never becomes the bottleneck.
- GPU: keeping per-pixel cost flat with packed PBR textures, tiered shaders and baked lighting. Dynamic resolution and foveated rendering absorb the peaks: since pixel cost grows with the square of the render scale $s$, dropping to $s = 0.8$ leaves only $s^2 = 0.64$ of the pixels to shade.
- Overdraw: fog, volumetrics and particles are the first things to break a mobile GPU, so each one had to be rebuilt to be cheap.
- Application SpaceWarp: the app renders one frame out of two and the headset synthesizes the other from motion vectors and depth, which doubles the displayed frame rate. The budget per rendered frame becomes $2 \times t_{90} \approx 22.2$ ms.
Physical interaction was the other fight. Doors and drawers driven by joints and real hands behave badly at the slightest setup error, and there are dozens of them. Rigging them by hand did not scale, which is why the furniture setup tool exists.
Finally, the asset pipeline. Converting marketplace assets built for desktop into something a Quest can draw at 90 FPS meant repacking textures, rewriting materials, and chasing bugs like meshes losing their tangents and rendering as white triangles.
Accomplishments that we're proud of
- A manor that looks like it belongs on a PC headset, running standalone at 90 FPS and above.
- A PBR shader and lighting pipeline optimized end to end for mobile.
- Doors, drawers and cabinets that feel like objects instead of buttons.
- A room-streaming system simple enough to set up per room and invisible to the player.
- Editor tools that turned days of manual rigging and texture work into a few clicks.
What we learned
- On mobile hardware, art direction and performance budget are the same conversation. Every shader tier and every baked light is a design decision.
- Good-looking standalone VR is not a hardware problem. It is a discipline problem: draw calls, texture samples and overdraw, counted one by one.
- In VR, dread comes from presence, not from events. A door that resists your hand does more than a jump scare.
- Measure before optimizing: CPU, GPU and thermals tell different stories.
What's next for The Mansion
- The story. This is the big one: writing it, and finding how to tell it through the house itself, its rooms, its objects and its puzzles.
- Physical interactions. Calibrating every door, drawer and object until handling them feels right and never breaks immersion.
- Light and shadows. Pushing the lighting further, with better shadows, without giving up a single frame.
- Audio. Sound design and spatial audio, so the house can finally speak.
Log in or sign up for Devpost to join the conversation.