本页内容

QRhiSwapChainHdrInfo Struct

描述了交换链相关输出的高动态范围相关信息。更多内容...

标题: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
自: Qt 6.6

公共类型

enum LimitsType { LuminanceInNits, ColorComponentValue }
enum LuminanceBehavior { SceneReferred, DisplayReferred }

公共变量

union QRhiSwapChainHdrInfo::(unnamed union) limits
QRhiSwapChainHdrInfo::LimitsType limitsType
QRhiSwapChainHdrInfo::LuminanceBehavior luminanceBehavior
float sdrWhiteLevel

详细说明

要执行目标范围不为 [0,1] 的 HDR 兼容色调映射,通常需要知道与 swapchain 窗口关联的显示器的最大亮度。 虽然这通常由用户配置(想想游戏中的亮度、伽马值和类似设置),但根据显示器本身报告的值设置默认值非常有用,从而提供了一个不错的起点。

然而,这里存在一些问题:不同平台以不同的形式公开这些信息,而跨平台图形 API 通常根本没有相关的解决方案,因为管理此类信息不在 API 的范围之内(如果有的话,可能需要通过其他特定于平台的方式来获取)。

在 macOS/iOS 上的 Metal 中,平台 API 并未公开亮度值。取而代之的是,它提供的是颜色分量的最大值(在非 HDR 设置下,该值为 1.0)。limitsType 字段指示了可用的信息类型。随后,QRhi 的客户端需从limits 联合体中获取正确数据,并根据需要加以利用。

对于Vulkan这类无法获取此类信息的API,这些值始终为内置默认值。

因此,QRhiSwapChain::hdrInfo() 返回的结构体要么包含一些硬编码的默认值,要么包含从 DXGI(IDXGIOutput6)或 Cocoa(NSScreen)等 API 接收到的实际值。 当无法进行平台查询(或需要使用超出QRhi 范围的平台功能)时,硬编码的默认值是最大亮度 1000 nits 和 SDR 白电平 200。

该结构体还公开了平台及其合成器的推定亮度行为,以指示在 HDR 颜色缓冲区中,颜色分量值为 1.0 时会被如何处理。在某些情况下,可能需要对与 HDR 内容合成在一起的非 HDR 内容进行颜色校正。 为此,在某些平台(如 Windows)上会从系统查询 SDR 白电平,并在此处提供该值。

注意:这是一个 兼容性保证有限的 RHI API,详情请参阅QRhi 。

另请参阅 QRhiSwapChain::hdrInfo()。

成员类型文档

enum QRhiSwapChainHdrInfo::LimitsType

常量值描述
QRhiSwapChainHdrInfo::LuminanceInNits0表示limits 联合体中的luminanceInNits 结构体已设置
QRhiSwapChainHdrInfo::ColorComponentValue1表示limits 联合体中的colorComponentValue 结构体已被设置

enum QRhiSwapChainHdrInfo::LuminanceBehavior

常数值说明
QRhiSwapChainHdrInfo::SceneReferred0表示将颜色值 1.0 解释为 80 尼特。这是启用 HDR 的窗口在 Windows 合成器中的行为。有关 Windows 上 HDR 的更多信息,请参阅此页面。
QRhiSwapChainHdrInfo::DisplayReferred1表示将颜色值 1.0 解释为 SDR 白色的值。(例如 200 尼特,但具体数值会因屏幕亮度而异)这是 Apple 平台上启用 HDR 的窗口的行为。有关 Apple EDR 系统的更多信息,请参阅此页面。

成员变量文档

union QRhiSwapChainHdrInfo::(unnamed union) QRhiSwapChainHdrInfo::limits

包含从图形 API 或平台查询到的实际值。数据类型由 `limitsType` 指定。因此,这是一个联合类型。目前有两种选项:

以尼特(nits)为单位的亮度值:

struct {
    float minLuminance;
    float maxLuminance;
} luminanceInNits;

在 Windows 系统中,亮度的最小值和最大值取决于屏幕亮度。虽然这对台式机无关紧要,但在笔记本电脑上,屏幕亮度可能会随时变化。 亮度增加意味着最大亮度会降低。此外,如果 Windows 设置中的“系统/显示/HDR”视图中存在“HDR 内容亮度”设置,结果也可能受其影响。

但请注意,在应用程序运行期间对笔记本电脑屏幕亮度或系统设置所做的更改,未必会反映在返回值中,这意味着在进程生命周期剩余时间内,再次调用 hdrInfo() 仍可能返回与之前相同的亮度范围。具体行为取决于 DXGI,Qt 无法控制这一点。

注意:Windows 合成器对 HDR 内容采用场景相关模式。颜色分量值为 1.0 对应 80 nits 的亮度。 在渲染非 HDR 内容(例如 2D UI 元素)时,通常需要对白色电平进行校正。(例如,输出片段颜色 (1, 1, 1) 可能会导致屏幕上显示的白色过于暗淡)参见sdrWhiteLevel 。

对于 macOS/iOS,提供了当前最大和潜在最大颜色分量值:

struct {
    float maxColorComponentValue;
    float maxPotentialColorComponentValue;
} colorComponentValue;

该值可能取决于屏幕亮度,对于笔记本电脑而言,这意味着如果在此期间亮度发生变化,则下次调用 hdrInfo() 时结果可能会改变。最大屏幕亮度对应的最大颜色值为 1.0。

注意:Apple 的 EDR 是基于显示器的。1.0 对应 SDR 白色的亮度级别(例如 200 尼特),其具体数值会根据屏幕亮度以及其他可能的设置而变化。 该亮度的确切数值,或显示器的最大亮度,均不会向应用程序公开。

注意:据 观察,在某些 macOS 系统上,颜色分量值在启动时并未立即设置为正确的大于 1 的值,但这些值往往会在第一个帧期间或之后发生变化。

另请参阅 QRhiSwapChain::hdrInfo()。

QRhiSwapChainHdrInfo::LimitsType QRhiSwapChainHdrInfo::limitsType

在 macOS/iOS 上的 Metal 中,平台 API 并未公开亮度值。取而代之的是,提供了颜色分量的最大值(在非 HDR 设置下为 1.0)。该值表明limits 中包含何种信息。

另请参阅 QRhiSwapChain::hdrInfo()。

QRhiSwapChainHdrInfo::LuminanceBehavior QRhiSwapChainHdrInfo::luminanceBehavior

描述了该平台在颜色值方面的预期行为。

另请参阅 sdrWhiteLevel 。

float QRhiSwapChainHdrInfo::sdrWhiteLevel

在 Windows 系统中,这是以尼特(nits)为单位的动态 SDR 白电平。该值取决于屏幕亮度(在笔记本电脑上),以及 Windows 设置中“系统/显示/HDR”视图下的 SDR 或 HDR 内容亮度设置。

若要对非HDR(SDR)内容(如2D用户界面元素)进行白电平校正,当luminanceBehavior 为SceneReferred 时,请将最终颜色值乘以sdrWhiteLevel / 80.0。(假设使用Windows系统及线性扩展sRGB(scRGB)色彩空间)

在其他平台上,该值始终为预定义值 200。这可能与系统的实际 SDR 白电平不符,但在luminanceBehavior 为DisplayReferred 时,该变量的值在实际应用中并不重要,因为此时颜色分量值为 1.0 默认即指 SDR 白电平。

另请参阅 luminanceBehavior 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.