QVulkanWindow Class

QVulkanWindow 类是QWindow 的一个方便子类,用于执行 Vulkan 渲染。更多

Header: #include <QVulkanWindow>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
继承: QWindow

公共类型

(since 6.7) EnabledFeatures2Modifier
EnabledFeaturesModifier
enum Flag { PersistentResources }
flags Flags
QueueCreateInfoModifier

公共函数

QVulkanWindow(QWindow *parent = nullptr)
virtual ~QVulkanWindow()
QList<VkPhysicalDeviceProperties> availablePhysicalDevices()
QMatrix4x4 clipCorrectionMatrix()
VkFormat colorFormat() const
int concurrentFrameCount() const
virtual QVulkanWindowRenderer *createRenderer()
VkCommandBuffer currentCommandBuffer() const
int currentFrame() const
VkFramebuffer currentFramebuffer() const
int currentSwapChainImageIndex() const
VkRenderPass defaultRenderPass() const
VkFormat depthStencilFormat() const
VkImage depthStencilImage() const
VkImageView depthStencilImageView() const
VkDevice device() const
uint32_t deviceLocalMemoryIndex() const
QVulkanWindow::Flags flags() const
void frameReady()
QImage grab()
VkCommandPool graphicsCommandPool() const
VkQueue graphicsQueue() const
uint32_t graphicsQueueFamilyIndex() const
uint32_t hostVisibleMemoryIndex() const
bool isValid() const
VkImage msaaColorImage(int idx) const
VkImageView msaaColorImageView(int idx) const
VkPhysicalDevice physicalDevice() const
const VkPhysicalDeviceProperties *physicalDeviceProperties() const
VkSampleCountFlagBits sampleCountFlagBits() const
void setDeviceExtensions(const QByteArrayList &extensions)
(since 6.7) void setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)
(since 6.7) void setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)
void setFlags(QVulkanWindow::Flags flags)
void setPhysicalDeviceIndex(int idx)
void setPreferredColorFormats(const QList<VkFormat> &formats)
void setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
void setSampleCount(int sampleCount)
QVulkanInfoVector<QVulkanExtension> supportedDeviceExtensions()
QList<int> supportedSampleCounts()
bool supportsGrab() const
VkImage swapChainImage(int idx) const
int swapChainImageCount() const
QSize swapChainImageSize() const
VkImageView swapChainImageView(int idx) const

信号

void frameGrabbed(const QImage &image)

静态公共成员

详细说明

QVulkanWindow 是一个支持 Vulkan 的QWindow ,用于管理一个 Vulkan 设备、一个图形队列、一个命令池和缓冲区、一个深度模版图像和一个双缓冲 FIFO swapchain,同时在涉及调整大小等事件、没有同时支持图形和演示的设备队列等特殊情况、设备丢失等情况以及回读渲染内容等附加功能时,确保行为正确。从概念上讲,它与 Vulkan 世界中的QOpenGLWindow 相对应。

注意: QVulkanWindow 并不总能消除实现完全自定义的QWindow 子类的需要,因为在高级用例中它并不一定足够。

QVulkanWindow 可通过QWidget::createWindowContainer() 嵌入到基于QWidget 的用户界面中。不过,这种方法有很多局限性。请务必先阅读documentation

使用 QVulkanWindow 的典型应用程序可能如下所示:

