resolution_scaling.rst 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. .. _doc_resolution_scaling:
  2. Resolution scaling
  3. ==================
  4. .. Images on this page were generated using the project below:
  5. .. https://github.com/Calinou/godot-antialiasing-comparison
  6. Why use resolution scaling?
  7. ---------------------------
  8. With the ever-increasing rendering complexity of modern games, rendering at
  9. native resolution isn't always viable anymore, especially on lower-end GPUs.
  10. Resolution scaling is one of the most direct ways to influence the GPU
  11. requirements of a scene. In scenes that are bottlenecked by the GPU (rather than
  12. by the CPU), decreasing the resolution scale can improve performance
  13. significantly. Resolution scaling is particularly important on mobile GPUs where
  14. performance and power budgets are limited.
  15. While resolution scaling is an important tool to have, remember that resolution
  16. scaling is not intended to be a replacement for decreasing graphics settings on
  17. lower-end hardware. Consider exposing both resolution scale and graphics
  18. settings in your in-game menus.
  19. .. seealso::
  20. You can compare resolution scaling modes and factors in action using the
  21. `3D Antialiasing demo project <https://github.com/godotengine/godot-demo-projects/tree/master/3d/antialiasing>`__.
  22. .. note::
  23. Resolution scaling is currently not available for 2D rendering, but it can be
  24. simulated using the ``viewport`` stretch mode. See :ref:`doc_multiple_resolutions`
  25. for more information.
  26. Resolution scaling options
  27. --------------------------
  28. In the advanced Project Settings' **Rendering > Scaling 3D** section, you can
  29. find several options for 3D resolution scaling:
  30. Scaling mode
  31. ~~~~~~~~~~~~
  32. - **Bilinear:** Standard bilinear filtering (default). This is used as a fallback
  33. when the current renderer doesn't support FSR 1.0 or FSR 2.2. *Available in
  34. all renderers.*
  35. - **FSR 1.0:** `AMD FidelityFX Super Resolution 1.0 <https://gpuopen.com/fidelityfx-superresolution/>`__.
  36. Slower, but higher quality compared to bilinear scaling. On very slow GPUs,
  37. the cost of FSR1 may be too expensive to be worth using it over bilinear
  38. scaling. *Only available when using the Forward+ renderer.*
  39. - **FSR 2.2:** AMD FidelityFX Super Resolution 2.2 (since Godot 4.2). Slowest,
  40. but even higher quality compared to FSR1 and bilinear scaling. On slow GPUs,
  41. the cost of FSR2 may be too expensive to be worth using it over bilinear
  42. scaling or FSR1. To match FSR2 performance with FSR1, you need to use a lower
  43. resolution scale factor. *Only available when using the Forward+ renderer.*
  44. Here are comparison images between native resolution, bilinear scaling with 50%
  45. resolution scale, FSR1, and FSR2 scaling with 50% resolution scale:
  46. .. image:: img/resolution_scaling_bilinear_0.5.png
  47. .. image:: img/resolution_scaling_fsr1_0.5.png
  48. .. image:: img/resolution_scaling_fsr2_0.5.webp
  49. FSR1 upscaling works best when coupled with another form of antialiasing.
  50. Temporal antialiasing (TAA) or multisample antialiasing (MSAA) should preferably
  51. be used in this case, as FXAA does not add temporal information and introduces
  52. more blurring to the image.
  53. On the other hand, FSR2 provides its own temporal antialiasing. This means you
  54. don't need to enable other antialiasing methods for the resulting image to look
  55. smooth. The **Use TAA** project setting is ignored when FSR2 is used as the 3D
  56. scaling method, since FSR2's temporal antialiasing takes priority.
  57. Here's the same comparison, but with 4× MSAA enabled on all images:
  58. .. image:: img/resolution_scaling_bilinear_msaa_4x_0.5.png
  59. .. image:: img/resolution_scaling_fsr1_msaa_4x_0.5.png
  60. .. image:: img/resolution_scaling_fsr2_msaa_4x_0.5.webp
  61. Notice how the edge upscaling of FSR1 becomes much more convincing once 4×
  62. MSAA is enabled. However, FSR2 doesn't benefit much from enabling MSAA since it
  63. already performs temporal antialiasing.
  64. Rendering scale
  65. ~~~~~~~~~~~~~~~
  66. The **Rendering > Scaling 3D > Scale** setting adjusts the resolution scale.
  67. ``1.0`` represents the full resolution scale, with the 3D rendering resolution
  68. matching the 2D rendering resolution. Resolution scales *below* ``1.0`` can be
  69. used to speed up rendering, at the cost of a blurrier final image and more aliasing.
  70. The rendering scale can be adjusted at runtime by changing the ``scaling_3d_scale``
  71. property on a :ref:`class_Viewport` node.
  72. Resolution scales *above* ``1.0`` can be used for supersample antialiasing
  73. (SSAA). This will provide antialiasing at a *very* high performance cost, and is
  74. **not recommended** for most use cases. See :ref:`doc_3d_antialiasing` for more
  75. information.
  76. The tables below list common screen resolutions, the resulting 3D rendering
  77. resolution and the number of megapixels that need to be rendered each frame
  78. depending on the rendering scale option. Rows are sorted from fastest to slowest
  79. in each table.
  80. .. note::
  81. The resolution scale is defined on a **per-axis** basis. For example, this
  82. means that halving the resolution scale factor will reduce the number of
  83. rendered megapixels per frame by a factor of 4, not 2. Therefore, very low
  84. or very high resolution scale factors can have a greater performance impact
  85. than expected.
  86. **1920×1080 (Full HD)**
  87. +--------------------------+-------------------------+-------------------------------+
  88. | Resolution scale factor | 3D rendering resolution | Megapixels rendered per frame |
  89. +==========================+=========================+===============================+
  90. | ``0.50`` | 960×540 | 0.52 MPix |
  91. +--------------------------+-------------------------+-------------------------------+
  92. | ``0.67`` | 1286×723 | 0.93 MPix |
  93. +--------------------------+-------------------------+-------------------------------+
  94. | ``0.75`` | 1440×810 | 1.17 MPix |
  95. +--------------------------+-------------------------+-------------------------------+
  96. | ``0.85`` | 1632×918 | 1.50 MPix |
  97. +--------------------------+-------------------------+-------------------------------+
  98. | ``1.00`` **(native)** | **1920×1080** | **2.07 MPix** |
  99. +--------------------------+-------------------------+-------------------------------+
  100. | ``1.33`` (supersampling) | 2553×1436 | 3.67 MPix |
  101. +--------------------------+-------------------------+-------------------------------+
  102. | ``1.50`` (supersampling) | 2880×1620 | 4.67 MPix |
  103. +--------------------------+-------------------------+-------------------------------+
  104. | ``2.00`` (supersampling) | 3840×2160 | 8.29 MPix |
  105. +--------------------------+-------------------------+-------------------------------+
  106. **2560×1440 (QHD)**
  107. +--------------------------+-------------------------+-------------------------------+
  108. | Resolution scale factor | 3D rendering resolution | Megapixels rendered per frame |
  109. +==========================+=========================+===============================+
  110. | ``0.50`` | 1280×720 | 0.92 MPix |
  111. +--------------------------+-------------------------+-------------------------------+
  112. | ``0.67`` | 1715×964 | 1.65 MPix |
  113. +--------------------------+-------------------------+-------------------------------+
  114. | ``0.75`` | 1920×1080 | 2.07 MPix |
  115. +--------------------------+-------------------------+-------------------------------+
  116. | ``0.85`` | 2176×1224 | 2.66 MPix |
  117. +--------------------------+-------------------------+-------------------------------+
  118. | ``1.00`` **(native)** | **2560×1440** | **3.69 MPix** |
  119. +--------------------------+-------------------------+-------------------------------+
  120. | ``1.33`` (supersampling) | 3404×1915 | 6.52 MPix |
  121. +--------------------------+-------------------------+-------------------------------+
  122. | ``1.50`` (supersampling) | 3840×2160 | 8.29 MPix |
  123. +--------------------------+-------------------------+-------------------------------+
  124. | ``2.00`` (supersampling) | 5120×2880 | 14.75 MPix |
  125. +--------------------------+-------------------------+-------------------------------+
  126. **3840×2160 (Ultra HD "4K")**
  127. +--------------------------+-------------------------+-------------------------------+
  128. | Resolution scale factor | 3D rendering resolution | Megapixels rendered per frame |
  129. +==========================+=========================+===============================+
  130. | ``0.50`` | 1920×1080 | 2.07 MPix |
  131. +--------------------------+-------------------------+-------------------------------+
  132. | ``0.67`` | 2572×1447 | 3.72 MPix |
  133. +--------------------------+-------------------------+-------------------------------+
  134. | ``0.75`` | 2880×1620 | 4.67 MPix |
  135. +--------------------------+-------------------------+-------------------------------+
  136. | ``0.85`` | 3264×1836 | 5.99 MPix |
  137. +--------------------------+-------------------------+-------------------------------+
  138. | ``1.00`` **(native)** | **3840×2160** | **8.29 MPix** |
  139. +--------------------------+-------------------------+-------------------------------+
  140. | ``1.33`` (supersampling) | 5107×2872 | 14.67 MPix |
  141. +--------------------------+-------------------------+-------------------------------+
  142. | ``1.50`` (supersampling) | 5760×3240 | 18.66 MPix |
  143. +--------------------------+-------------------------+-------------------------------+
  144. | ``2.00`` (supersampling) | 7680×4320 | 33.18 MPix |
  145. +--------------------------+-------------------------+-------------------------------+
  146. FSR Sharpness
  147. ~~~~~~~~~~~~~
  148. *This is only available in the Forward+ renderer, not the Mobile or Compatibility
  149. renderers.*
  150. When using the FSR1 or FSR2 scaling modes, the sharpness can be controlled using the
  151. **Rendering > Scaling 3D > FSR Sharpness** advanced project setting.
  152. The intensity is inverted compared to most other sharpness sliders: *lower*
  153. values will result in a sharper final image, while *higher* values will *reduce*
  154. the impact of the sharpening filter. ``0.0`` is the sharpest, while ``2.0`` is
  155. the least sharp. The default value of ``0.2`` provides a balance between
  156. preserving the original image's sharpness and avoiding additional aliasing due
  157. to oversharpening.
  158. .. note::
  159. If you wish to use sharpening when rendering at native resolution, Godot
  160. currently doesn't allow using the sharpening component of FSR1 (RCAS)
  161. independently from the upscaling component (EASU).
  162. As a workaround, you can set the 3D rendering scale to ``0.99``, set the
  163. scaling mode to **FSR 1.0** then adjust FSR sharpness as needed. This allows
  164. using FSR1 while rendering at a near-native resolution.
  165. Alternatively, you can set the scaling mode to **FSR 2.2** with the 3D
  166. rendering scale set to ``1.0`` if you have enough GPU headroom. This also
  167. provides high-quality temporal antialiasing. The **FSR Sharpness** setting
  168. remains functional in this case.
  169. .. _doc_resolution_scaling_mipmap_bias:
  170. Mipmap bias
  171. ~~~~~~~~~~~
  172. *This is only available in the Forward+ and Mobile renderers, not the Compatibility
  173. renderer.*
  174. Godot automatically uses a negative texture mipmap bias when the 3D resolution
  175. scale is set below ``1.0``. This allows for better preservation of texture
  176. detail at the cost of a grainy appearance on detailed textures.
  177. The texture LOD bias currently affects both 2D and 3D rendering in the same way.
  178. However, keep in mind it only has an effect on textures with mipmaps enabled.
  179. Textures used in 2D don't have mipmaps enabled by default, which means only 3D
  180. rendering is affected unless you enabled mipmaps on 2D textures in the Import
  181. dock.
  182. The formula used to determine the texture mipmap bias is:
  183. ``log2f(min(scaling_3d_scale, 1.0)) + custom_texture_mipmap_bias``
  184. To counteract the blurriness added by some antialiasing methods, Godot also adds
  185. a ``-0.25`` offset when FXAA is enabled, and a ``-0.5`` offset when TAA is
  186. enabled. If both are enabled at the same time, a ``-0.75`` offset is used. This
  187. mipmap bias offset is applied *before* the resolution scaling offset, so it does
  188. not change depending on resolution scale.
  189. The texture LOD bias can manually be changed by adjusting the **Rendering >
  190. Textures > Default Filters > Texture Mipmap Bias** advanced project setting. It
  191. can also be changed at runtime on :ref:`Viewports <class_Viewport>` by
  192. adjusting the ``texture_mipmap_bias`` property.
  193. .. warning::
  194. Adjusting the mipmap LOD bias manually can be useful in certain scenarios,
  195. but this should be done carefully to prevent the final image from looking
  196. grainy in motion.
  197. *Negative* mipmap LOD bias can also decrease performance due to
  198. higher-resolution mips having to be sampled further away. Recommended values
  199. for a manual offset are between ``-0.5`` and ``0.0``.
  200. *Positive* mipmap LOD bias will make mipmapped textures appear blurrier than
  201. intended. This may improve performance slightly, but is otherwise not
  202. recommended as the loss in visual quality is usually not worth the
  203. performance gain.
  204. The example below shows an extreme case, with a mipmap LOD bias of ``-1.0`` and
  205. anisotropic filtering disabled to make the difference more noticeable:
  206. .. image:: img/resolution_scaling_texture_mipmap_bias_comparison.png
  207. Troubleshooting
  208. ---------------
  209. Performance does not increase much when decreasing resolution scale
  210. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  211. If performance doesn't increase much when decreasing resolution scale to a value
  212. like ``0.5``, it likely means the performance bottleneck is elsewhere in your
  213. scene. For example, your scene could have too many draw calls, causing a CPU
  214. bottleneck to occur. Likewise, you may have too many graphics effects enabled
  215. for your GPU to handle (such as SDFGI, SSAO or SSR).
  216. See the :ref:`doc_performance` tutorials for more information.