Nvidia Image Scaling NIS and VR

Not the author but…

I think the instructions are meant to be somewhat generic. “The application” in this case is MSFS itself. If you go through the instructions and run the sim and attempt to load into VR, you’ll get the log file which says “unable to load FS2020.cfg”. In theory some other game or app would say “unable to load appname.cfg”.

So in this case, you can just use the FS2020 config file that exists in the zip file and skip that step


Thanks @NumberNumber481 for filling in and yes your explanation is perfect.

@FarFutureFox sorry for the wonky instructions. In this case the app name is FS2020, I just wrote the instructions so that people could also use it with other applications.

The ZIP file comes with a pre-configured FS2020.cfg file with some OK defaults.

I’m might be not the sharpest tool but even log and everything looks ok, I don’t see any difference, I’m using a HTC VIVE pro 2, no more fps or sharpness.

The “only” things it doest is decresing my GPU usage from 85% to 75% but I gain blurry and “some” bad effects, looks like working for a lot of people but not for me.

RTX 3070

Btw, I appreciate the time you spent for us, I always admire people who are always willing to spend time for people for no reason than make people happy.

1 Like

WIth the API active, I’ve been reporting issues with my G2 left screen flickering at 60Hz so after many months I decided to try 90Hz again.
Guys, this is crazy!:slight_smile: With MR ON I can now keep stable 22.5fps over New York/Tokyo in my JP Cessna 152 which was impossible previously.
With MR OFF I get stable 31-32fps approaching EGLL in FWB A32NX.
Now the best part, my FS2020.cfg settigs are as follow:
OpenXR Custom render scale OFF
100% in game res, which is 2480x2480px
Clear and sharp as never before.

Hi, I saw the same strange cloud effects in low light conditions, this is on the latest msfs beta on quest 2

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!


Fantastic explanation. Thanks a lot @mbucchia

how do i enable nis in non-vr mode to see if the nis scaler is causing the dark color banding?
thanks for the tweak.

Amazing job! Huge improved VR experience for me.

Tested a lot of combinations (will test more later) and what worked better for me was in-game 100, OXR 275, and NIS 0.5 with 0.3 sharpening.

Was using before in game 65 and OXR 200.

My average fps was from 24 to 32, and the overall clarity seems better (only downside is too much color banding at night)

HP Reverb G2
RTX 3090

@mbucchia thnx a lot for your effort.The results for me using 100oxr 100 render scale and 1.0 sharpness 0.0 is perfect .The only “negative” is at night .Take a look at the color of the sea .The picture is from the lenses of my G2.

It has this light pink color.Just to let you know if you could find a solution

Hi my friend .Can you check with the colors at night and let us know if it’s ok with your setup?

Didn’t know that. Thanks!

Checked at night. Unfortunately too much color banding (photo through the lens)

Installed the mod an find the following in the …nis_scalere.log file
XR_APILAYER_NOVENDOR_nis_scaler layer is active
Loading config for “FS2020”
Advertise all texture formats
Prioritize capable formats
Use scaling factor: 0.500
Sharpness set to 0.800
Scaled resolution is: 1586x1550 (50% of 3172x3100)
Using indirect texture format mapping with format 28
Error: The system cannot find the file specified.

Using indirect texture format mapping with format 28
Error: The system cannot find the file specified.

My Reverb G2 image is just solid yellow but I do see the proper VR images on the monitor. The sim runs perfectly other than the G2 image for JUST flight sim (it is perfect in all my other VR applications).

C:\Program Files\OpenXR-API-Layers contains:
FS2020.cfg, the Install and UnInstall ps1 files, and the .dll and .json

What is missing?

Here is the .json:
“file_format_version” : “1.0.0”,
“api_layer”: {
“name”: “XR_APILAYER_NOVENDOR_nis_scaler”,
“library_path”: “.\XR_APILAYER_NOVENDOR_nis_scaler.dll”,
“api_version”: “1.0”,
“implementation_version”: “1”,
“description”: “OpenXR NIS scaler API layer”,
“functions”: {
“xrNegotiateLoaderApiLayerInterface”: “NISScaler_xrNegotiateLoaderApiLayerInterface”
“disable_environment”: “DISABLE_XR_APILAYER_NOVENDOR_nis_scaler”

Thnx man.Same here for me also.

There are a couple of other files in the ZIP file that you need to copy side by side with the DLL. I am afk so I can’t check the exact name but one has .hlsl extension and the other one has .h. This should resolve your problem.

Forgive my ignorance but if the NIS is at 1 and the sharpening is at 0, then does this mean the plugin is doing nothing?

1 Like

Maybe @mbucchia could help us with this.:wink::wink:

I’m sort of taking the day off today :wink:

But thanks for reporting the issue! I think @CptLucky8 is looking into the shader and is aware of this issue.

At this stage it would be about modifying the NIS algorithm itself which for me is out of my area of expertise (I’m an OS guy not a graphics guy).

But I promise to follow up and see what I can do.


Glad that you confirmed what I did last night: OpenXR custom RS 100%; in-game 100%; 70% in NIS. This gives me roughly the native resolution of the G2 being close to 2160x2160 (per eye). All that is left is to set a sharpness that is satisfying. I’m using a GTX1080ti and, even before, was getting decent performance - and now with a small reduction in overhead; and, there is a discernable improvement in visual quality, particularly cockpit gauges. Thanks again for all your work on this.