classVulkanRenderer :publicQVulkanWindowRenderer
{public: VulkanRenderer(QVulkanWindow*w) : m_window(w),m_devFuncs(nullptr) { }voidinitResources() override { m_devFuncs=  m_window->vulkanInstance()->deviceFunctions(m_window->device());// ...}voidinitSwapChainResources() override {/* ...*/}voidreleaseSwapChainResources() override {/* ...*/}voidreleaseResources() override {/* ...*/}voidstartNextFrame() override { VkCommandBuffer cmdBuf=  m_window->currentCommandBuffer();// ... m_devFuncs->vkCmdBeginRenderPass(commandBuffer,renderPassBegin,contents);// ... m_window->frameReady(); }privateQVulkanWindowm_window->frameReady(); } private:*m_windowQVulkanDeviceFunctions*m_devFuncs; };classVulkanWindow :publicQVulkanWindow
{public    QVulkanWindowRenderer*createRenderer() override {return newVulkanRenderer(this); } };intmain(intargc, char *argv[]) { QGuiApplicationapp(argc,argv);    QVulkanInstanceinst;// 在可用时启用标准验证层inst. setLayers({ "VK_LAYER_KHRONOS_validation"});if(!inst.create())        qFatal("Failed to create Vulkan instance: %d", inst.errorCode());

    VulkanWindow w; w.setVulkanInstance(&inst); w.showMaximized();returnapp.exec(); }

从示例中可以看出,QVulkanWindow 的主要使用模式如下:

要排除故障,请启用日志类别qt.vulkan 。重要错误将通过qWarning() 自动打印。

OpenGL 和 Vulkan 之间的坐标系差异

有两个值得注意的区别:首先,Vulkan 的 Y 轴在剪辑空间中指向屏幕下方,而 OpenGL 则使用向上的 Y 轴。其次,标准的 OpenGL 投影矩阵假定近平面和远平面的值为 -1 和 1,而 Vulkan 则倾向于 0 和 1。

为了帮助应用程序从基于 OpenGL 的代码中迁移,而无需翻转顶点数据中的 Y 坐标,并允许使用QMatrix4x4 函数(如QMatrix4x4::perspective() ),同时将 Vulkan 视口的 minDepth 和 maxDepth 设置为 0 和 1,QVulkanWindow 提供了一个校正矩阵,可通过调用clipCorrectionMatrix() 进行检索。

多重采样

QVulkanWindow 默认禁用多采样抗锯齿功能。额外的颜色缓冲区和解析到交换链的非多重采样缓冲区都是自动管理的。

要查询支持的样本数,请调用supportedSampleCounts() 。当返回的集合包含 4、8、...时,将其中一个值传递给setSampleCount() 即可请求多采样渲染。

注意: QSurfaceFormat::setSamples() 不同的是,支持的采样点数列表会提前提供给应用程序,在setSampleCount() 中不会自动回退到较低的采样点数。如果请求的值不被支持,系统将显示警告并不使用多采样。

回读图像

supportsGrab() 返回 true 时,QVulkanWindow 可以从颜色缓冲区向QImage 执行回读。grab() 是一种缓慢且低效的操作,因此应避免频繁使用。不过,它还是很有价值的,因为它允许应用程序截图,或使用工具和测试来处理和验证 GPU 渲染的输出。

支持 sRGB

当涉及到交换链图像格式时,虽然许多应用程序可以使用 QVulkanWindow 的默认行为,但setPreferredColorFormats() 允许请求预定义的格式。这在使用 sRGB 色彩空间时非常有用。传递格式(如VK_FORMAT_B8G8R8A8_SRGB )将导致选择可用的 sRGB 格式。

验证层

在应用程序开发过程中,启用 Vulkan 验证层是非常有价值的。如上面的示例代码所示,假设系统中的 Vulkan 驱动程序栈包含必要的层,那么在QVulkanInstance::create() 之前调用QVulkanInstance 上的QVulkanInstance::setLayers() 就能实现验证。

注意: 请注意特定平台的差异。在桌面平台上,安装Vulkan SDK通常就足够了。但是,以 Android 为例,它要求在部署应用程序的同时部署额外的共享库,并规定了不同的验证层名称列表。更多信息,请参阅Android Vulkan 开发页面

注意: QVulkanWindow 不会暴露设备层,因为自 Vulkan API 1.0.13 版以来,该功能已被弃用。

层、设备功能和扩展

要启用实例层,请在创建QVulkanInstance 之前调用QVulkanInstance::setLayers() 。要查询可用的实例层,请调用QVulkanInstance::supportedLayers() 。

要启用设备扩展,请在设置 QVulkanWindow 时尽早调用setDeviceExtensions() 。要查询可用的设备扩展,请调用supportedDeviceExtensions() 。

对于指定不支持的层或扩展,我们会从容应对:这不会导致实例或设备创建失败,但层或扩展请求会被忽略。

在设备功能方面,QVulkanWindow 会启用 vkGetPhysicalDeviceFeatures() 报告支持的所有 Vulkan 1.0 功能。作为例外,robustBufferAccess 永远不会启用。如果需要启用该功能,请使用下面描述的回调机制。

这并不总是可取的,在 Vulkan 1.1 及更高版本中可能不够充分。因此,通过setEnabledFeaturesModifier() 注册一个回调函数,也可以完全控制用于创建设备的 VkPhysicalDeviceFeatures。设置完成后,回调函数将被调用,从而更改 VkPhysicalDeviceFeatures 或 VkPhysicalDeviceFeatures2。

另请参阅 QVulkanInstanceQWindow

成员类型文档

[since 6.7] QVulkanWindow::EnabledFeatures2Modifier

在图形初始化过程中调用的函数,用于更改 VkDeviceCreateInfo 中的 VkPhysicalDeviceFeatures2。

默认情况下,QVulkanWindow 会启用物理设备报告支持的所有 Vulkan 1.0 核心功能,但有某些例外。在实际操作中,robustBufferAccess 始终处于禁用状态,以避免对性能造成意外影响。

不过,在使用 Vulkan 1.1、1.2 或 1.3 功能和扩展时,这并不总是足够的。因此,我们采用了这种回调机制。如果运行时只有 Vulkan 1.0 相关,请使用setEnabledFeaturesModifier() 代替。

传递给回调函数的 VkPhysicalDeviceFeatures2 引用已设置为sType ,但其余部分已清零。函数可将成员改为 true,或根据需要设置pNext 链。

注意: 在设置pNext 链时,请确保引用对象有足够长的生命周期,例如将其作为成员变量存储在QVulkanWindow 子类中。

该类型定义在 Qt 6.7 中引入。

另请参阅 setEnabledFeaturesModifier().

QVulkanWindow::EnabledFeaturesModifier

在图形初始化过程中调用的函数,用于更改创建 Vulkan 设备对象时传入的 VkPhysicalDeviceFeatures。

默认情况下,QVulkanWindow 会启用物理设备报告支持的所有 Vulkan 1.0 核心功能,但某些功能除外。在实际应用中,robustBufferAccess 始终处于禁用状态,以避免对性能造成意外影响。

在调用函数时,传入的 VkPhysicalDeviceFeatures 引用全部清零。函数可根据需要更改成员。

注: 要控制 Vulkan 1.1、1.2 或 1.3 功能,请使用EnabledFeatures2Modifier

另请参见 setEnabledFeaturesModifier().

枚举 QVulkanWindow::Flag
flags QVulkanWindow::Flags

该枚举描述了可传递给setFlags() 的标志。

常量说明
QVulkanWindow::PersistentResources0x01确保窗口未显示时不释放图形资源。默认行为是释放所有资源,并在再次可见时重新初始化。

Flags 类型是QFlags<Flag> 的类型定义。它存储 Flag 值的 OR 组合。

QVulkanWindow::QueueCreateInfoModifier

在图形初始化过程中调用的函数,用于添加应创建的附加队列。

如果渲染器需要除默认图形队列外的其他队列(如传输队列),则进行设置。所提供的队列族属性可用于选择附加队列的索引。随后,呈现器可在 initResources() 中请求实际队列。

注意: 请求附加图形队列时,Qt 本身始终会请求一个图形队列。您需要搜索 queueCreateInfo 中的相应条目,并对其进行操作以获取附加队列。

另请参阅 setQueueCreateInfoModifier().

成员函数文档

[explicit] QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)

使用给定的parent 构建一个新的 QVulkanWindow。

曲面类型设置为QSurface::VulkanSurface

[virtual noexcept] QVulkanWindow::~QVulkanWindow()

毁灭者

QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()

返回系统支持的物理设备的属性列表。

注意: 此函数可在窗口可见前调用。

QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()

返回一个QMatrix4x4 ,用于修正 OpenGL 和 Vulkan 之间的坐标系差异。

通过将投影矩阵与该矩阵进行预乘,应用程序可以继续假设 Y 轴向上,并将视口中的 minDepth 和 maxDepth 分别设置为 0 和 1,而无需对顶点 Z 位置进行任何进一步的修正。这样,OpenGL 应用程序中的几何图形就可以按原样使用,假定光栅化状态与 OpenGL 剔除和正面设置相匹配。

VkFormat QVulkanWindow::colorFormat() const

返回 swapchain 使用的颜色缓冲区格式。

注意: 调用此函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

另请参阅 setPreferredColorFormats()。

int QVulkanWindow::concurrentFrameCount() const

返回可能同时激活的帧数。

注: 该值在QVulkanWindow 的整个生命周期内保持不变。

    class Renderer {
        void startNextFrame();
        // ...

        VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
        QVulkanWindow *m_window = nullptr;
    };

    void Renderer::startNextFrame()
    {
        const int count = m_window->concurrentFrameCount();
        // for (int i = 0; i < count; ++i)
            // m_uniformBufInfo[i] = ...
        // ...
    }

另请参阅 currentFrame()。

[virtual] QVulkanWindowRenderer *QVulkanWindow::createRenderer()

返回QVulkanWindowRenderer 的新实例。

该虚拟函数在窗口的生命周期内调用一次,即在窗口首次可见后的某个时刻。

默认实现返回空值,因此除了清除缓冲区外,不会执行任何渲染操作。

窗口拥有返回的呈现器对象的所有权。

VkCommandBuffer QVulkanWindow::currentCommandBuffer() const

返回当前交换链映像的活动命令缓冲区。QVulkanWindowRenderer::startNextFrame() 的实现应向该命令缓冲区添加命令。

注意: 该函数只能在 startNextFrame() 中调用,在异步命令生成的情况下,直到调用frameReady() 之前都必须调用。

int QVulkanWindow::currentFrame() const

返回当前帧在 [0,concurrentFrameCount() - 1] 范围内的索引。

渲染器的实现必须确保统一数据和其他动态资源有多个副本,以防止帧 N 改变仍在运行的帧 N - 1、N - 2、... 所使用的数据。N -concurrentFrameCount() + 1。

为避免依赖动态数组大小,应用程序可在声明数组时使用MAX_CONCURRENT_FRAME_COUNT 。这样可以保证数组始终等于或大于concurrentFrameCount() 返回的值。然后就可以用该函数返回的值对此类数组进行索引。

    class Renderer {
        void startNextFrame();
        // ...

        VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
        QVulkanWindow *m_window = nullptr;
    };

    void Renderer::startNextFrame()
    {
        VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
        // ...
    }

注意: 该函数只能在 startNextFrame() 中调用,在异步命令生成的情况下,直到调用frameReady() 之前都必须调用。

另请参阅 concurrentFrameCount()。

VkFramebuffer QVulkanWindow::currentFramebuffer() const

使用默认渲染通道返回当前交换链图像的 VkFramebuffer。

当不使用多重采样时,帧缓冲有两个附件(颜色、深度模板);当sampleCountFlagBits() 大于VK_SAMPLE_COUNT_1_BIT 时,帧缓冲有三个附件(颜色解析、深度模板、多重采样颜色)。渲染器必须考虑到这一点,例如在提供清晰值时。

注: 如果应用程序提供了自己的渲染传递,而不是使用defaultRenderPass() 返回的传递,则应用程序无需使用此帧缓冲。

注: 该函数只能在 startNextFrame() 中调用,如果是异步命令生成,则在调用frameReady() 之前都必须调用。

另请参阅 defaultRenderPass()。

int QVulkanWindow::currentSwapChainImageIndex() const

返回当前交换链图像索引,范围为 [0,swapChainImageCount() - 1]。

注意: 该函数只能在 startNextFrame() 中调用,在异步命令生成的情况下,直到调用frameReady() 之前都必须调用。

VkRenderPass QVulkanWindow::defaultRenderPass() const

返回包含一个子通道的典型渲染通道。

注: 应用程序无需使用此呈现通道。不过,应用程序应负责确保当前交换链和深度钢网图像通过应用程序的自定义渲染传递或其他方式,从VK_IMAGE_LAYOUT_UNDEFINED 过渡到VK_IMAGE_LAYOUT_PRESENT_SRC_KHRVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL

注: 在此呈现传递中不启用模板读/写功能。

注: 调用此函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

另请参见 currentFramebuffer()。

VkFormat QVulkanWindow::depthStencilFormat() const

返回深度钢网缓冲区使用的格式。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

VkImage QVulkanWindow::depthStencilImage() const

返回深度模版图像。

VkImageView QVulkanWindow::depthStencilImageView() const

返回深度钢网图像视图。

VkDevice QVulkanWindow::device() const

返回活动逻辑设备。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

uint32_t QVulkanWindow::deviceLocalMemoryIndex() const

返回适合一般使用的设备本地内存类型索引。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

注意: 不保证该内存类型始终适用。正确的跨实现解决方案(尤其是对于设备本地图像)是在检查vkGetImageMemoryRequirements 返回的掩码后手动选择内存类型。

QVulkanWindow::Flags QVulkanWindow::flags() const

返回请求的标志。

另请参见 setFlags()。

[signal] void QVulkanWindow::frameGrabbed(const QImage &image)

image 准备就绪时会发出该信号。

void QVulkanWindow::frameReady()

每次调用QVulkanWindowRenderer::startNextFrame() 实现时,都必须准确调用该函数一次。在调用该函数时,通过currentCommandBuffer() 公开的主命令缓冲区必须已添加了所有必要的渲染命令,因为该函数将触发命令提交和当前命令排队。

注意: 该函数只能在 gui/main 线程中调用,因为QVulkanWindowRenderer 的函数在该线程中调用,QVulkanWindow 实例也在该线程中。

另请参阅 QVulkanWindowRenderer::startNextFrame() 。

QImage QVulkanWindow::grab()

构建并渲染下一帧图像,但不显示该帧,然后执行图像内容的阻塞回读。

如果渲染器的startNextFrame() 实现直接回调frameReady() ,则返回图像。否则,将返回一幅不完整的图像,图像大小正确,但尚未包含内容。在后一种情况下,内容将通过frameGrabbed() 信号传送。

返回的QImage 格式始终为QImage::Format_RGBA8888 。如果colorFormat() 为VK_FORMAT_B8G8R8A8_UNORM ,则会自动交换红色和蓝色通道,因为这种格式通常用作交换链颜色缓冲区的默认选择。对于任何其他颜色缓冲区格式,本函数都不会进行转换。

注意: 当帧正在运行时(即frameReady() 尚未被应用程序回调),不应调用此函数。

注意: 由于需要进行额外的阻塞回读,该函数可能会比较昂贵。

注意: 该函数目前要求 swapchain 支持作为传输源使用 (VK_IMAGE_USAGE_TRANSFER_SRC_BIT),否则会失败。

VkCommandPool QVulkanWindow::graphicsCommandPool() const

返回活动图形命令池。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

VkQueue QVulkanWindow::graphicsQueue() const

返回活动图形队列。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const

返回活动图形队列的族索引。

注意: 调用此函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。QVulkanWindowRenderer::updateQueueCreateInfo() 的实现也可以调用此函数。

uint32_t QVulkanWindow::hostVisibleMemoryIndex() const

返回适合一般使用的主机可见内存类型索引。

返回的内存类型既是主机可见的,也是连贯的。此外,如果可能,它还将被缓存。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

bool QVulkanWindow::isValid() const

如果该窗口已成功初始化所有 Vulkan 资源(包括交换链),则返回 true。

注意: 初始化发生在窗口可见后的第一次曝光事件中。

VkImage QVulkanWindow::msaaColorImage(int idx) const

返回指定的多采样彩色图像,如果不使用多采样,则返回VK_NULL_HANDLE

idx 必须在 [0, () - 1] 范围内。swapChainImageCount

注意: 调用此函数仅在调用QVulkanWindowRenderer::initSwapChainResources() 至QVulkanWindowRenderer::releaseSwapChainResources() 期间有效。

VkImageView QVulkanWindow::msaaColorImageView(int idx) const

返回指定的多采样彩色图像视图,如果不使用多采样,则返回VK_NULL_HANDLE

idx 必须在 [0, () - 1] 范围内。swapChainImageCount

注意: 调用此函数仅在调用QVulkanWindowRenderer::initSwapChainResources() 至QVulkanWindowRenderer::releaseSwapChainResources() 期间有效。

VkPhysicalDevice QVulkanWindow::physicalDevice() const

返回活动物理设备。

注意: 调用该函数仅在调用QVulkanWindowRenderer::preInitResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

const VkPhysicalDeviceProperties *QVulkanWindow::physicalDeviceProperties() const

返回指向活动物理设备属性的指针。

注意: 调用该函数仅在调用QVulkanWindowRenderer::preInitResources() 至QVulkanWindowRenderer::releaseResources() 期间有效。

VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const

VkSampleCountFlagBits 的形式返回当前样本数。

在使用默认呈现目标时,必须将VkPipelineMultisampleStateCreateInforasterizationSamples 字段设置为该值。

另请参阅 setSampleCount() 和supportedSampleCounts()。

void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)

