Author: Adam Simmons

Last updated: July 1st 2020



Pretext

This article provides guidance for users with discrete desktop GPUs from Nvidia and AMD. For mobile GPUs or integrated graphics solutions, including those from Intel, it is recommended that a custom resolution is set using CRU (Custom Resolution Utility). Refer to the Nvidia section on this, specifically the second half of “Second solution: setting a custom resolution” where the process of using CRU is mentioned. Users with Intel graphics chipsets should alternatively look for an option called ‘Quantization Range‘ in the Intel Graphics Control Panel and ensure it is set to ‘Full Range’.





Introduction

You may have heard people say that the image quality of HDMI (High-Definition Multimedia Interface), DP (Display Port) and the now outdated DVI (Digital Visual Interface) are equivalent. They’re digital signals that either ‘work’ so the monitor displays an image or ‘don’t work’ so that it doesn’t. A user just has to consider the bandwidth requirements of their monitor and choose a port on the GPU (Graphics Processing Unit) and monitor that will support the full resolution and refresh rate of their display.







Unfortunately things aren’t quite as clear-cut as that, and there is a murky middle ground. It’s this quagmire in the middle that many users will find themselves stuck in due to how HDMI is typically handled by PC graphics cards. HDMI is designed as a universal signal widely used by TVs and entertainment systems, unlike DVI and DisplayPort which are built from the ground up as computer monitor ports. The aim of this article is not to bog you down with all of the technical fripperies of these different ports and associated aspects. Rather it’s designed to give you some straightforward actionable advice which will allow you to optimise the HDMI colour signal for PC use.







How Nvidia GPUs handle the HDMI signal

The problem

Whenever a monitor with a resolution and refresh rate in common with HDTVs (e.g. 1920 x 1080 @60Hz) is connected to an Nvidia GPU by HDMI or DVI-HDMI cable, the GPU tends to treat the screen as an ‘HDTV’ rather than a monitor. You can see how the graphics driver categorises things for the Full HD resolution as that shared with a TV by opening the Nvidia Control Panel and navigating to ‘Display’ – ‘Change resolution’. It will usually be listed under ‘Ultra HD, HD, SD’ as ‘1080p, 1920 x 1080 (native)’ as shown below.







Although this behaviour is typical for 60Hz 1920 x 1080 (Full HD/1080p) displays connected by HDMI it occasionally applies to such displays connected by DisplayPort as well. In the image above you may notice that a Dell U2414H, connected via DisplayPort, has been categorised in this way. This is rather bizarre behaviour considering DisplayPort is a PC-only connection not currently employed by TV screens. If you connect a monitor up using DVI or a DisplayPort connection that works as it should then the resolution will be listed in a separate list entitled ‘PC’ as shown in the image below.







But the problem is not simply that the resolution is put on the wrong list, it’s the effect that this has on the colour signal that is important. With the HDMI (or incorrect DisplayPort) connection the GPU sends out a ‘Limited Range RGB 16-235’ colour signal rather than the ‘Full Range RGB 0-255’ signal the monitor is designed to process and indeed sends out via DVI or correctly functioning DisplayPort. Without going into the intricacies of how these colour signals differ, there is a definite mismatch between the colour signal sent to the monitor and the screens native capabilities. This disparity leaves the monitor unable to display shades with an appropriate depth and variety. Black appears an obvious dark grey (overall static contrast suffers – this is measurable) and the gamma curve is shifted such that many shades appear a lot lighter than they should. The whole image looks like it has a sort of bleached haze over it, giving what is commonly referred to as a ‘washed out look’. Confusingly, we’ve also observed the GPU defaulting to the ‘Limited Range RGB 16-235’ signal when connected to ‘4K’ UHD (3840 x 2160) screens – even though the resolution is listed under ‘PC’ as ‘3840 x 2160 (Native)’.

The table below gives some basic readings taken from the AOC i2473Pwy connected by HDMI and set to use both a ‘Limited Range RGB 16-235’ signal and a ‘Full Range RGB 0-255’ signal. Results for a third signal type discussed below, ‘YCbCr444’, are also included. The ‘Test Settings’ and equipment from the review were used to take these readings – a Spyder4Elite for the gamma and white point measurement and a Konica Minolta CS-200 for the rest. The ‘Test Settings’ simply involved lowering the brightness a bit and making minor colour channel adjustments.



