Jump to content

Variable rate shading

From VR & AR Wiki
(Redirected from Variable Rate Shading)

Variable rate shading (VRS) is a GPU feature that lets a renderer change how often the pixel (fragment) shader runs in different parts of a frame. Instead of executing the shader once for every pixel, the GPU can shade a block of pixels, such as 2x2 or 4x4, with a single invocation and copy the result to all pixels in the block, while visibility and depth are still computed at full resolution.[1] Microsoft's Direct3D 12 documentation also calls the technique "coarse pixel shading", the name Intel researchers gave it when they presented it at the High-Performance Graphics conference in 2014.[1][2]

NVIDIA introduced VRS as a hardware feature of its Turing GPUs in 2018, and it is now exposed through DirectX 12, Vulkan and other graphics APIs on PC, console and mobile hardware.[3][4] In VR, it is used to implement foveated rendering: the center of the view, or the point the user is looking at when the headset has eye tracking, is shaded at full rate and the periphery is shaded more coarsely.[3]

Reviewed 27 September 2026. Checked every cited source (Microsoft Learn and DirectX blogs, NVIDIA, Khronos, Intel, Lund HPG 2014 page, XDA, AMD GPUOpen, Meta, Apple, Unity, Road to VR, UploadVR, Crossref records for the three papers) against the claims, dates and figures they support. About review dates.

How it works

Coarse pixels and shading rates

Without VRS, Direct3D 12 applications could only choose between shading once per pixel and multisample anti-aliasing with sample-based execution (supersampling), in which the pixel shader runs once per sample. Microsoft's documentation describes VRS as extending this model in the opposite, "coarse pixel" direction: a group of pixels is shaded as a single unit and the result is broadcast to every sample in the group. Unlike the multisample count, the coarse pixel size can be changed after the render target has been allocated, so different draw passes and different parts of the screen can use different rates.[1]

The shading rate is written as the width and height of the coarse pixel. In Direct3D 12, the rates 1x1, 1x2, 2x1 and 2x2 are supported on all VRS hardware, and 2x4, 4x2 and 4x4 are available when the device reports the AdditionalShadingRatesSupported capability.[1] NVIDIA's Turing implementation offers seven rate options per 16x16-pixel screen region, from full rate down to one shading result for 16 pixels (4x4), and can also supersample selected regions at 2x, 4x or 8x.[3][5] The Vulkan extension allows fragments covering 1 to 4 pixels on each axis independently, up to 4x4.[4]

Depth, stencil and coverage are always computed at full sample resolution, so geometric edges stay sharp even where shading is coarse.[1] NVIDIA contrasts this with its earlier multi-resolution shading and lens-matched shading techniques for VR, which rasterized parts of the image at lower resolution and needed a separate upscaling pass; VRS keeps rasterization at native resolution and varies only how often the shader runs.[3] Because coarse shading enlarges screen-space derivatives, it also causes lower-detail texture mip levels to be selected, which shader authors may need to compensate for.[1]

Specifying the rate

Direct3D 12 defines two hardware tiers. Tier 1 allows the shading rate to be set only per draw call. Tier 2 adds a per-primitive rate written by the vertex or geometry shader (the SV_ShadingRate semantic) and a screen-space shading-rate image, a single-channel 8-bit texture in which each texel sets the rate for one tile of the render target. The tile size is reported by the hardware as 8, 16 or 32 pixels. The per-draw, per-primitive and image rates are merged in sequence by two "combiners", which can pass one value through, override it, take the higher- or lower-quality value, or add the two costs.[1]

Vulkan's cross-vendor extension, VK_KHR_fragment_shading_rate, uses the same three sources (per draw or pipeline, per primitive, and an attachment image mapped to screen regions) and combines them with keep, replace, min, max and multiply operations.[6] The proposal document gives peripheral vision in VR as one case where full-rate shading brings little visible benefit.[6]

Related techniques

Several platforms reduce peripheral rendering cost with mechanisms that are related to VRS but work differently:

  • Fragment density maps. On Meta Quest headsets, fixed foveated rendering relies on the tiled rendering of mobile GPUs: tiles near the edge of the eye buffer are rendered at lower resolution than those in the center, controlled through a fragment density map (the VK_EXT_fragment_density_map and VK_EXT_fragment_density_map2 Vulkan extensions).[7] Eye-tracked foveated rendering on Meta Quest Pro moves that map with the user's gaze using the VK_QCOM_fragment_density_map_offset extension developed with Qualcomm.[8]
  • Variable rasterization rate. Apple's Metal API uses a rasterization rate map that divides the render target into zones with separate horizontal and vertical rates. The app renders into smaller intermediate textures and then scales the result up to a full-rate image, so fewer pixels are both rasterized and shaded in low-rate zones.[9] Unity's documentation lists this technique, rather than VRS, as the foveated rendering method on visionOS.[10]