设置要启用的设备extensions 列表。

不支持的扩展将被忽略。

swapchain 扩展名会自动添加,无需将其列入此列表。

注意: 必须在窗口可见之前或最迟在QVulkanWindowRenderer::preInitResources() 中调用此函数,之后调用则无效。

[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)

设置启用的设备功能修改函数modifier

注: 若要控制 Vulkan 1.1、1.2 或 1.3 功能,请使用重载函数EnabledFeatures2Modifier

注: modifier 传递给回调函数时,所有成员均设置为 false。函数可根据需要更改成员。

此函数在 Qt 6.7 中引入。

另请参阅 EnabledFeaturesModifier

[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)

设置启用的设备功能修改函数modifier

这是一个重载函数。

该函数在 Qt 6.7 中引入。

另请参阅 EnabledFeatures2Modifier

void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)

根据提供的flags 配置行为。

注意: 必须在窗口可见之前或最迟在QVulkanWindowRenderer::preInitResources() 中调用此函数,之后调用则无效。

另请参阅 flags()。

void QVulkanWindow::setPhysicalDeviceIndex(int idx)

请求使用索引为idx 的物理设备。索引与availablePhysicalDevices() 返回的列表相对应。

默认情况下使用第一个物理设备。

注意: 必须在窗口可见之前或最迟在QVulkanWindowRenderer::preInitResources() 中调用此函数,之后调用则无效。

