Nvidia Image Scaling NIS and VR

I am not 100% sure I even understand it all myself - but here’s what I can say:

The OpenXR render scale adjusts the resolution of the VR headset that applications see. So we’re telling the application: you should target that hardware resolution.

  • If you have it set to 100%, then the application basically sees the native hardware resolution.
  • If you have it set to more than 100%, then you’re asking the application to draw more than it should, and the OS will downscale that image. This can make the image look more crisp, but requires extra processing from the application.
  • If you have it set to less than 100%, then you’re asking the application to draw a smaller image, and that image will be upscaled by the OS. This saves on processing since the app draws less. The OS will then perform vary basic upscaling of the image, which will result in a blurry image.

I am not exactly sure what the in-game rendering scale, but here is my guess. I believe the game has its own upscaling algorithm, which is likely comparable to the upscaling I described above by the OS.

→ Now we’re adding this NIS scaling in between the application and OpenXR. The goal of NIS is to do upscaling but with a more advanced algorithm that will create a sharper image (as opposed to the blurriness I described above).

So eventually, the resolution the app will draw to is:

Hardware resolution (depends on headset) * OpenXR custom render scale * NIS render scale * In-game render scale

The order the scaling happens (meaning the actual image processing to bring an image from a resolution to another one) is the reverse of that, and for each of these steps, if the corresponding render scale is not set to 100%, then either upscaling or downscaling must happen:

  • The game upscales the image first using the in-game setting to match the resolution returned by OpenXR (if you are not using the NIS layer) or of the NIS layer (when present).
  • The NIS layer (when present) upscales the image using its own setting and to match the resolution returned by OpenXR.
  • OpenXR or the OS either upscales or downscales the image using the OpenXR custom render scale and to match the native resolution of the headset.

The NIS scaler is meant to do a better job at upscaling than any other part of the process!

Hence, if your parameters are causing any kind of upscaling to happen (ie: has a value lower than 100%), you should consider setting that value to 100% instead, and use the scaling with the NIS scaler setting instead to achieve the same lever of upscaling.

So my guess, and I think this is getting confirmed by people experimenting on this thread

– If you are trying to get better clarity while keeping the same FPS you already have today:

  1. Set OpenXR render scale to 100% or more → We want to use all the pixels that the headset can draw!
  2. Set the in-game render scale to 100% → We’re not going to use the less advanced upscaling that can cause blurry effects
  3. Only adjust the NIS scaling, the same way you would adjust the in-game render scale before.

– If you are trying to get a higher FPS without sacrificing quality:

  1. Do 1) and 2) from the above
  2. Reduce the NIS scaling factor even more, in order to request less pixels to be drawn by the app, but with the upscaling, get a quality similar to a higher resolution.

For WMR users there is an important note: in the OpenXR Developer Tools, disabling custom render scale is not the same as enabling it with a value of 100%. In the WMR OpenXR runtime, when custom render scale is disabled, the OS will recommend a resolution based on the GPU capabilities (principally the available memory). This can lead to something lower than the native resolution. If you want to force the native resolution, you must enable custom render scale and set it to 100%.

I hope this helps. Looking forward to compiling a list of everyone’s experience above and determine what settings seem to generally work for both use cases described above.

Until then, please experiment!

16 Likes