History

Karthik Vaidyanathan and colleagues at Intel presented "Coarse Pixel Shading" at High-Performance Graphics 2014. The paper proposed decoupling shading from visibility by restricting shading rates to a finite set of screen-aligned grids, and named high-pixel-density displays, foveated rendering, and adaptive shading for motion and defocus blur as uses.[11] Intel later described its 11th-generation (Gen11) processor graphics as the company's first public realization of that work; Gen11 supports Direct3D 12 VRS Tier 1.[2]

NVIDIA introduced VRS in hardware with its Turing architecture in 2018. At launch it was available to developers through NVIDIA's VRWorks SDK for Direct3D 11, OpenGL and Vulkan, with Direct3D 12 support announced as coming soon.[3] Microsoft announced VRS for Direct3D 12 in March 2019, noting that it was supported on in-market NVIDIA hardware and that Intel was experimenting with it on prototype Gen11 hardware, and reported results from Firaxis Games, which tested it on a GeForce RTX 2060 rendering at 4K: a Tier 1 implementation raised frame rates by about 20 percent and a Tier 2 implementation by 14 percent.[12] In March 2020, VRS became one of the four features of DirectX 12 Ultimate, alongside DirectX Raytracing 1.1, mesh shaders and sampler feedback, with support on the Xbox Series X, NVIDIA GeForce RTX GPUs and AMD RDNA 2 GPUs.[13]

The Khronos Group released the cross-vendor Vulkan extension VK_KHR_fragment_shading_rate in October 2020; NVIDIA shipped support for Turing and Ampere GPUs in Vulkan drivers 457.00 (Windows) and 455.26.02 (Linux).[4] In December 2020, Qualcomm announced that the Adreno 660 GPU in the Snapdragon 888 brought VRS to mobile devices for the first time; XDA Developers noted that it had until then been available only on PCs and on the PlayStation 5 and Xbox Series X and Series S consoles.[14] AMD published FidelityFX Variable Shading, an open-source implementation that builds a shading-rate image from the previous frame's luminance variance and motion vectors, for RDNA 2 hardware under DirectX 12 Ultimate and Vulkan.[15]

Selected milestones
Date Event
2014 Intel presents "Coarse Pixel Shading" at High-Performance Graphics[11]
September 2018 NVIDIA describes VRS on Turing GPUs and in VRWorks[3]
March 2019 Microsoft adds VRS (Tier 1 and Tier 2) to Direct3D 12[12]
November 2019 NVIDIA shows eye-tracked VRS in Autodesk VRED with the HTC Vive Pro Eye[16]
January 2020 NVIDIA Variable Rate Supersampling (VRSS) for VR games[17]
March 2020 VRS included in DirectX 12 Ultimate[13]
October 2020 Khronos releases VK_KHR_fragment_shading_rate for Vulkan[4]
December 2020 Qualcomm Adreno 660 (Snapdragon 888) brings VRS to mobile[14]
March 2021 NVIDIA VRSS 2 adds eye-tracked foveation[18]

Applications in VR and AR

Its main VR use is foveated rendering: in NVIDIA's description, content at the gaze point is rendered at maximum quality and the shading rate is reduced toward the periphery, with the shading-rate surface updated every frame from eye-tracking data.[3] Without eye tracking, a static pattern based on the characteristics of the headset lens can be used instead, as in fixed foveated rendering;[3] Microsoft's documentation lists optical distortion due to VR optics among the cases where a lower shading rate is useful.[1] NVIDIA's VRS Wrapper API packages this for Direct3D 11 applications on headsets with eye tracking, with presets for quality and performance.[5]

VRS can also raise quality in selected regions. NVIDIA's "content adaptive shading" uses supersampling on detailed elements such as text and coarse shading elsewhere.[3] In a November 2019 demonstration in Autodesk VRED running on two Quadro RTX 8000 GPUs, NVIDIA combined eye-tracked foveated rendering on the HTC Vive Pro Eye with content adaptive shading. Rendering an interior view at eight samples per pixel across the whole screen ran at 28 frames per second; NVIDIA wrote that "enabling foveated rendering almost doubles this performance", to 53 frames per second.[16]