void QVulkanWindow::setPreferredColorFormats(const QList<VkFormat> &formats)

设置交换链的首选formats

默认情况下不设置应用程序首选格式。在这种情况下,将使用表面的首选格式,如果没有,则使用VK_FORMAT_B8G8R8A8_UNORM

formats 中的列表是有序的。如果不支持第一种格式,将考虑第二种格式,依此类推。如果不支持列表中的任何格式,则行为与默认情况相同。

要在初始化后查询实际格式,请调用colorFormat() 。

注意: 必须在窗口可见之前或最迟在QVulkanWindowRenderer::preInitResources() 中调用该函数,如果在此之后调用则无效。

注: 如果需要,重新实现QVulkanWindowRenderer::preInitResources() 可以动态检查支持的格式列表。在那里,曲面可通过 QVulkanInstace::surfaceForWindow() 进行检索,而调用此函数仍可安全地影响初始化的后期阶段。

另请参阅 colorFormat()。

void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)

设置队列创建信息修改功能modifier

另请参见 QueueCreateInfoModifier

void QVulkanWindow::setSampleCount(int sampleCount)

要求使用给定的sampleCount 进行多采样抗锯齿处理。有效值为 1、2、4、8......直至物理设备支持的最大值。

当采样数大于 1 时,QVulkanWindow 将创建一个多采样色彩缓冲区,而不是简单地以交换链图像为目标。多采样缓冲区中的渲染将在每帧结束时解析到非多采样缓冲区中。