Nvidia signal table



Nvidia solutions

First solution: functionality now built into the Nvidia display driver

As of driver version 347.09, Nvidia have added a small drop-down to the Nvidia Control Panel (NCP) that will allow you to enforce the correct ‘Full Range’ signal. Simply open NCP and navigate to ‘Display – Change resolution’. You should see a drop down box labelled ‘Output dynamic range’. At time of writing this is the final drop-down box on the page, under ‘Apply the following settings’ as shown below.







Make sure this is set to ‘Full’ rather than ‘Limited’ and press ‘Apply’ to enforce the ‘Full Range RGB 0-255’ signal. ‘Limited’ is used by default on Full HD monitors connected using HDMI and some connected using DisplayPort, when running at 60Hz or other refresh rates listed as ‘Ultra HD, HD, SD’. For resolutions or refresh rates listed as ‘PC’ the default setting will be ‘Full’. If the monitor has an ‘HDMI Black Level’, ‘HDMI RGB PC Range’ or similar option make sure this is set to ‘Normal’, ‘High’, ‘Full’ or ‘RGB (0~255)’ rather than ‘Low’, ‘Limited’ or ‘RGB (16~235). The exact nomenclature depends on the monitor model.





Second solution: setting a custom resolution

It is possible to enforce a ‘Full Range RGB 0-255’ signal over HDMI or incorrectly functioning DisplayPort by setting a custom resolution. This resolution can be set such that it is treated exactly the same as the default native resolution of the monitor but with the colour signal corrected. The video below shows this process, focusing on 60Hz where the issue is most likely to occur. Again ensure that the ‘HDMI Black Level’ or similar option on the monitor is set correctly, if such an option exists.









After creating it, you can see your new ‘Custom Resolution’ listed separately in the Nvidia Control Panel resolution list as shown below.







Although this will work with most applications and the desktop, some games ignore custom resolutions and will revert to using your monitor’s native resolution with the default colour signal. On many such games your custom resolution will be used if you set the refresh rate to a value other 60Hz (essentially overclocking or underclocking your monitor if it’s a 60Hz model). Most 60Hz Full HD monitors will be able to use 65Hz without any issues, some can be pushed further if you’re feeling adventurous. Some users would be uncomfortable changing this from the default 60Hz, which we understand, so for those looking for a simple ‘universal’ fix there are some alternatives.

One alternative to setting a custom resolution in the Nvidia Control Panel is to use the ‘Custom Resolution Utility (CRU)’ created by ‘ToastyX’. Full instructions on how to use this are included in the first post on the thread linked to. Simply run this utility (CRU.exe) and click the ‘Add…’ button under ‘Detailed resolutions (4 maximum’) as shown in the image below. Newer versions or CRU have slightly different wording, but the process is the same.







This brings up a ‘Detailed Resolution’ configuration box shown to the right in the image above. Select ‘Automatic – LCD standard’ in the ‘Timing’ dropdown and enter the resolution and refresh rate as shown in the image. One key feature of CRU is that after adding a ‘Detailed resolution’ you can move a resolution up to the top of the list so that is treated as the native resolution. You do this by clicking on the resolution you just created and using the little up arrow button to the right of the ‘Reset’ button. This is important because those games that like to ignore Nvidia’s custom resolutions will still use the new native resolution that you set using this utility. Remember to press OK and restart your computer to activate your new resolution.

Note that CRU can also be used to overclock monitors connected to both Nvidia and AMD GPUs by setting a higher than native refresh rate, and that is indeed one of its key original purposes. Some users will find that functionality useful, but that’s not necessary to correct the colour signal. Another good thing about CRU is that it offers a reliable method to correct the colour signal of Nvidia’s mobile GPUs. Because the graphics driver of mobile GPUs is massively cut down you aren’t able to set a custom resolution using Nvidia Control Panel. For users with Nvidia’s desktop GPUs there are a few alternatives to creating custom resolutions which can be used to correct the signal.







Third solution: using the YCbCr444 colour signal