NVIDIA's Variable Rate Supersampling (VRSS), announced at CES in January 2020, applies VRS at the driver level to supported VR games without changes to the games. It uses up to 8x supersampling in the center of the headset display, where the eye is generally focused, and only when GPU headroom allows the headset's fixed frame rate to be held. It arrived in the 441.87 Game Ready Driver for Turing GPUs and was limited to Direct3D 11 VR titles with forward renderers and MSAA support, with more than 20 games qualifying at launch.[17][19] VRSS 2, in the R465 driver released on 30 March 2021, added dynamic foveated rendering that moves the supersampled region to wherever the user is looking, using Tobii eye tracking; the HP Reverb G2 Omnicept Edition was the first supported headset.[18][5]

Game engines also expose VRS-based foveation to XR developers. Unity's manual lists VRS as the foveated rendering technique for OpenXR platforms and Meta Quest, and notes that it works with existing shaders, while custom shaders that do screen-space calculations may need changes on platforms that use a non-uniform raster.[10] The Unity OpenXR plug-in picks, in order, a gaze-based or fixed fragment density map from the runtime, then a fragment shading rate texture from the runtime, then a fragment shading rate image it computes itself from the view's field of view.[20]

Research

Several research papers address how to choose the rate for each tile. Lei Yang and colleagues at NVIDIA described a method that picks a per-tile shading rate by testing an error estimate, based on spatial and frequency analysis of half- and quarter-rate shading, against a perceptually corrected just-noticeable-difference threshold, and that also accounts for motion reducing perceived error; they demonstrated it in two game engines and shipped games.[21] Akshay Jindal, Krzysztof Wolski, Karol Myszkowski and Rafał Mantiuk proposed a model that jointly selects a VRS state map for 16x16 tiles and the display refresh rate under a fixed rendering budget, using a metric of judder, aliasing and blur derived from contrast-sensitivity models.[22] Work on temporal reuse of shading has targeted VR directly: Mueller and colleagues reported that their temporally adaptive shading framework saved more than 57 percent of shader invocations and reduced rendering times in VR applications without a noticeable loss of quality.[23]

See also