要查看支持的样本数列表,请调用supportedSampleCounts() 。

在设置渲染流水线时,调用sampleCountFlagBits() 以VkSampleCountFlagBits 值查询活动采样计数。

注意: 必须在窗口可见之前或最迟在QVulkanWindowRenderer::preInitResources() 中调用此函数,之后调用则无效。

另请参阅 supportedSampleCounts() 和sampleCountFlagBits()。

QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()

返回从setPhysicalDeviceIndex() 所选物理设备创建的逻辑设备所支持的扩展名列表。

注意: 此函数可在窗口可见之前调用。

QList<int> QVulkanWindow::supportedSampleCounts()

以排序列表形式返回使用setPhysicalDeviceIndex() 所选物理设备时支持的采样计数集。

默认情况下,QVulkanWindow 使用 1 的采样计数。调用setSampleCount() 时,可以使用与本函数返回值不同的值(2、4、8......)来请求多采样抗锯齿。

注意: 该函数可在窗口可见之前调用。

另请参阅 setSampleCount().

bool QVulkanWindow::supportsGrab() const

如果 swapchain 支持作为传输源使用,则返回 true,这意味着grab() 是有效的。

注意: 调用该函数仅在调用QVulkanWindowRenderer::initSwapChainResources() 至QVulkanWindowRenderer::releaseSwapChainResources() 期间有效。