It is very easy to get rid of that ‘washed out’ look and the problematic gamma by setting the graphics card to use the YCbCr444 colour format. Simply open the Nvidia Control Panel and navigate to ‘Display’ – ‘Adjust desktop color settings’. Select ‘YCbCr444’ from the ‘Digital color format’ dropdown as shown below. The ‘Black Level’ option on the monitor, if there is one, should be greyed out after selecting this colour signal type.







This will switch the colour signal the graphics card sends out from RGB (‘Limited Range RGB 16-235’ by default) to an alternative which provides a very similar image to ‘Full Range RGB 0-255’ on most monitors. The measured gamma, white point and contrast are very similar indeed and the image looks very much comparable to a ‘Full Range RGB’ signal on most monitors. Some colour values are changed very slightly, with certain shades displayed more accurately and some less accurately. The images below compare the colour accuracy of the AOC i2473Pwy across a broad range of shades using both ‘Full Range RGB (0-255)’, shown on the left and ‘YCbCr444’, shown on the right. These tests were repeated several times and the slight differences were consistent for one signal type vs. the other – so it isn’t just the colorimeter being weird. Different monitors will of course show different deviations in accuracy, but both colour signals should generally be just as close to each other as in this example. On a minority of monitors the changes can be more pronounced, for example the clarity of text can be affected with a blurred or ‘fringed’ look in places. If you notice such undesirable consequences on your monitor we’d advise using one of the other methods to correct the signal.







As you can see there some slight differences here and there but nothing of huge significance. After selecting the ‘YCbCr444’ colour signal the resolutions will be listed in exactly the same way by the driver, so will remain in the ‘Ultra HD, HD, SD’ list if that’s where they were before. Because the ‘Full Range RGB (0-255)’ signal is used for DVI and most DisplayPort connections you may prefer to enforce this instead of using ‘YCbCr444’, just so you know things are being done ‘the right way’. Our preferred method of enforcing the correct ‘Full Range RGB’ signal over HDMI is to use a nifty little tool mentioned below.







Fourth solution: using a third-party tool to enforce Full Range RGB

This solution has now been superseded by the selectable option now added to the Nvidia Control Panel (‘First solution’). For those who want to experiment with an alternative, for whatever reason, there is a small utility called ‘Nvidia Full/Limited Range Toggler’ which originates from the ‘metaclasofnil’ programming blog. You simply run the executable (.exe) contained in the .zip file and click on ‘Set Full Range (0-255)’ button at the top right as shown below.







All this does is changes a few registry entries for the graphics driver which control the RGB colour signal behaviour for HDMI so that ‘Full Range’ rather than ‘Limited Range’ is used. This will not correct the ‘dodgy DisplayPort’ signal. Once you restart your computer the changes will take effect immediately. You only have to run this tool once, unless you clean install a new graphics driver which will reset all of the registry entries to default again. As with setting a custom resolution you should ensure any ‘Black Level’ or ‘HDMI Range’ setting on the monitor, if there is one, is set appropriately. This will be using the ‘Normal’, ‘High’, ‘Full’ or ‘RGB (0~255)’ setting rather than ‘Low’, ‘Limited’, RGB (16~235) or other words to the same effect.

The resolution will again be listed as it was before in the Nvidia Control Panel, so you won’t notice a change there. If you’re interested in seeing the difference between ‘Full Range RGB (0-255)’ and ‘YCbCr444’ for yourself then feel free to toggle between ‘RGB’ and ‘YCbCr444’ in the graphics driver (second solution) after employing the toggle tool (third solution). You can then quickly switch between the two. Because your computer has to restart after correcting the colour signal using the toggle tool you may be unsure whether it has definitely made a difference. You should see things look much less washed out, but are your eyes just playing tricks on you?

Regardless of the technique you use to correct the colour signal, perhaps the easiest way to see the difference is to observe the Lagom black level test. Use a browser other than Firefox as Mozilla’s colour management can throw things off here. Before correcting the signal you should notice that all of the squares are distinct from the background with little individuality in the shades of the first few blocks. The relatively low gamma and inability of the monitor to display distinctions below a grey level of 16 will have this effect. After correcting the colour signal the first few blocks should blend in with the background better and offer more distinction between themselves and neighbouring shades. The background will appear darker (a grey level of ‘0’ rather than ‘16’) as well.







