QRhiSwapChainHdrInfo 结构体

描述与 swapchain 相关输出的高动态范围信息。更多信息...

头文件 #include <QRhiSwapChainHdrInfo>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
自从Qt 6.6

公共类型

枚举LimitsType { LuminanceInNits, ColorComponentValue }
枚举LuminanceBehavior { SceneReferred, DisplayReferred }

公共变量

union QRhiSwapChainHdrInfo::(unnamed union at /data/snapshot-qt6-6.7-rel/qt5/qtbase/src/gui/rhi/qrhi.h:1499:5)limits
QRhiSwapChainHdrInfo::LimitsTypelimitsType
QRhiSwapChainHdrInfo::LuminanceBehaviorluminanceBehavior
floatsdrWhiteLevel

详细描述

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

但是也有一些问题:该信息在不同平台上以不同的形式公开,而随着跨平台图形 API 的出现,往往没有相关的解决方案,因为管理此类信息不在 API 的范围内(并且可能需要通过其他平台特定手段检索,如果有的话)。

在 macOS/iOS 的 Metal 上,平台 API 中没有公开亮度值。相反,提供了最大颜色分量值,在非 HDR 设置中为 1.0。`limitsType` 字段指示可用的信息类型。然后由 `QRhi` 的客户端负责从 `limits` 联合中访问正确的数据,并按需使用。

在像 Vulkan 这样的 API 中,无法获取此类信息,因此值始终是内置的默认值。

因此,从 `QRhiSwapChain::hdrInfo()` 返回的结构体包含某些硬编码的默认值或从诸如 DXGI (IDXGIOutput6) 或 Cocoa (NSScreen) 之类的 API 收到的真实值。当没有平台查询可用(或需要使用 `QRhi` 范围之外的平台设施)时,硬编码的默认值是 1000 尼特的最大亮度和一个 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尼特,但将根据屏幕亮度而变化)。这是HDR启用窗口在Apple平台上的行为。有关Apple的EDR系统的更多信息,请参阅此页面

成员变量文档

union QRhiSwapChainHdrInfo::(unnamed union at /data/snapshot-qt6-6.7-rel/qt5/qtbase/src/gui/rhi/qrhi.h:1499:5) QRhiSwapChainHdrInfo::limits

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

尼特值亮度

struct {
    float minLuminance;
    float maxLuminance;
} luminanceInNits;

在Windows上,最小和最大亮度取决于屏幕亮度。虽然在桌面上不相关,但在笔记本电脑上,屏幕亮度可能会随时改变。增加亮度意味着最大亮度降低。此外,结果还可能取决于Windows设置中系统/显示/HDR视图内设置的HDR内容亮度(如果设置了此类设置)。

但是请注意,在应用程序运行时更改笔记本电脑屏幕的亮度或在系统设置中做出的更改不必一定反映在返回的值中,这意味着再次调用hdrInfo()仍可能在整个进程生命周期的其余时间里返回之前相同的亮度范围。确切行为取决于DXGI,Qt无法控制。

注意: Windows合成器为HDR内容在场景引用模式下工作。颜色组件值为1.0对应80尼特亮度。当渲染非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上,这是nit的动态SDR白场亮度。该值取决于屏幕亮度(在笔记本电脑上),以及Windows设置中的系统/显示/HDR视图中的SDR或HDR内容亮度设置。

为了对非HDR(SDR)内容进行白场校正,例如2D UI元素,当luminanceBehaviorSceneReferred时,将最终颜色乘以sdrWhiteLevel / 80.0。(假设Windows和线性扩展sRGB(scRGB)颜色空间)

在其他平台上,该值始终是一个预定义的值,200。这个值可能与系统的实际SDR白场亮度不匹配,但当luminanceBehaviorDisplayReferred时,此变量的值在实际情况中并不重要,因为此时颜色分量的1.0值默认是指SDR白场。

也请参阅:luminanceBehavior

© 2024 Qt公司有限公司。本文档贡献的版权属于其各自的所有者。本文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款提供的。Qt及其相关标志是芬兰和/或其他国家的Qt公司商标。所有其他商标均为其各自所有者的财产。