VkImage QVulkanWindow::swapChainImage(int idx) const

返回指定的交换链映像。

idx 必须在 [0, () - 1] 范围内。swapChainImageCount

注意: 调用此函数仅在调用QVulkanWindowRenderer::initSwapChainResources() 至QVulkanWindowRenderer::releaseSwapChainResources() 期间有效。

int QVulkanWindow::swapChainImageCount() const

返回交换链中图像的数量。

注: 在提供自定义渲染传递和帧缓冲时,有必要访问该值。帧缓冲是当前交换链图像的特定缓冲,因此应用程序必须提供多个帧缓冲。

注: 调用此函数仅在调用QVulkanWindowRenderer::initSwapChainResources() 直至QVulkanWindowRenderer::releaseSwapChainResources() 期间有效。

QSize QVulkanWindow::swapChainImageSize() const

返回 swapchain 的图像大小。

这通常与窗口大小一致,但在vkGetPhysicalDeviceSurfaceCapabilitiesKHR 报告固定大小的情况下也可能不同。

此外,在某些平台上观察到,在激活高 DPI 缩放的情况下,Vulkan 报告的表面尺寸是不同的,这意味着QWindow 报告的size() 与devicePixelRatio() 相乘后的值与此处返回的值相比少或多 1 个像素,这可能是由于四舍五入的不同。渲染代码应注意这一点,任何相关的渲染逻辑都必须以此处返回的值为基础,而绝不能以QWindow 报告的尺寸为基础。无论理论上哪种像素尺寸是正确的,Vulkan 渲染都只能依赖 Vulkan API 报告的表面尺寸。否则可能会出现验证错误,例如在设置视口时,因为从 Vulkan 的角度来看,应用程序提供的值可能会超出边界。

注意: 调用此函数仅在调用QVulkanWindowRenderer::initSwapChainResources() 直至QVulkanWindowRenderer::releaseSwapChainResources() 期间有效。

VkImageView QVulkanWindow::swapChainImageView(int idx) const

返回指定的交换链图像视图。

idx 必须在 [0, () - 1] 范围内。swapChainImageCount

成员变量文档

const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT

该变量保存的常量值始终等于或大于concurrentFrameCount() 的最大值。

© 2025 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.