How AMD GPUs handle the HDMI signal

The initial problem – scaling (a simple fix)

The first and probably most pressing issue you may face when connecting an AMD GPU to a Full HD monitor using HDMI or DVI to HDMI is one of scaling. At least if you’re using an older driver, the image will likely appear compressed and fuzzy with a black border surrounding it. That is because the GPU’s default behaviour, in older drivers at least, is to ‘underscan’ the image. For newer drivers this issue shouldn’t occur, but if you do notice this issue you should find the appropriate slider (mentioned below) in ‘AMD Radeon Settings’ – ‘Display’. To fix this for older drivers, you simply need to Open Catalyst Control Center. Once you’ve got that open navigate to ‘My Digital Flat Panels’ – ‘Scaling Options’ and move the slider to ‘Overscan (0%)’ or all the way to the right as shown in the image below.













The other problem – pixel format

For AMD GPU users DisplayPort connections should always use the correct colour signal by default. And unlike when connecting a monitor to an Nvidia GPU using HDMI, connecting an AMD GPU via HDMI is a lot less problematic when it comes to the colour signal. The image is not washed out and it looks very much as it should on most monitors. When using HDMI, the default behaviour of AMD GPUs is not to use a ‘Limited Range RGB (16-235)’ signal like Nvidia GPUs, but rather to use a ‘YCbCr 444’ signal which is referred to by AMD as ‘YCbCr 4:4:4’. The use of ‘YCbCr 4:4:4’ compared to ‘Full Range RGB (0-255)’ has a slightly more pronounced effect on white point, contrast and measured colour values compared with on an Nvidia GPU. It is still nowhere near as pronounced as comparing Nvidia’s default ‘Limited Range’ signal to any other signal type, however. The table below compares some key values on an AMD GPU connected to the AOC i2473Pwy, with the GPU using both ‘YCbCr 4:4:4’ and ‘Full Range RGB 0-255’. The term ‘RGB 4:4:4’ is used in the table as this is AMD’s preferred terminology for the ‘Full Range RGB’ signal. Again the same ‘Test Settings’ and measuring equipment from our review was used with an AMD Radeon R270X GPU in place of the Nvidia GeForce GTX 780.



AMD signal table

The differences in these key readings are not exactly huge, most notable is the slight boost in contrast you gain by enabling the ‘RGB 4:4:4’ signal. The black luminance remains the same whilst the white luminance is raised by 5 cd/m2 to give a contrast ratio of 1238:1 compared to 1184:1. This is hardly a massive difference on this particular monitor but any bonus is a good thing. The images below compare the colour values of ‘YCbCr 4:4:4’ (left) and ‘RGB 4:4:4’ (right). Again we took these measurements several times and the results were consistent.







You can see that there is greater deviation in colour accuracy between the two signals than there was on the Nvidia GPU. This is true for deep red and certain grey and pastel shades in particular, amongst others. There is little need to critically analyse the accuracy of specific colour values for one signal type vs. the other as this varies between monitors. The take home message here is simply that ‘YCbCr 4:4:4’ and ‘RGB 4:4:4’ (‘Full Range RGB, 0-255’) do differ in their shade representation on AMD GPUs to a greater extent than Nvidia GPUs.

Unlike Nvidia’s ‘Limited Range RGB (16-235)’ signal AMD’s default ‘YCbCr 4:4:4’ signal never causes things to look washed out by dramatically altering gamma or contrast. But it can slightly affect colour values so some shades are presented slightly differently to how they would over a DVI or DisplayPort connection (i.e. ‘correct’). And as with Nvidia cards, this signal type can cause a minority of monitors to display blurred or ‘fringed’ text where certain colours are involved. Most users will probably be quite happy to stick with this default signal, but it is actually very simple to change the signal used using one of two methods.





AMD solutions

First solution: use a DVI to HDMI cable

