QRhiVulkanInitParams Struct
Vulkan 特定的初始化参数。更多内容...
| 标题: | #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 |
| 继承自: | QRhiInitParams |
公共变量
| QByteArrayList | deviceExtensions |
| QVulkanInstance * | inst |
| QWindow * | window |
静态公共成员
| QByteArrayList | preferredExtensionsForImportedDevice() |
| QByteArrayList | preferredInstanceExtensions() |
详细说明
注意:这是一个 兼容性保证有限的 RHI API,详情请参阅QRhi 。
基于 Vulkan 的QRhi 至少需要一个有效的QVulkanInstance 。用户需确保该对象可用且已初始化。通常在 main() 中进行初始化,类似于以下代码:
int main(int argc, char **argv)
{
...
QVulkanInstance inst;
inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); // for debugging only, not for release builds
inst.setExtensions(QRhiVulkanInitParams::preferredInstanceExtensions());
if (!inst.create())
qFatal("Vulkan not available");
...
}此示例在Vulkan验证层可用时启用它们,并启用QRhi 报告为推荐的实例级扩展(例如,VK_KHR_get_physical_device_properties2),前提是这些扩展在运行时受到Vulkan实现的支持。
前者是可选的,在开发阶段非常有用,QVulkanInstance 会将消息和警告方便地重定向到qDebug 。但请避免在生产构建中启用它。后者强烈推荐,对于确保某些功能正常工作至关重要(例如,QRhi::CustomInstanceStepRate )。
完成上述设置后,可通过传入该实例以及一个表面类型设置为QSurface::VulkanSurface 的QWindow ,来创建基于 Vulkan 的QRhi :
QRhiVulkanInitParams params;
params.inst = vulkanInstance;
params.window = window;
rhi = QRhi::create(QRhi::Vulkan, ¶ms);窗口是可选的,可以省略。但不建议这样做,因为这样在选择图形队列时就无法确保支持呈现操作。
注意:即使 指定了窗口,也可以为其他窗口创建QRhiSwapChain 对象,只要它们的QWindow::surfaceType() 均设置为QSurface::VulkanSurface 即可。
若要请求在 Vulkan 设备上启用其他扩展,请在deviceExtensions 中列出它们。这在与原生 Vulkan 渲染代码集成时可能相关。
预计在初始化 `QVulkanInstance` 之前,将通过调用静态函数 `preferredInstanceExtensions()` 来查询后端所需的实例扩展列表。返回的列表可以直接安全地传递给 `QVulkanInstance::setExtensions()`,因为系统会自动过滤掉不支持的扩展。 若未执行此操作,某些功能(例如QRhi::CustomInstanceStepRate )可能会被报告为不支持,即使系统上的 Vulkan 实现实际上支持相关功能。
要实现全部功能,当 API 1.1 可用时,QVulkanInstance 需要启用该版本。这意味着,每当QVulkanInstance::supportedApiVersion() 报告至少支持 Vulkan 1.1 时,就应使用 1.1 或更高版本调用QVulkanInstance::setApiVersion()。 若未执行此操作,某些功能(例如QRhi::RenderTo3DTextureSlice )可能会被报告为不支持,即使系统上的 Vulkan 实现支持 Vulkan 1.1 或更高版本。
与现有 Vulkan 设备配合使用
在与另一个图形引擎互操作时,可能需要获取一个使用相同 Vulkan 设备的 `QRhi ` 实例。这可以通过将指向 `QRhiVulkanNativeHandles ` 的指针传递给 `QRhi::create()` 来实现。
物理设备字段必须始终设置为非空值。如果仅需指定物理设备,而将 VkDevice 及队列创建的其余工作交由QRhi 处理,则无需在该结构体中填充其他成员。例如,在与 OpenXR 配合使用时即属于这种情况。
若要采用现有的VkDevice ,device 字段也必须设置为非空值。此外,还必须指定图形队列族索引。队列索引为可选,因为默认值 0 通常已足够。
此外,还可以可选地指定一个现有的命令池对象。同样可选的是,可以使用 vmemAllocator 让两个QRhi 实例共享同一个Vulkan 内存分配器。
QRhi 不拥有任何外部对象的所有权。
建议应用程序通过调用静态函数 `preferredExtensionsForImportedDevice()` 查询所需的设备扩展列表,并在 `VkDevice` 上启用这些扩展。否则,某些 `QRhi ` 功能可能无法使用。
成员函数文档
[static] QByteArrayList QRhiVulkanInitParams::preferredExtensionsForImportedDevice()
返回在使用外部创建的VkDevice 对象创建基于Vulkan的QRhi 时,VkDevice 上预期应启用的设备扩展列表。
[static] QByteArrayList QRhiVulkanInitParams::preferredInstanceExtensions()
返回预计将在用于基于Vulkan的QRhi 的QVulkanInstance 上启用的实例扩展列表。
由于不支持的扩展会被自动过滤掉,因此可以将返回的列表原样安全地传递给 `QVulkanInstance::setExtensions()`。
成员变量文档
QByteArrayList QRhiVulkanInitParams::deviceExtensions
可选,默认值为空。要启用的 Vulkan 设备扩展列表。不支持的扩展将被优雅地忽略。
QVulkanInstance *QRhiVulkanInitParams::inst
QVulkanInstance 已成功发布created ,这是必需的。
QWindow *QRhiVulkanInitParams::window
此项为可选,但在针对QWindow 时建议使用。
© 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.