Here’s another frequently-asked question about VR headsets, or at least those that use LED-based displays:

Why does my headset show dark grey when it’s supposed to show black? Shouldn’t LED displays be able to show perfect blacks?

I addressed this in detail a long time ago, but the question keeps popping up, and it is often answered like the following: “LED display pixels have a memory effect when they are turned off completely, which causes ‘black smear.’ This can be avoided by never turning them off completely.”

Unfortunately, that answer is mostly wrong. LED display pixels do have a memory effect (for reasons too deep to get into right now), but it is not due to being turned off completely. The obvious counter argument is that, in the low-persistence displays used in all LED-based headsets, all display pixels are completely turned off for around 90% of the time anyway, no matter how brightly they are turned on during their short duty cycle. That’s what “low persistence” means. So having them completely turned off during their 1ms or so duty cycles as well won’t suddenly cause a memory effect.

The real answer is mathematics. In a slightly simplified model, the memory effect of LED displays has the following structure: if some pixel is set to brightness b 1 in one frame, and set to brightness b 2 in the next frame, it will only “move” by a certain fraction of the difference, i.e., its resulting effective brightness in the next frame will not be b 2 = b 1 + (b 2 – b 1 ), but b 2 ‘ = b 1 + (b 2 – b 1 )⋅s, where s, the “smear factor,” is a number between zero and one (it’s usually around 0.9 or so).

For example, if b 1 was 0.1 (let’s measure brightness from 0 = completely off to 1 = fully lit), b 2 is 0.7, and s = 0.8, then the pixel’s effective brightness in frame 2 is b 2 ‘ = 0.1 + (0.7 – 0.1)⋅0.8 = 0.58, so too dark by 17%. This manifests as a darkening of bright objects that move into previously dark areas (“black smear”). The opposite holds, too: if the pixel’s original brightness was b 1 = 0.7, and its new intended brightness is b 2 = 0.1, its effective new brightness is b 2 ‘ = 0.7 + (0.1 – 0.7)⋅0.8 = 0.22, so too bright by 120%(!). This manifests as bright trails following bright objects moving over dark backgrounds (“white smear”).

The solution to black and white smear is to “overdrive” pixels from one frame to the next. If a pixel’s old brightness is b 1 , and its intended new brightness is b 2 , instead of setting the pixel to b 2 , it is set to an “overdrive brightness” b o calculated by solving the smear formula for value b 2 , where b 2 ‘ is now the intended brightness: b o = (b 2 – b 1 )/s + b 1 .

Let’s work through the two examples I used above: First, from dark to bright: b 1 = 0.1, b 2 = 0.7, and s = 0.8. That yields b o = (0.7 – 0.1)/0.8 + 0.1 = 0.85. Plugging b o = 0.85 into the smear formula as b 2 yields b 2 ‘ = 0.1 + (0.85 – 0.1)⋅0.8 = 0.7, as intended. Second, going from bright to dark: b 1 = 0.7, b 2 = 0.1, and s = 0.8 yields b o = (0.1 – 0.7)/0.8 + 0.7 = -0.05. Oops. In order to force a pixel that had brightness 0.7 on one frame to brightness 0.1 on the next frame, we would need to set the pixel’s brightness to a negative value. But that can’t be done, because pixel brightness values are limited to the interval [0, 1]. Ay, there’s the rub.

This is a fundamental issue, but there’s a workaround. If the range of intended pixel brightness values is limited from the full range of [0, 1] to the range [b min , b max ], such that going from b min to b max will yield an overdrive brightness b o = 1, and going from b max to b min will yield an overdrive brightness b o = 0, then black and white smear can be fully corrected. The price for this workaround is paid on both ends of the range: the high brightness values (b max , 1] can’t be used, meaning the display is a tad darker than physically possible (a negligible issue with bright LEDs), and the low brightness values [0, b min ) can’t be used, which is a bigger problem because it significantly reduces contrast ratio, which is a big selling point of LED displays in the first place, and means that surfaces intended to be completely black, such as night skies, will show up as dark grey.

Let’s close by working out b min and b max , which only depend on the smear factor s and can be derived from the two directions of the overdrive formula: 1 = (b max – b min )/s + b min and 0 = (b min – b max )/s + b max . Solving yields b min = (1 – s)/(2 – s) and b max = 1/(2 – s). Checking these results by calculating the overdrive values to go from b min to b max , which should be 1, and from b max to b min , which should be 0, is left as an exercise to the reader.

In a realistic example, using a smear factor of 0.9, the usable brightness range works out to [0.09, 0.91], meaning the darkest the display can be is 9% grey.