In contrast to Nvidia GPUs, connecting an AMD GPU up using a DVI to HDMI cable causes it to use the colour signal it would usually use for DVI; ‘Full RGB’. If you have such a cable handy or are happy to buy one (perhaps if you don’t have a regular HDMI cable handy) then this is one solution. If you only have an HDMI cable or would prefer to use one then don’t fret. It is very easy to enforce the ‘Full Range’ signal over HDMI in Catalyst Control Centre (CCC) as demonstrated by the following solution. You have to fix the ‘scaling’ issue in CCC anyway, whether using a DVI to HDMI or regular HDMI cable, so having to tweak something else in CCC shouldn’t cause too much hardship.

Whether using a DVI to HDMI cable or changing the pixel format (below) you will need to ensure any ‘Black Level’ or ‘HDMI Range’ setting on the monitor, if such a setting exists, is set correctly. Make sure you’re using the ‘Normal’, ‘High’, ‘Full’ or ‘RGB (0~255)’ setting on the monitor rather than ‘Low’, ‘Limited’, RGB (16~235) or other words to that effect.







Second solution: change the pixel format

To fix this in older drivers, simply open Catalyst Control Centre. After doing this, navigate to ‘My Digital Flat-Panels’ – ‘Pixel Format’ and change this from the default of ‘YCbCr 4:4:4 Pixel Format’ to ‘RGB 4:4:4 Pixel Format PC Standard (Full RGB)’ as shown below. This is the ‘Full Range RGB 0-255’ option for AMD users. The first image below is taken from Catalyst Control Centre, which the earlier drivers used. Newer drivers have replaced Catalyst Control Centre with AMD Radeon Software. Open this and click on ‘Display’ – make sure ‘RGB 4:4:4 Pixel Format PC Standard (Full RGB)’ is selcted as the ‘Pixel Format’ as shown in the second image.











You will only have to change this option once, unless you clean install a new graphics driver. As noted above you should also make sure the ‘HDMI Black Level’ or similar setting on the monitor is set correctly as well. If you’d like to put yourself in the shoes of an Nvidia user with their default ‘Limited Range RGB (16-235)’ signal then select the ‘RGB 4:4:4 Pixel Format Studio (Limited RGB)’ pixel format. Just remember to change it back afterwards, not that you’ll forget given the fairly significant degradation in contrast and colour quality that you’ll notice.







Conclusion

Many monitors have moved on from using DVI (which is handled perfectly in both Nvidia and AMD drivers) to using HDMI and DisplayPort. This is a trend that is set to continue as these two new standards continue to evolve. Despite this, both AMD and Nvidia GPUs treat Full HD monitors connected by HDMI and set to 60Hz as ‘HDTVs’ and send out a colour signal that even many modern TVs are moving away from. Nvidia GPUs are the worst offenders, using a ‘Limited Range RGB (16-235)’ colour signal by default that completely destroys the image quality of the monitor by hampering contrast, colour vibrancy and shade variety. To add insult to injury a minority of monitors act this way over DisplayPort as well, despite that being dominantly a PC connection where the GPU treating the monitor as a TV makes little sense.

As this article demonstrates it is fairly simple to fix any issues with colour signal that you may come across using HDMI (or ‘dodgy DisplayPort’) and indeed fix AMD’s odd ‘scaling’ issue for older drivers. But there are many users who will never read this article and don’t know how to fix these issues – cursing away at their monitor and perhaps sending it back to the retailer instead. Still, there is some potential light at the end of the tunnel. As the push continues towards higher resolution and refresh rate combinations continues, the ‘Limited Range’ signal curse becomes less common. We’re also happy to see that since this article was first published, Nvidia have added that drop-down ‘Dynamic range’ option to the driver.

We’d of course like to see the GPU drivers of both manufacturers ‘get with the times’, accepting that things have moved on from HDMI being a TV-only connection. Indeed many TVs now happily support a ‘Full Range’ RGB signal anyway, so it would make more sense for the GPU to treat a connected display as a monitor rather than TV. And there is really no need for AMD to choose to ‘underscan’ the image by default over HDMI, either, since this is a problem not just on modern monitors but also modern TVs. Even if things aren’t changed by default driver-side, this article will at least provide some solutions for the poor users facing these pesky issues.



Donations are greatly appreciated.