John Carmack Reviewed Bazaar

“Public VR critique #5: Bazaar

When an earlier version was in the VR Jam, I gave it high marks for implementation quality, but the gameplay didn’t really grab me. The commercial version is much improved, and I played through to level nine for this critique.

The rendering is all well done. Going with stylized, rather simple visuals and keeping it clean has been a good strategy for several VR games.

The bright, saturated colors are a distinctive choice, but you should be aware that it highlights the 60 hz refresh rate limitation on GearVR (versus 75 on DK2 and 90 on CV1); people that are flicker sensitive will have more eye strain with it. The general rule is that bright colors towards the periphery of your vision are the most problematic – white clouds in the sky are a problem for many games. You might consider having some dimmer districts, to let the eyes rest a bit, and it would also be a navigation aid.

One of the few things that stood out poorly was the tattered edges on the scrolls. Alpha-test/discard is used widely in games, but it has much larger drawbacks in VR, where the pixel-level aliasing stands in stark contrast to the MSAA (that everyone should be using!) on the rest of the world. The highest quality solution is to use blending, but that requires guaranteeing draw orders, which can be difficult in dynamic environments. A solution with no downside is to leave blending off and use “alpha to coverage”, which converts the pixel alpha into an MSAA coverage mask. Only discard when alpha equals zero. Most GPUs helpfully add a good dither, so 4x MSAA looks very good for feathered edges. The precision limits start to show up with multiple layers and subtle gradients, but it is an underused technique. Perhaps even easier would be to just throw a hundred triangles at the scroll and actually model the tatters. It would be a little stylized looking, but that isn’t usually a bad thing for VR.

Almost all games do this, but the loading screen is rendered at a choppy framerate, which can allow you to see it clipped off if you are looking away, then turn back to center quickly at the right time. The most efficient thing to do is send the loading screen texture directly to vrapi_SubmitFrame() a single time, and let Async Time Warp take care of repositioning it while the game loads. We should provide some stock sample code to do this.

On the extremely-nitpicky list, the loading screen images didn’t fade completely out to black before the edges, leaving a slightly visible edge effect on the bottom.

Text, one of my hot-button topics, was well presented throughout the game, only showing a few words or a sentence at a time, in a generously sized font.

There were a few UI elements with thin line borders that showed a bit of texture colorspace aliasing. All lines should be at least two texels wide to minimize this. Using all sRGB textures and eye buffers also helps, but if a project didn’t start out that way, it is hard to retrofit.

The 3D gaze cursor would sometimes be drawn incorrectly partially occluding nearer surfaces like the carpet when the center trace is just barely missing it. Doing four corner ray traces and taking the nearest depth would fix it for almost all cases, but leaving depth test enabled when drawing is usually a good idea.

I played my first session with headphones, and while there was some panning of the sound sources, it didn’t provide a lot of localization. The Oculus Audio SDK is great for this, but we haven’t released the library for native code yet, only Unity / Unreal engine integrations. If any native teams are interested in this, let me know and I’ll prod the right people.

Gaze-only controls are a large design challenge, but they work pretty well here, and allow long play times without getting a tired arm holding it up by the touchpad or requiring a gamepad. Time-on-target is a terrible UI when it is taking the place of a button (the “zero button mouse” problem of Kinect), but when it is a fundamental part of the gameplay it works out ok. It might still be nice to support joypads and the touchpad to act as a single “yes” button to accelerate some of the acknowledgement timers. That would be a play advantage, but it would make the player feel more directly in control. Firing the crossbow and perhaps a few other things should not be accelerated, but using things from your inventory could be make a lot more pleasant, especially when in time-stressful situations. It is never good to let a player think (rightly or wrongly) that they failed at something due to the UI being in their way.

It might be better to move the inventory chest to the front of the carpet. I only recently appreciated that I sit up a lot straighter than many when I am playing in a swivel chair; many people are playing with fairly slouched posture, which limits how far they can comfortably look down.

The angular notchy turns of the carpet felt jarring. It is important to keep the viewpoint movement linear for comfort, but the carpet could bank and slide more smoothly below the view.

The testing for item pickups ignores geometry that may occlude the items. That is understandable, but sometimes I was pulling items through blank walls. It felt like it was coming all the way from the next canal over, but it may have still been a local occlusion.

The level play times are good, and it was nice to see the available items continuing to expand through all the levels I played.

This is a bit strange coming from me, but being in VR, I wanted to feel a bit more lore in the game. The visuals and audio make an interesting setting, and being “in it” makes me want to know more about it than when I just look at a puzzle game on a 2D screen. A deft design touch with some names, iconography, and maybe a little voice acting could hint at a richness that you might choose to explore in the future.” – John Carmack

See the original post here.