References

  1. ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 "Variable-rate shading (VRS)". Microsoft Learn. Microsoft. 2019-04-08. https://learn.microsoft.com/en-us/windows/win32/direct3d12/vrs. Retrieved 2026-09-27.
  2. ↑ 2.0 2.1 Adam T. Lake, Laura Wieme Reznikov, Marissa du Bois (2019-12-02). "Get Started with Variable Rate Shading on Intel Processor Graphics". Intel Developer Zone. Intel. https://www.intel.com/content/www/us/en/developer/articles/guide/getting-started-with-variable-rate-shading-on-intel-processor-graphics.html. Retrieved 2026-09-27.
  3. ↑ 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 Swaroop Bhonde (2018-09-24). "Turing Variable Rate Shading in VRWorks". NVIDIA Technical Blog. NVIDIA. https://developer.nvidia.com/blog/turing-variable-rate-shading-vrworks. Retrieved 2026-09-27.
  4. ↑ 4.0 4.1 4.2 4.3 Tobias Hector (2020-10-28). "Khronos Vulkan Working Group Releases Shading Rate Extension to Increase Rendering Performance and Quality". Khronos Group Blog. Khronos Group. https://www.khronos.org/blog/khronos-vulkan-working-group-releases-shading-rate-extension-to-increase-rendering-performance-and-quality. Retrieved 2026-09-27.
  5. ↑ 5.0 5.1 5.2 "VRWorks - Variable Rate Shading (VRS)". NVIDIA Developer. NVIDIA. https://developer.nvidia.com/vrworks/graphics/variablerateshading. Retrieved 2026-09-27.
  6. ↑ 6.0 6.1 "VK_KHR_fragment_shading_rate (extension proposal)". Vulkan Documentation Project. Khronos Group. https://docs.vulkan.org/features/latest/features/proposals/VK_KHR_fragment_shading_rate.html. Retrieved 2026-09-27.
  7. ↑ "Fixed foveated rendering (FFR)". Meta Horizon OS Developers. Meta. https://developers.meta.com/horizon/documentation/native/android/os-fixed-foveated-rendering/. Retrieved 2026-09-27.
  8. ↑ Ross Ning, Luc Charbonneau, Kevin Xiao, Neel Bedekar, Rémi Palandri, Steve Lansel (2023-02-15). "Save GPU with Eye Tracked Foveated Rendering". Meta Horizon OS Developers Blog. Meta. https://developers.meta.com/horizon/blog/save-gpu-with-eye-tracked-foveated-rendering/. Retrieved 2026-09-27.
  9. ↑ "Rendering at different rasterization rates". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/metal/rendering-at-different-rasterization-rates. Retrieved 2026-09-27.
  10. ↑ 10.0 10.1 "Introduction to foveated rendering". Unity Manual. Unity Technologies. https://docs.unity3d.com/Manual/xr-foveated-rendering-introduction.html. Retrieved 2026-09-27.
  11. ↑ 11.0 11.1 Karthik Vaidyanathan, Marco Salvi, Robert Toth, Tim Foley, Tomas Akenine-Möller, Jim Nilsson, Jacob Munkberg, Jon Hasselgren, Masamichi Sugihara, Petrik Clarberg, Aaron Lefohn (2014). "Coarse Pixel Shading". High-Performance Graphics 2014 (project page, Lund University). https://fileadmin.cs.lth.se/graphics/research/papers/2014/cps/. Retrieved 2026-09-27.
  12. ↑ 12.0 12.1 Jacques van Rhyn (2019-03-18). "Variable Rate Shading: a scalpel in a world of sledgehammers". DirectX Developer Blog. Microsoft. https://devblogs.microsoft.com/directx/variable-rate-shading-a-scalpel-in-a-world-of-sledgehammers/. Retrieved 2026-09-27.
  13. ↑ 13.0 13.1 Shawn Hargreaves (2020-03-19). "Announcing DirectX 12 Ultimate". DirectX Developer Blog. Microsoft. https://devblogs.microsoft.com/directx/announcing-directx-12-ultimate/. Retrieved 2026-09-27.
  14. ↑ 14.0 14.1 Idrees Patel (2020-12-02). "Everything you need to know about the Qualcomm Snapdragon 888". XDA Developers. https://www.xda-developers.com/qualcomm-snapdragon-888-explained-specs-features/. Retrieved 2026-09-27.
  15. ↑ "AMD FidelityFX Variable Shading". AMD GPUOpen. AMD. https://gpuopen.com/fidelityfx-variable-shading/. Retrieved 2026-09-27.
  16. ↑ 16.0 16.1 Ingo Esser, Robert Menzel (2019-11-26). "NVIDIA Variable Rate Shading Demonstrated in Autodesk VRED". NVIDIA Technical Blog. NVIDIA. https://developer.nvidia.com/blog/nvidia-variable-rate-shading-demonstrated-in-autodesk-vred. Retrieved 2026-09-27.
  17. ↑ 17.0 17.1 "CES 2020 Game Ready Driver". GeForce News. NVIDIA. 2020-01-06. https://www.nvidia.com/en-us/geforce/news/nvidia-geforce-ces-2020-game-ready-driver/. Retrieved 2026-09-27.
  18. ↑ 18.0 18.1 Ben Lang (2021-04-12). "NVIDIA Adds Eye-tracking to VRSS 2 Foveated Rendering Tech". Road to VR. https://roadtovr.com/nvidia-vrss-2-eye-tracking-foveated-rendering-supersampling/. Retrieved 2026-09-27.
  19. ↑ David Heaney (2020-01-06). "CES 2020: NVIDIA Increases VR Sharpness For RTX Cards With Variable Rate Supersampling". UploadVR. https://www.uploadvr.com/nvidia-rtx-vrss-ces-2020/. Retrieved 2026-09-27.
  20. ↑ "Foveated rendering in OpenXR". Unity OpenXR Plugin 1.15 documentation. Unity Technologies. https://docs.unity3d.com/Packages/[email protected]/manual/features/foveatedrendering.html. Retrieved 2026-09-27.
  21. ↑ Lei Yang, Dmitry Zhdan, Emmett Kilgariff, Eric B. Lum, Yubo Zhang, Matthew Johnson, Henrik Rydgård (2019-06). "Visually Lossless Content and Motion Adaptive Shading in Games". Proceedings of the ACM on Computer Graphics and Interactive Techniques, vol. 2, no. 1. doi:10.1145/3320287. https://doi.org/10.1145/3320287. Retrieved 2026-09-27.
  22. ↑ Akshay Jindal, Krzysztof Wolski, Karol Myszkowski, Rafał K. Mantiuk (2021-12). "Perceptual model for adaptive local shading and refresh rate". ACM Transactions on Graphics, vol. 40, no. 6. doi:10.1145/3478513.3480514. https://doi.org/10.1145/3478513.3480514. Retrieved 2026-09-27.
  23. ↑ Joerg H. Mueller, Thomas Neff, Philip Voglreiter, Markus Steinberger, Dieter Schmalstieg (2021-04). "Temporally Adaptive Shading Reuse for Real-Time Rendering and Virtual Reality". ACM Transactions on Graphics, vol. 40, no. 2. doi:10.1145/3446790. https://doi.org/10.1145/3446790. Retrieved 2026-09-27.