{"id":3000,"date":"2020-05-26T12:00:51","date_gmt":"2020-05-26T19:00:51","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/directx\/?p=3000"},"modified":"2020-10-23T15:58:56","modified_gmt":"2020-10-23T22:58:56","slug":"gears-tactics-vrs","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/directx\/gears-tactics-vrs\/","title":{"rendered":"Iterating on Variable Rate Shading in Gears Tactics"},"content":{"rendered":"<p><em>Gears Tactics <\/em>is the very first game to ship with support for DirectX 12 <u><a href=\"https:\/\/devblogs.microsoft.com\/directx\/variable-rate-shading-a-scalpel-in-a-world-of-sledgehammers\/\">Variable Rate Shading<\/a><\/u> (VRS), one of the major features in <u><a href=\"https:\/\/devblogs.microsoft.com\/directx\/announcing-directx-12-ultimate\/\">DirectX 12 Ultimate<\/a><\/u>.<\/p>\n<p>VRS let <em>Gears Tactics<\/em> achieve large performance gains \u2013 up to 18.9% (!) \u2013 on a wide range of hardware with a minimal impact on visual quality. Check out this guest post where Jacob Nelson and Cam McRae share implementation details, performance data and future ways to expand VRS.<\/p>\n<p><strong><span style=\"font-size: 18pt;\">Iterating on Variable Rate Shading in Gears Tactics<\/span>\n<\/strong><\/p>\n<p><em>Jacob Nelson, Programmer at Disbelief<\/em><\/p>\n<p><em>Cam McRae, Technical Director at The Coalition<\/em><\/p>\n<p><em>Gears Tactics<\/em> is a fast-paced, turn-based strategy game set in the universe of one of gaming\u2019s most-acclaimed franchises\u2013 Gears of War.<\/p>\n<p><img decoding=\"async\" width=\"2048\" height=\"1152\" class=\"wp-image-3001\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-26.png\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-26.png 2048w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-26-300x169.png 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-26-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-26-768x432.png 768w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-26-1536x864.png 1536w\" sizes=\"(max-width: 2048px) 100vw, 2048px\" \/><\/p>\n<p>One of The Coalition\u2019s primary goals on <em>Gears Tactics<\/em> was to reach a wider audience on PC by reducing the hardware barrier to entry. This led us to look for new solutions to improve performance that didn\u2019t entirely involve sacrificing visual quality. We landed on Variable Rate Shading (VRS), which gave a generous performance boost with minimal quality loss. In this article we\u2019ll detail our process of iterating on VRS to achieve a good balance of quality vs. performance.<\/p>\n<p>Availability of VRS is based on hardware. To support our goal of reducing the hardware barrier to entry, we wanted to include the broadest range of hardware in our VRS implementation. For this reason, our implementation is exclusively Tier 1, which lets us set a shading rate per draw. For more background on VRS, refer to <a href=\"https:\/\/devblogs.microsoft.com\/directx\/variable-rate-shading-a-scalpel-in-a-world-of-sledgehammers\/\">this blog post<\/a>.<\/p>\n<p>Because our usage of VRS did not extend past tier 1 we needed to determine which rendering passes (<em>Gears Tactics<\/em> uses Unreal Engine 4) could support VRS, as well create new ways to determine when to reduce the shading rate. We found we could benefit from VRS throughout the renderer, including some full screen draws.<\/p>\n<p><strong>Evaluating the Rendering Pipeline<\/strong><\/p>\n<p>In our initial investigation, the base pass and translucency stood out as large potential for gains compared to most other passes. We enabled VRS for all draw calls in the base pass and the translucency pass and immediately noticed the artifacts were too severe in the translucency pass.<\/p>\n<p>We determined our next step would need to be evaluating which passes had the most promise for gains from VRS and then testing multiple shading rates on those passes and excluding any that had artifacts. Passes that relied on accurate pixel information were one cause of these artifacts.<\/p>\n<p>To figure out which had the most promise, we enabled VRS on all passes and then narrowed down in PIX the areas that showed a benefit. These areas were:<\/p>\n<ul>\n<li><strong>Composition after lighting<\/strong>:\nLighting for subsurface scattering materials.<\/li>\n<li><strong>Filter Translucent Volumes<\/strong>:\nSmooths out translucent meshes within a volume to prevent aliasing issues.<\/li>\n<li><strong>Light attenuation<\/strong>:\nAttenuation is the outer bounds when calculating the falloff of a given light. This pass iterates on shadowed lights with this falloff in mind to render shadow projections.<\/li>\n<li><strong>Light composition tasks (PreLighting)<\/strong>:\nResponsible for screen space ambient occlusion and decals.<\/li>\n<li><strong>Light Shaft Bloom<\/strong>:\nBloom effect generated from light shaft rendering.<\/li>\n<li><strong>Screen Space Reflections<\/strong>:\nThe process to re-use screen-space information for creating reflections.<\/li>\n<li><strong>SSR Temporal AA<\/strong>:\nAnti-aliasing for the results of the Screen Space Reflections pass.<\/li>\n<li><strong>Direct Deferred Lighting<\/strong>:\nResponsible for rendering any direct lights to the scene color buffer.<\/li>\n<\/ul>\n<p>Next, we examined the severity of artifacts produced in those passes by VRS. This process was fairly time consuming as <em>Gears Tactics<\/em> has multiple biomes with multiple types of weather conditions. We could have good results in a city during the day, but artifacts in a sand environment with various foliage or at night in the rain.<\/p>\n<p>The following passes proved to have a performance improvement from VRS, but had too many artifacts to be worth using:<\/p>\n<ul>\n<li><strong>Translucency<\/strong><\/li>\n<li><strong>Deferred Lighting<\/strong><\/li>\n<li><strong>Composition after lighting<\/strong><\/li>\n<\/ul>\n<p><img decoding=\"async\" width=\"794\" height=\"382\" class=\"wp-image-3002\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-27.png\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-27.png 794w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-27-300x144.png 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-27-768x369.png 768w\" sizes=\"(max-width: 794px) 100vw, 794px\" \/><\/p>\n<p><em>(Example showing before and after of Composition after lighting at a coarse pixel size of 4&#215;4)<\/em><\/p>\n<p>After excluding the passes where VRS is unusable due to artifacts, we began to work on adjusting the shading rate based on other factors. As a first adjustment, we excluded dynamic and opacity masked objects. Dynamic objects cast a fully dynamic shadow. These key objects would often lose important details when VRS was being applied and were typically more noticeable throughout the scene. VRS applied to an opacity mask would often result in a great loss of detail. Dynamic objects became more obvious when motion was applied. Objects with a pixel depth offset did not render correctly, so those were excluded as well.<\/p>\n<p><img decoding=\"async\" width=\"1600\" height=\"572\" class=\"wp-image-3003\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-28.png\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-28.png 1600w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-28-300x107.png 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-28-1024x366.png 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-28-768x275.png 768w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-28-1536x549.png 1536w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<p><em>(VRS being applied to a collection of masked objects causing an unacceptable amount of loss of detail)<\/em><\/p>\n<p><strong>Dynamic Techniques<\/strong><\/p>\n<p>We now had a good set of rendering passes that could have VRS applied. However, broadly applying the lowest shading rate (4&#215;4 or 2&#215;2 depending on hardware support) across these passes would lead to a very noticeable quality loss.<\/p>\n<p>This led us to investigate dynamic techniques that would change the shading rate depending on how the particular pass was being drawn. Our investigation led to three distinct shading techniques. We applied each technique immediately before each mesh was drawn in key passes. The three techniques were object sizing, depth of field masking, and \u201cFog of War\u201d masking:<\/p>\n<p><strong>Object Sizing<\/strong><\/p>\n<p>The objective for this dynamic factor was to apply a high amount of VRS on any mesh that was extremely small in world space. Object sizing is a quick condition that checks if the mesh size is below a small threshold. If it is, then the shading rate is scaled proportional to the size of the mesh.<\/p>\n<p><strong>Depth of Field Masking<\/strong><\/p>\n<p>Depth of field was not enabled by default during gameplay for <em>Gears Tactics<\/em> for most GPUs, but it was enabled during cutscenes. This technique determined the amount of blur a mesh will have once depth of field was finally applied during post processing. Because detail is intentionally lost from blurring the mesh, we were safe in applying a low shading rate on all the key passes before depth of field. <img decoding=\"async\" width=\"1429\" height=\"803\" class=\"wp-image-3004\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-4.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-4.jpeg 1429w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-4-300x169.jpeg 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-4-1024x575.jpeg 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-4-768x432.jpeg 768w\" sizes=\"(max-width: 1429px) 100vw, 1429px\" \/><\/p>\n<p><em>(Meshes highlighted in red have the coarsest pixel size due to the depth of field)<\/em><\/p>\n<p><strong>\u201cFog of War\u201d Masking<\/strong><\/p>\n<p><em>Gears Tactics<\/em> used a \u2018Fog of War\u2019 system to obscure portions of the battlefield. We took advantage of the \u201cFog of War\u201d to mask a reduced shading rate. This technique determined how far a given mesh was shrouded in the \u201cFog of War\u201d and proportionally lowered the shading rate.<\/p>\n<p><img decoding=\"async\" width=\"2048\" height=\"1152\" class=\"wp-image-3005\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-29.png\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-29.png 2048w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-29-300x169.png 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-29-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-29-768x432.png 768w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-29-1536x864.png 1536w\" sizes=\"(max-width: 2048px) 100vw, 2048px\" \/><\/p>\n<p><em>(As the \u201cFog of War\u201d intensity grows, so does the intensity of VRS)<\/em><\/p>\n<p><strong>Quality vs. Performance<\/strong><\/p>\n<p>With our dynamic techniques in place on the set of rendering passes that cleanly supported VRS, we then looked at tuning the dynamic ranges and the shading rates that would be used. We found that we could get upwards of 30% performance gains by aggressively lowering the shading rate, but the quality loss was more noticeable than we wanted.<\/p>\n<p>The next step was to hand tune the shading rate for each pass across multiple biomes, evaluating performance gain and quality with each change. While doing this, we realized we could break up the VRS setting into two distinct tiers. The \u201cOn\u201d setting would have the least noticeable impact on quality by leaving VRS off for some rendering passes and limiting the shading rate reduction, while the \u201cPerformance\u201d setting would make some minor visual quality trade-offs for a larger performance gain by using lower shading rates.<\/p>\n<p>This had the added benefit of cleanly supporting shading rates that required extra capabilities. Pixel sizes above 2 require additional shading rate support from the hardware, so any pass that could use 2&#215;4, 4&#215;2, or 4&#215;4 shading rates are limited to the \u201cPerformance\u201d tier.<\/p>\n<p><img decoding=\"async\" width=\"1428\" height=\"509\" class=\"wp-image-3006\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-5.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-5.jpeg 1428w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-5-300x107.jpeg 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-5-1024x365.jpeg 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-5-768x274.jpeg 768w\" sizes=\"(max-width: 1428px) 100vw, 1428px\" \/><\/p>\n<p><strong>Performance Results<\/strong><\/p>\n<p>We focused our performance testing on Intel Gen 11 and Intel Xe hardware, with the support of Intel, as well as NVIDIA Turing hardware. There were similar performance gains on all the supported hardware.<\/p>\n<p><strong>Testing Hardware<\/strong><\/p>\n<p>Operating System: Windows 10 Pro 64-bit (10.0, Build 18362) (18362.19h1_release.190318-1202)\nProcessor: Intel(R) Core(TM) i9-9900X CPU @ 3.50GHz (20 CPUs), ~3.5GHz\nMemory: 98304MB RAM\nCard name: NVIDIA GeForce RTX 2080 SUPER<\/p>\n<p>All tests run at Ultra settings with 4K resolution<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>VRS Setting<\/strong><\/td>\n<td><strong>Frametime (ms)<\/strong><\/td>\n<td><strong>GPU Savings (ms)<\/strong><\/td>\n<td><strong>GPU Savings (%)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>VRS Off<\/td>\n<td>23.3ms<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<\/tr>\n<tr>\n<td>VRS On<\/td>\n<td>20.9ms<\/td>\n<td>2.4<\/td>\n<td>10.3<\/td>\n<\/tr>\n<tr>\n<td>VRS Performance<\/td>\n<td>18.9ms<\/td>\n<td>4.4<\/td>\n<td>18.9<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Rendering Pass<\/strong><\/td>\n<td><strong>VRS\n\u201cOn\u201d<\/strong><\/td>\n<td><strong>GPU Savings \u201cOn\u201d (ms)<\/strong><\/td>\n<td><strong>VRS \u201cPerformance\u201d<\/strong><\/td>\n<td><strong>GPU Savings \u201cPerformance\u201d (ms)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Base Pass<\/td>\n<td>E1X1<\/td>\n<td>&#8211;<\/td>\n<td>E2X1<\/td>\n<td>0.6<\/td>\n<\/tr>\n<tr>\n<td>SSR Temporal AA<\/td>\n<td>E2X1<\/td>\n<td>0.3<\/td>\n<td>E2X2<\/td>\n<td>0.5<\/td>\n<\/tr>\n<tr>\n<td>Filter Translucent Volumes<\/td>\n<td>E2X2<\/td>\n<td>&lt;0.1<\/td>\n<td>E4X4<\/td>\n<td>0.1<\/td>\n<\/tr>\n<tr>\n<td>Light Attenuation<\/td>\n<td>E2X1<\/td>\n<td>0.4<\/td>\n<td>E2X2<\/td>\n<td>0.5<\/td>\n<\/tr>\n<tr>\n<td>Light Composition Tasks (PreLighting)<\/td>\n<td>E2X1<\/td>\n<td>1.5<\/td>\n<td>E2X1<\/td>\n<td>1.5<\/td>\n<\/tr>\n<tr>\n<td>Light Shaft Bloom<\/td>\n<td>E2X2<\/td>\n<td>&lt;0.1<\/td>\n<td>E4X4<\/td>\n<td>0.1<\/td>\n<\/tr>\n<tr>\n<td>Screen Space Reflections<\/td>\n<td>E1X1<\/td>\n<td>&#8211;<\/td>\n<td>E1X2<\/td>\n<td>0.4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Shading Rate Technique<\/strong><\/td>\n<td><strong>Max Pixel Size\n\u201cOn\u201d<\/strong><\/td>\n<td><strong>GPU Savings \u201cOn\u201d (ms)<\/strong><\/td>\n<td><strong>Max Pixel Size \u201cPerformance\u201d<\/strong><\/td>\n<td><strong>GPU Savings \u201cPerformance\u201d (ms)<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Object Sizing<\/td>\n<td>E2X2<\/td>\n<td>0.1<\/td>\n<td>E4X4<\/td>\n<td>0.1<\/td>\n<\/tr>\n<tr>\n<td>Depth of Field Masking\n(Only used in Cutscenes)<\/td>\n<td>E2X2<\/td>\n<td>0.2<\/td>\n<td>E4X4<\/td>\n<td>0.3<\/td>\n<\/tr>\n<tr>\n<td>Fog of War Masking<\/td>\n<td>E2X2<\/td>\n<td>0.3<\/td>\n<td>E4X4<\/td>\n<td>0.5<\/td>\n<\/tr>\n<tr>\n<td>All Advanced Techniques<\/td>\n<td>E2X2<\/td>\n<td>0.4 (Gameplay)\n0.6 (Cutscenes)<\/td>\n<td>E4X4<\/td>\n<td>0.7 (Gameplay)\n1.0 (Cutscenes)<\/td>\n<\/tr>\n<tr>\n<td>All Techniques and Passes<\/td>\n<td>E2X2<\/td>\n<td>2.4 (Gameplay)\n2.6 (Cutscenes)<\/td>\n<td>E4X4<\/td>\n<td>4.4 (Gameplay)\n4.7 (Cutscenes)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"wp-image-3007\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-30.png\" width=\"182\" height=\"437\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-30.png 500w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-30-125x300.png 125w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-30-427x1024.png 427w\" sizes=\"(max-width: 182px) 100vw, 182px\" \/><\/p>\n<p><img decoding=\"async\" width=\"2048\" height=\"1152\" class=\"wp-image-3008\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-31.png\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-31.png 2048w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-31-300x169.png 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-31-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-31-768x432.png 768w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-31-1536x864.png 1536w\" sizes=\"(max-width: 2048px) 100vw, 2048px\" \/><\/p>\n<p><em>(All techniques enabled with \u201cVRS On\u201d)<\/em><\/p>\n<p><strong><img decoding=\"async\" width=\"2048\" height=\"1152\" class=\"wp-image-3009\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-32.png\" srcset=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-32.png 2048w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-32-300x169.png 300w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-32-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-32-768x432.png 768w, https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2020\/05\/word-image-32-1536x864.png 1536w\" sizes=\"(max-width: 2048px) 100vw, 2048px\" \/><\/strong><\/p>\n<p><em>(All techniques enabled with \u201cVRS Performance\u201d)<\/em><\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>VRS Setting<\/strong><\/td>\n<td><strong>E1x1 Draw Calls<\/strong><\/td>\n<td><strong>E1x2 Draw Calls<\/strong><\/td>\n<td><strong>E2x1 Draw Calls<\/strong><\/td>\n<td><strong>E2x2 Draw Calls<\/strong><\/td>\n<td><strong>E2x4 Draw Calls<\/strong><\/td>\n<td><strong>E4x2 Draw Calls<\/strong><\/td>\n<td><strong>E4x4 Draw Calls<\/strong><\/td>\n<\/tr>\n<tr>\n<td>VRS Off<\/td>\n<td>4100<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<\/tr>\n<tr>\n<td>VRS On<\/td>\n<td>3430<\/td>\n<td>260<\/td>\n<td>150<\/td>\n<td>260<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<td>&#8211;<\/td>\n<\/tr>\n<tr>\n<td>VRS Performance<\/td>\n<td>2791<\/td>\n<td>30<\/td>\n<td>1047<\/td>\n<td>11<\/td>\n<td>27<\/td>\n<td>8<\/td>\n<td>258<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><strong>Expanding on VRS<\/strong><\/p>\n<p>It is possible to obtain further benefits by expanding on our previously discussed techniques to apply VRS.<\/p>\n<p><strong>Further Masking Techniques<\/strong><\/p>\n<p>More masking techniques could obtain an increased amount of benefit from VRS or further reduce artifacts. These methods can vary depending on instances where areas are obscured or blurred during gameplay:<\/p>\n<ul>\n<li><strong>Motion Blur:<\/strong>\nCameras that utilize fast moving scenes can easily make use of VRS on most meshes when moving quickly with motion blur enabled.<\/li>\n<li><strong>Particles:\n<\/strong> Meshes hidden behind a thick shroud of particles could be used to mask high intensity VRS.<\/li>\n<\/ul>\n<p><strong>Dynamic Variable Rate Shading<\/strong><\/p>\n<p>Similar to Dynamic Resolution Scaling, a possible improvement is to scale the amount of VRS depending on the frame rate to minimize the amount of time needed to use the feature. This would be a separate tracking system from Dynamic Resolution Scaling that might need to change at different frequencies to avoid amplifying artifacts.<\/p>\n<p><strong>Dynamic Resolution Scaling<\/strong><\/p>\n<p><em>Gears Tactics<\/em> offers both VRS and Dynamic Resolution Scaling for optimization, but these features do not play well with each other. This is because when Dynamic Resolution Scaling changes the resolution scale, the VRS artifacts change appearance. This can cause the player to become aware of the VRS artifacts and the resolution scale changes when both would have otherwise gone unnoticed. One way to allow both at the same time could be to monitor the rate of change of Dynamic Resolution Scaling and disable the use of VRS until it has stabilized.<\/p>\n<p><strong>In Conclusion<\/strong><\/p>\n<p>We found that skillful use of VRS tier one enabled us to achieve significant performance gains across a wide range of hardware with a minimal impact on visual quality.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gears Tactics is the very first game to ship with support for DirectX 12 Variable Rate Shading (VRS), one of the major features in DirectX 12 Ultimate. VRS let Gears Tactics achieve large performance gains \u2013 up to 18.9% (!) \u2013 on a wide range of hardware with a minimal impact on visual quality. Check [&hellip;]<\/p>\n","protected":false},"author":2237,"featured_media":3001,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3000","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-directx"],"acf":[],"blog_post_summary":"<p>Gears Tactics is the very first game to ship with support for DirectX 12 Variable Rate Shading (VRS), one of the major features in DirectX 12 Ultimate. VRS let Gears Tactics achieve large performance gains \u2013 up to 18.9% (!) \u2013 on a wide range of hardware with a minimal impact on visual quality. Check [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts\/3000","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/users\/2237"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/comments?post=3000"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts\/3000\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/media\/3001"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/media?parent=3000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/categories?post=3000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/tags?post=3000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}