XR glasses

XR glasses 4.0

I own a pair of XR glasses for a while now. Initially I got myself the Viture Pro for productivity work and maybe watch some movies. This was before finding out about their Side-By-Side (SBS) mode where each eye is fed with a slightly different camera position resulting in 3D depth perception similar to VR. Unlike VR I don’t get motion sick from these though, because I can always see a part of the real world.

Elite Dangerous in SBS mode
Elite Dangerous in SBS mode

The glasses also allow access to the head tracking data which make them a great addition to my home cockpit.

Breezy

For daily work or movies I often make use of the Breezy GNOME project. This is entirely optional though, since the XR glasses are “just” another display for the PC. The only requirements are USB-C + DP ALT allowing to get a DisplayPort signal over USB-C. Not many desktop PCs offer this already, but there are various HDMI adapters and laptops have this feature often already. The Steam Deck has it built in and works out of the box. Here does the Breezy Vulkan project all the heavy lifting that I do manually on my desktop PC.

It’s a great project that I can totally recommend - please do support it!

Side-By-Side with ReShade

I love to play many games with my XR glasses in Side-By-Side mode where each eye is fed with a slightly different camera position resulting in 3D depth perception.

This is similar to VR but does not offer e.g. a backchannel for head tracking. Some games, like Elite Dangerous, support this natively. Other games can be forced into a SBS like mode with ReShade and a plugin like SuperDepth3D or Rendepth Reshade. In theory are Reshade shaders compatible with vkBasalt but the depth stuff is apparently exempt from this rule so that is not an option. The approach works nicely with Proton though.

The reshade-linux repo is very useful to get you started but the required steps can be done manually too, of course.

You will need gamescope on top though, because the output has usually to be rescaled or the display ratio is completely off. This also depends on the glasses. Mine do FULL SBS so a resolution of 3840x1080 is excepted in the end.

For Elite Dangerous the correct settings would e.g. be:

gamescope -h 2160 -w 3840 -H 1080 -W 3840 –scaler stretch -e – %command%

Other games may require slightly different settings here. This is an example for Ace Combat 7: Skies Unknown with Reshade and the SuperDepth3D shader:

WINEDLLOVERRIDES=“d3dcompiler_47=n;dxgi=n,b;” gamescope -h 1080 -w 1920 -H 1080 -W 3840 –scaler stretch -b -r 60 -e – %command%

YMMV but the general idea should work with almost any game.

Head tracking

XR doesn’t offer a built in way for head tracking, like VR does. We can however access their IMU data in most cases and from here it’s some “simple” Euler math to convert this into a format OpenTrack understands. And since OpenTrack accepts UDP input we don’t even need a fancy plugin - just a “bridge” tool, which can be written in basically anything. I wrote a proof of concept in PHP reading the shared memory data from the Breezy xr-driver on Linux - so that works in theory with any glasses fully(!) supported by the Breezy project

The idea was picked up by someone else and resulted in a standalone version written in Rust that can also access the IMU directly but is restricted to the Viture glasses [for now]. And since such glasses experience naturally some drift it even features a quick way to reset the tracking via cli command, that can be bound e.g. to a joystick button with AntiMicroX.

Both projects are available on GitHub.

Demo

Demo of Breezy Desktop on GNOME with Viture Pro XR glasses. Breezy has now support for virtual displays on the XR desktop. It’s basically only limited by system resources but who is counting at this point. The most taxing job is the recording (beside gaming, of course) anyway. It’s perfect for me when e.g. modding a game!

Watch this video on YouTube PeerTube