The VR build's color differs in different HMDs (Rift/Vive) - best practice?

Hi,

We’ve made a 12 min VR-animation using Rift/Rift S, and it works great and looks the same using either Unity’s built in VR for Oculus and OpenVR (playing through Steam).

When I play it on a Vive, the colors are much darker and heavily saturated.

Coming from animation and film production it is not uncommon that different monitors, screens, cinemas have a different color look. But there I know how to make a master version that will be interpreted properly, VR is new to me.

I’m thinking the solution is to have the build detect what HMD is being used when it is started and apply a different setting or color grading (override) using the post processing stack.

We’ve used Unity 2018.2.16 for the build, and don’t dare to move it to a newer version. And we’re not using OVR or VRTK, just Unity straight out of the box.

I can’t find anything online regarding the differences in color representation between Rift and Vive. What is known by you in the Forum and what approach do you have to counteract the different visual looks the two headsets give?

Oculus Rift and Rift S looks good both played via Oculus and SteamVR.
HTC Vive is heavily saturated and darker using SteamVR.

How have you solved this, make one build for both HMDs instead of making two separate builds?

Hoping to get some extra insights with your experiences!

Made a solution using multiple Post-Processing Volumes. Main pp volumes for the film, and then override versions for the different HMDs: One for Oculus Rift/Rift S and one for “Other” (in my case, Vive).

Made an empty gameobject “HMD-check” that had two gameobjects as children, one with the pp volume for each version. Then the script was placed on “HMD-check” and it turns on or off the respective children-gameobjects, activating the different Post-Processing Volumes.

There’s probably a more elegant way of doing it, but it worked for me. Thought I’d share.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;

public class lg_detectHMD : MonoBehaviour {

    private string detectedHMD = "";
    public GameObject showIfOculus;
    public GameObject showIfOther;

    private void Start() {
        detectedHMD = XRDevice.model;

//        Debug.Log("Detected a VR headset. The HMD is a " + detectedHMD);

        if (detectedHMD.ToLower().Contains("oculus"))
        {
            showIfOculus.SetActive(true);
            showIfOther.SetActive(false);
        }
        else
        {
            showIfOculus.SetActive(false);
            showIfOther.SetActive(true);
        }
       
    }
}
2 Likes