From 0714b9d8edb6d22438e730ae5280e22f867a2894 Mon Sep 17 00:00:00 2001 From: Allen Pestaluky Date: Fri, 10 Apr 2026 14:59:58 -0400 Subject: [PATCH] Update HDR output manual page based on development during the 4.7 dev cycle. --- tutorials/rendering/hdr_output.rst | 295 ++++++++++-------- .../img/rendering_hdr_output_game_view.webp | Bin 0 -> 5830 bytes ...dering_hdr_output_game_window_options.webp | Bin 0 -> 10674 bytes 3 files changed, 170 insertions(+), 125 deletions(-) create mode 100644 tutorials/rendering/img/rendering_hdr_output_game_view.webp create mode 100644 tutorials/rendering/img/rendering_hdr_output_game_window_options.webp diff --git a/tutorials/rendering/hdr_output.rst b/tutorials/rendering/hdr_output.rst index 9d4fc089dc5..1dc6a357b90 100644 --- a/tutorials/rendering/hdr_output.rst +++ b/tutorials/rendering/hdr_output.rst @@ -3,8 +3,8 @@ HDR output ========== -HDR output is a feature that enables presentation of High Dynamic Range (HDR) visuals on -HDR-capable screens. HDR **output** is not to be confused with the internal HDR rendering that is +HDR output is a feature that enables presentation of High Dynamic Range (HDR) visuals on +HDR-capable screens. HDR **output** is not to be confused with the internal HDR rendering that is used by Godot for both Standard Dynamic Range (SDR) output and HDR output modes. Enabling HDR output in your project @@ -18,96 +18,134 @@ You can enable HDR output in any new or existing project using these steps: - Glow Blend Mode: Soft Light - Adjustments: Color Correction -2. Configure the :ref:`Rendering Device Driver` project setting to the following: - -- macOS: metal -- iOS: metal -- Windows: d3d12 - -3. Configure the :ref:`Display Server Driver.linuxbsd` - project setting to ``wayland`` and enable the :ref:`Prefer Wayland` +2. Configure the :ref:`Renderer` + project setting to ``mobile`` or ``forward_plus``. +3. Configure the :ref:`Rendering Device Driver` + advanced project setting to ``metal`` for iOS and ``d3d12`` for Windows. +4. Configure the :ref:`Display Server Driver.linuxbsd` + advanced project setting to ``wayland`` and enable the :ref:`Prefer Wayland` editor setting. -4. Turn on the :ref:`HDR 2D` project +5. Turn on the :ref:`HDR 2D` project setting and enable :ref:`use_hdr_2d` for all :ref:`SubViewports ` and :ref:`Windows ` that should support HDR output. -5. Turn on the :ref:`Request HDR Output ` +6. Turn on the :ref:`Request HDR Output ` project setting and enable :ref:`hdr_output_requested` for all other :ref:`Windows ` that should support HDR output. +7. *[Optional]* Provide in-game HDR settings by copying the example from the + `HDR output demo project `__ + to your project. .. note:: - Some of these settings may already be configured correctly for HDR output in your project. For - example, the Windows Rendering Device Driver is set to ``d3d12`` in projects created in Godot - 4.6 onwards, but will need to be changed if the project was created with an older version of + Some of these settings may already be configured correctly for HDR output in your project. For + example, the Windows Rendering Device Driver is set to ``d3d12`` in projects created in Godot + 4.6 onwards, but will need to be changed if the project was created with an older version of Godot. +Using HDR output in Godot +------------------------- + +Try out the `HDR output demo project `__ +as a first step to using HDR output in Godot. This demo contains examples of the concepts +described on this page and will help you ensure that your development environment is correctly +configured for HDR output. + +HDR output in the Godot editor +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Godot editor will use HDR output for its main window when the :ref:`Request HDR Output ` +project setting has been +enabled. You can tell if your game is running in SDR or HDR output mode based on the text on the +right side of game view toolbar: Your game is running in HDR mode when the text "HDR" appears next +to the window size. + +.. image:: img/rendering_hdr_output_game_view.webp + +The number in parentheses next to the "HDR" text is the current :ref:`output max linear value` +which is described in the following sections. You can toggle the game's +:ref:`Window.hdr_output_requested` property in the game +window options menu: + +.. image:: img/rendering_hdr_output_game_window_options.webp + HDR output fundamentals ----------------------- Godot uses the `Extended Dynamic Range (EDR) `__ -paradigm for HDR output. While SDR -output allows color component values between ``0.0`` and ``1.0`` to be displayed, HDR output -allows values higher than ``1.0``. The maximum value that can be displayed is provided by -:ref:`Window.get_output_max_linear_value()` and +paradigm for HDR output. While SDR +output allows color component values between ``0.0`` and ``1.0`` to be displayed, HDR output +allows values higher than ``1.0``. The maximum value that can be displayed is provided by +:ref:`Window.get_output_max_linear_value()` and this method is valid when using SDR or HDR. .. image:: img/rendering_hdr_output_fundamentals.webp .. note:: - These graphs are presented as SDR images that do not contain any HDR color. To compensate for - this limitation, the grayscale bars along each axis have a glow effect applied to represent - values that are outside of the SDR range. The "output max value" in this graph represents the - maximum linear color component value returned by + These graphs are presented as SDR images that do not contain any HDR color. To compensate for + this limitation, the grayscale bars along each axis have a glow effect applied to represent + values that are outside of the SDR range. The "output max value" in this graph represents the + maximum linear color component value returned by :ref:`Window.get_output_max_linear_value()`. Designing for HDR output ------------------------ There are two primary approaches to make the most of HDR output: using the -:ref:`output max linear value` and using the -:ref:`class_WorldEnvironment` node. +:ref:`output max linear value` and using +tonemapping. -While both approaches can be used in the same project, the -:ref:`output max linear value` should generally -not be used in scenes that are affected by a :ref:`class_WorldEnvironment`. The -:ref:`Viewport.own_world_3d` property can be used to -separate which :ref:`Viewports` are affected by a :ref:`class_WorldEnvironment`. +While both approaches can be used in the same project, tonemapping should be used to produce HDR +output from a :ref:`Viewport` that uses lighting that exceeds the capabilities of an +SDR screen, indirect lighting, global illumination, emissive materials, post-processing effects, or +any other techniques that make use of the colors values in the scene. + +The :ref:`output max linear value` should only be +used to present colors directly to the screen without tonemapping and without influencing lighting, +post-processing effects, or surrounding color. This makes the +:ref:`output max linear value` well suited for +:ref:`CanvasItems` or unshaded materials in a scene that has no lighting or basic +lighting that otherwise does not exceed the capabilities of an SDR screen. + +The :ref:`Viewport.own_world_3d` property can be used to +separate which :ref:`Viewports` are affected by tonemapping and other +:ref:`class_WorldEnvironment` effects. Using output max linear value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In a traditional SDR-only game, the brightest presentation of a color is limited by either the -red, green, or blue component of the color reaching a maximum of ``1.0``. When using a modern HDR -screen this limitation no longer applies and color components above ``1.0`` can be accurately -presented. Godot provides the maximum color component value that can be presented by the screen -through the :ref:`output max linear value`. This -value can be used in both SDR and HDR, which makes it easy to build your game for both output +In a traditional SDR-only game, the brightest presentation of a color is limited by either the +red, green, or blue component of the color reaching a maximum of ``1.0``. When using a modern HDR +screen this limitation no longer applies and color components above ``1.0`` can be accurately +presented. Godot provides the maximum color component value that can be presented by the screen +through the :ref:`output max linear value`. This +value can be used in both SDR and HDR, which makes it easy to build your game for both output modes without needing to change behavior based on whether or not HDR output is enabled. -The :ref:`output max linear value` may change -often as the player adjusts their device brightness, enables or disables HDR output on their -device, or moves the game window between screens, so it's important to retrieve this value every -frame. The value will always equal ``1.0`` in SDR mode and may also equal ``1.0`` when HDR output +The :ref:`output max linear value` may change +often as the player adjusts their device brightness, enables or disables HDR output on their +device, or moves the game window between screens, so it's important to retrieve this value every +frame or use the :ref:`output max linear value changed` +signal. The value will always equal ``1.0`` in SDR mode and may also equal ``1.0`` when HDR output is enabled and the player has adjusted their screen to its maximum brightness. It is best to use this :ref:`output max linear value` -with "highlights" and special effects that -are either brief or involve a small portion of the screen; if the majority of the screen is -presented at this maximum brightness for more than a short time, it will cause the game to appear -uncomfortably bright, as if the game is ignoring the device brightness setting. You may also find -that some effects look best when limited to a maximum linear value that is greater than ``1.0``, -but less than the :ref:`output max linear value`. +with "highlights" and special effects that +are either brief or involve a small portion of the screen; if the majority of the screen is +presented at this maximum brightness for more than a short time, it will cause the game to appear +uncomfortably bright, as if the game is ignoring the device brightness setting. You may also find +that some effects look best when limited to a maximum linear value that is greater than ``1.0``, +but less than the :ref:`output max linear value`. You can read more about how it is sometimes desirable to limit the maximum HDR value in the `HDR and User Interfaces `__ post of the Android Developers Blog. -Transforming a color to be the brightest the screen can present can be done with a script. When -working with :ref:`class_CanvasItem`, it may be convenient to apply the resulting modified color -to the :ref:`modulate` or -:ref:`self_modulate` property with the base color of the -:ref:`class_CanvasItem` set to :ref:`white`. The following script +Transforming a color to be the brightest the screen can present can be done with a script. When +working with :ref:`class_CanvasItem`, it may be convenient to apply the resulting modified color +to the :ref:`modulate` or +:ref:`self_modulate` property with the base color of the +:ref:`class_CanvasItem` set to :ref:`white`. The following script demonstrates this: .. tabs:: @@ -122,20 +160,29 @@ demonstrates this: @export_range(0, 20, 0.1, "or_less", "or_greater") var max_linear_value_limit: float = -1.0 - func _process(_delta: float) -> void: + func _enter_tree() -> void: + var window: Window = get_window() + window.output_max_linear_value_changed.connect(_on_output_max_linear_value_changed) + _on_output_max_linear_value_changed(window.get_output_max_linear_value()) + + + func _exit_tree() -> void: + get_window().output_max_linear_value_changed.disconnect(_on_output_max_linear_value_changed) + + + func _on_output_max_linear_value_changed(output_max_linear_value: float) -> void: # Adjust the brightness of color to be the brightest possible, regardless # of SDR or HDR output, but no brighter than max_linear_value_limit. - var max_linear_value = get_window().get_output_max_linear_value() if max_linear_value_limit >= 0.0: - max_linear_value = minf(max_linear_value, max_linear_value_limit) - self_modulate = normalize_color(sdr_self_modulate, max_linear_value) + output_max_linear_value = minf(output_max_linear_value, max_linear_value_limit) + self_modulate = normalize_color(sdr_self_modulate, output_max_linear_value) - func normalize_color(srgb_color, max_linear_value = 1.0): + func normalize_color(srgb_color, output_max_linear_value = 1.0): # Color must be linear-encoded to use math operations. var linear_color = srgb_color.srgb_to_linear() var max_rgb_value = maxf(linear_color.r, maxf(linear_color.g, linear_color.b)) - var brightness_scale = max_linear_value / max_rgb_value + var brightness_scale = output_max_linear_value / max_rgb_value linear_color *= brightness_scale # Undo changes to the alpha channel, which should not be modified. linear_color.a = srgb_color.a @@ -144,29 +191,30 @@ demonstrates this: return linear_color.linear_to_srgb() -Using a WorldEnvironment node -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Using Tonemapping +^^^^^^^^^^^^^^^^^ -To produce HDR output using a :ref:`class_WorldEnvironment`, your scenes will need color values -that exceed what an SDR screen can present, so it is important to use a tonemapper like -:ref:`Reinhard` or -:ref:`AgX` to handle display of bright scene values on -both SDR and HDR screens. +To produce HDR output without using the :ref:`output max linear value` +your scenes will need color values +that exceed what an SDR screen can present, so it is important to use a tonemapper like +:ref:`Reinhard` or +:ref:`AgX` to handle display of these bright scene +values on both SDR and HDR screens. **Tonemapping and HDR** -The primary role of a tonemapper is to reduce the dynamic range of a natural scene with a very -high dynamic range of brightness to a smaller dynamic range that can be presented on a screen. +The primary role of a tonemapper is to reduce the dynamic range of a natural scene with a very +high dynamic range of brightness to a smaller dynamic range that can be presented on a screen. Tonemappers in Godot use the :ref:`output max linear value` -to determine the output range that the screen is capable of presenting. For example, with the -:ref:`Reinhard` tonemapper in Godot, linear +to determine the output range that the screen is capable of presenting. For example, with the +:ref:`Reinhard` tonemapper in Godot, linear scene values in the range of ``0.0`` to :ref:`tonemap white` -are mapped to an output range of ``0.0`` to +are mapped to an output range of ``0.0`` to :ref:`output max linear value`. .. image:: img/rendering_hdr_output_sdr_tonemap.webp -With this approach, you can adjust :ref:`tonemap white` +With this approach, you can adjust :ref:`tonemap white` to be sure that any linear scene value below :ref:`tonemap white` will be shown without clipping. This ensures that details are not lost when presenting the image on a screen with a lower dynamic range than the original scene. @@ -178,47 +226,44 @@ is fixed at ``1.0``, this behavior is dynamic with HDR based on the capabilities .. image:: img/rendering_hdr_output_hdr_tonemap.webp -As shown in the graphs above, the -:ref:`Reinhard` tonemapper will behave the same +As shown in the graphs above, the +:ref:`Reinhard` tonemapper will behave the same as the :ref:`Linear` tonemapper when -:ref:`output max linear value` is equal to or higher than -:ref:`tonemap white`. This allows for accurate color -reproduction on HDR screens that are capable of reproducing the original brighter scene values. -When :ref:`output max linear value` has increased -to be higher than :ref:`tonemap white`, tonemap white +:ref:`output max linear value` is equal to or higher than +:ref:`tonemap white`. This allows for accurate color +reproduction on HDR screens that are capable of reproducing the original brighter scene values. +When :ref:`output max linear value` has increased +to be higher than :ref:`tonemap white`, tonemap white will be adjusted to match this output max linear value. -The :ref:`AgX` tonemapper behaves similar to -:ref:`Reinhard` in this way, but its -:ref:`tonemap white` is always multiplied by -:ref:`output max linear value`. The -:ref:`Linear` tonemapper applies no tonemapping at +The :ref:`AgX` tonemapper behaves similar to +:ref:`Reinhard` in this way, but its +:ref:`tonemap white` is always multiplied by +:ref:`output max linear value`. The +:ref:`Linear` tonemapper applies no tonemapping at all; its :ref:`tonemap white` equals -:ref:`output max linear value` in all scenarios. The -:ref:`Filmic` and +:ref:`output max linear value` in all scenarios. The +:ref:`Filmic` and :ref:`ACES` tonemappers ignore -:ref:`output max linear value` entirely and always produce an +:ref:`output max linear value` entirely and always produce an image in the SDR range. -Mixing output max linear value and the WorldEnvironment node -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Why not mix output max linear value with other techniques? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The :ref:`output max linear value` should -generally not be used in scenes that are affected by a :ref:`class_WorldEnvironment`. This is -because a number of effects of :ref:`Environment` expect stable scene values -that do not change based on the screen capabilities. For example, the strength of the glow effect -is directly influenced by the brightness of the scene. If the scene brightness changes based on -:ref:`output max linear value`, then the glow +Tonemapping, indirect lighting, global illumination, and post-processing effects all depend on +stable scene color values to produce consistent and predictable results in both SDR and HDR modes. +If a developer uses these types of techniques with a scene that has color values that change based +on :ref:`output max linear value`, the results will +no longer be similar for screens with different capabilities. + +For example, the strength of the glow effect +is directly influenced by the brightness of the scene. If the scene brightness changes based on +:ref:`output max linear value`, then the glow strength will change as well: a larger :ref:`output max linear value` will produce a stronger glow effect, which is generally an undesirable behavior. -An exception to this rule is to change the -:ref:`background mode` through a :ref:`class_WorldEnvironment` with a -:ref:`Linear` tonemapper because the -:ref:`Linear` tonemap mode disables tonemapping and -background rendering is not affected by the brightness of scene values. - Absolute luminance values ------------------------- @@ -228,12 +273,12 @@ is calculated based on the reference white luminance and the maximum luminance o Reference white luminance ^^^^^^^^^^^^^^^^^^^^^^^^^ -The reference white luminance, or reference luminance for short, represents the brightest possible -SDR white value. When a user changes the brightness setting of the device that is producing the -video signal, such as a desktop computer, laptop, or smartphone, they are simply adjusting their -reference luminance. On a smartphone this change may happen automatically via the smartphone's -automatic screen brightness feature and also happens when the user manually adjusts their screen -brightness. On desktop or laptop computers, there are different ways to adjust this reference +The reference white luminance, or reference luminance for short, represents the brightest possible +SDR white value. When a user changes the brightness setting of the device that is producing the +video signal, such as a desktop computer, laptop, or smartphone, they are simply adjusting their +reference luminance. On a smartphone this change may happen automatically via the smartphone's +automatic screen brightness feature and also happens when the user manually adjusts their screen +brightness. On desktop or laptop computers, there are different ways to adjust this reference luminance depending on the operating system. This value is typically around 100 to 300 nits and is always represented by an @@ -243,41 +288,41 @@ This value may also be referred to as "paper white" or the "SDR white level". Maximum luminance ^^^^^^^^^^^^^^^^^ -The maximum luminance is a property of an HDR screen. This value may be anywhere from 250 to 2,000 +The maximum luminance is a property of an HDR screen. This value may be anywhere from 250 to 2,000 nits or beyond. -Although this value is a property of the screen hardware and is expected to not change, some -devices dynamically adapt this value to work within the constraints of the platform. For example, -the reported maximum luminance of Windows laptops with built-in HDR screens will change as the -user adjusts their laptop screen brightness while the reported reference luminance remains +Although this value is a property of the screen hardware and is expected to not change, some +devices dynamically adapt this value to work within the constraints of the platform. For example, +the reported maximum luminance of Windows laptops with built-in HDR screens will change as the +user adjusts their laptop screen brightness while the reported reference luminance remains constant. Output max linear value in practice ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When in HDR mode, the :ref:`output max linear value` -will increase as the user decreases their -reference luminance because more HDR headroom becomes available. Similarly, as the user increases +will increase as the user decreases their +reference luminance because more HDR headroom becomes available. Similarly, as the user increases their reference luminance, they will have less HDR headroom available and -:ref:`output max linear value` will decrease. In some cases when using +:ref:`output max linear value` will decrease. In some cases when using HDR mode with the highest reference luminance, -:ref:`output max linear value` will equal ``1.0``, matching SDR behavior, +:ref:`output max linear value` will equal ``1.0``, matching SDR behavior, because no HDR headroom is available. Not all screens are equal ------------------------- -SDR standards were designed to match the capabilities of existing screens that were commonly used -around the world. HDR standards have been intentionally written with the opposite approach: they +SDR standards were designed to match the capabilities of existing screens that were commonly used +around the world. HDR standards have been intentionally written with the opposite approach: they are designed to utilize the capabilities of an ideal screen that is not yet widely available. -In practice, this means that common HDR screens may perform their own internal tonemapping, gamut -mapping, or dynamic tonemapping (DTM) to support content that extends to a wider gamut and -luminance range than what the physical hardware can achieve. Some screens are not capable of -presenting very bright color values that fill more than a small (1% to 10%) portion of the -screen and will dim the entire image or part of the image temporarily when this happens. These -features may produce colors that are not representative of other screens so it's best to disable -them, if possible, when developing your HDR game. You may be able to disable some or all of these -features by enabling the HGiG mode on your screen or setting the screen's mode to "clip" and/or -"stable". Some HDR screens may present dark or saturated colors differently than others; this +In practice, this means that common HDR screens may perform their own internal tonemapping, gamut +mapping, or dynamic tonemapping (DTM) to support content that extends to a wider gamut and +luminance range than what the physical hardware can achieve. Some screens are not capable of +presenting very bright color values that fill more than a small (1% to 10%) portion of the +screen and will dim the entire image or part of the image temporarily when this happens. These +features may produce colors that are not representative of other screens so it's best to disable +them, if possible, when developing your HDR game. You may be able to disable some or all of these +features by enabling the HGiG mode on your screen or setting the screen's mode to "clip" and/or +"stable". Some HDR screens may present dark or saturated colors differently than others; this difference in appearance is often the result of the screen technologies. diff --git a/tutorials/rendering/img/rendering_hdr_output_game_view.webp b/tutorials/rendering/img/rendering_hdr_output_game_view.webp new file mode 100644 index 0000000000000000000000000000000000000000..40faa1b7b12b4432cc08ff5d90bacc653a788d13 GIT binary patch literal 5830 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 QVr5qW5C8=M0000007q*rng9R* literal 0 HcmV?d00001 diff --git a/tutorials/rendering/img/rendering_hdr_output_game_window_options.webp b/tutorials/rendering/img/rendering_hdr_output_game_window_options.webp new file mode 100644 index 0000000000000000000000000000000000000000..50f41f86c11f1917602f360d2ea574dbc7202e25 GIT binary patch literal 10674 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 literal 0 HcmV?d00001