QVulkanWindow 类
QVulkanWindow 类是 QWindow 类的便利子类,用于执行 Vulkan 渲染。 更多信息...
头文件 | #include <QVulkanWindow> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake | QT += gui |
继承 | QWindow |
公共类型
(自 6.7) | EnabledFeatures2Modifier |
EnabledFeaturesModifier | |
枚举 | 标志 { PersistentResources } |
标志 | 标志 |
QueueCreateInfoModifier |
公共函数
QVulkanWindow(QWindow *parent = nullptr) | |
虚拟的 | ~QVulkanWindow() |
QList<VkPhysicalDeviceProperties> | availablePhysicalDevices() |
QMatrix4x4 | clipCorrectionMatrix() |
VkFormat | 颜色格式() const |
int | 并发帧计数() const |
虚拟 QVulkanWindowRenderer * | createRenderer() |
VkCommandBuffer | 当前命令缓冲区() const |
int | 当前帧() const |
VkFramebuffer | 当前框架缓冲区() const |
int | 当前交换链图像索引() const |
VkRenderPass | 默认渲染通道() const |
VkFormat | 深度模板格式() const |
VkImage | 深度模板图像() const |
VkImageView | 深度模板图像视图() const |
VkDevice | 设备() const |
uint32_t | 设备本地内存索引() const |
QVulkanWindow::Flags | 标志() const |
void | frameReady() |
QImage | grab() |
VkCommandPool | 图形命令池() const |
VkQueue | 图形队列() const |
uint32_t | 图形队列家族索引() const |
uint32_t | 主机可见内存索引() const |
bool | 是否有效() const |
VkImage | MSAA 颜色图像(int idx) const |
VkImageView | MSAA 颜色图像视图(int idx) const |
VkPhysicalDevice | 物理设备() const |
const VkPhysicalDeviceProperties * | physicalDeviceProperties() const |
VkSampleCountFlagBits | sampleCountFlagBits() const |
void | setDeviceExtensions(const QByteArrayList &extensions) |
(自 6.7 版本起) void | setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier) |
(自 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) |
静态公共成员
const int | MAX_CONCURRENT_FRAME_COUNT |
详细描述
QVulkanWindow 是一个具有 Vulkan 功能的 QWindow,它管理一个 Vulkan 设备、一个图形队列、一个命令池和缓冲区、一个深度模板图像和一个双缓冲 FIFO 交换链,同时在处理事件如调整大小、没有同时支持图形和显示的设备队列的特殊情况、设备丢失的场景以及读取渲染内容回显等附加功能时,保持正确的行为。在概念上,它是 Vulkan 世界的 QOpenGLWindow 的对立面。
注意:QVulkanWindow 并不总是消除实现完全定制的 QWindow 子类的需要,因为在高级用例中,它可能不会足够。
QVulkanWindow 可以通过 QWidget 基于的用户界面嵌入 QWidget::createWindowContainer()。然而,这种方法有一些限制。首先确保研究 文档。
使用 QVulkanWindow 的典型应用程序可能看起来像以下这样
class VulkanRenderer : public QVulkanWindowRenderer { public: VulkanRenderer(QVulkanWindow *w) : m_window(w), m_devFuncs(nullptr) { } void initResources() override { m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device()); // .. } void initSwapChainResources() override { /* ... */ } void releaseSwapChainResources() override { /* ... */ } void releaseResources() override { /* ... */ } void startNextFrame() override { VkCommandBuffer cmdBuf = m_window->currentCommandBuffer(); // ... m_devFuncs->vkCmdBeginRenderPass(commandBuffer, renderPassBegin, contents); // ... m_window->frameReady(); } private: QVulkanWindow *m_window; QVulkanDeviceFunctions *m_devFuncs; }; class VulkanWindow : public QVulkanWindow { public: QVulkanWindowRenderer *createRenderer() override { return new VulkanRenderer(this); } }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QVulkanInstance inst; // enable the standard validation layers, when available 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(); return app.exec(); }
正如示例中所示,QVulkanWindow 使用的模式主要有
- QVulkanInstance 通过 QWindow::setVulkanInstance() 进行关联。然后可以从任何地方在任何线程上通过 QWindow::vulkanInstance() 获取。
- 类似于 QVulkanInstance,可以通过 supportedDeviceExtensions() 在实际初始化之前查询设备扩展。通过 setDeviceExtensions() 请求启用扩展。必须在窗口可见之前进行此类调用,也就是说,在调用 show() 或类似函数之前。对不受支持的扩展请求会优雅地忽略。
- 渲染器在QVulkanWindowRenderer子类中实现,该子类的实例是通过createRenderer() 工厂函数创建的。
- 通过QVulkanFunctions对象暴露了核心Vulkan命令,可以通过调用QVulkanInstance::functions() 获取。创建VkDevice后调用QVulkanInstance::deviceFunctions() 便可以获得设备层函数。
- 下一帧的绘制调用发生在QVulkanWindowRenderer::startNextFrame()。期望实现向currentCommandBuffer() 返回的命令缓冲区添加命令。函数返回并不表示命令已准备就绪提交。相反,需要显式调用frameReady()。这允许异步生成命令,可能在多个线程上。简单的实现将在其QVulkanWindowRenderer::startNextFrame() 的末尾调用 frameReady()。
- QVulkanWindow通过轻量级的getter函数公开了基本Vulkan资源(物理设备、图形队列、命令池、窗口的主命令缓冲区、图像格式等)。其中一些只是为了方便,应用始终可以直接通过Vulkan API直接查询、创建和管理额外的资源。
- 渲染器同窗口一样位于gui/main线程。然后该线程被限制到显示速率,类似于具有1个交换间隔的OpenGL的行为。然而,渲染器实现可以根据需要在任何方式上利用多个线程。可以从任何线程调用类似vulkanInstance(),currentCommandBuffer() 等的访问器。在gui/main线程上调用frameReady() 之后,才启动主命令缓冲区的提交、显示队列的排队以及构建下一帧。
- 窗口可见时,内容会自动更新。可以通过调用QWindow::requestUpdate() 请求进一步更新。为了持续渲染,在frameReady() 之后调用requestUpdate()。
为进行故障排除,启用日志分类qt.vulkan。关键错误通过qWarning() 自动打印。
OpenGL和Vulkan之间的坐标系差异
有两个值得注意的差异需要了解:首先,在Vulkan中截断空间中Y点向下在屏幕上,而OpenGL使用向上指向的Y轴。其次,标准的OpenGL投影矩阵假定近面和远面的值为-1和1,而Vulkan偏好为0和1。
为了帮助应用在无需翻转顶点数据中Y坐标的情况下从基于OpenGL的代码迁移,以及在使用QVulkanWindow时保持Vulkan视口的最小深度和最大深度设置为0和1的同时,允许使用QMatrix4x4函数如QMatrix4x4::perspective(),QVulkanWindow通过调用clipCorrectionMatrix() 获取一个修正矩阵。
多重采样
虽然默认禁用,但QVulkanWindow完全支持多重采样抗锯齿。额外颜色缓冲区(auto)和将它们解压到交换链非多重采样缓冲区的管理都是自动完成的。
要查询支持的样本数,请调用supportedSampleCounts()。当返回集合包含4,8,...时,将其中一个值传递给setSampleCount() 请求多采样渲染。
注意:与QSurfaceFormat::setSamples不同,支持采样的数量列表提前向应用程序公开,并且没有在setSampleCount()中自动降级到较低的采样数量。如果请求的值不受支持,则会显示警告,并且不会使用多采样。
读取图像
当supportsGrab()返回true时,QVulkanWindow可以从颜色缓冲区读取到QImage。语法grab()操作缓慢且效率低,应避免频繁使用。尽管如此,它仍然非常有价值,因为它允许应用程序捕获截图,或者工具和测试处理和验证GPU渲染输出。
支持sRGB
当涉及到swapchain图像格式时,虽然很多应用程序对QVulkanWindow的默认行为都很好,但setPreferredColorFormats()允许请求预定义的格式。这在sRGB颜色空间中特别有用。传递一个如VK_FORMAT_B8G8R8A8_SRGB
的格式将导致在可用时选择sRGB格式。
验证层
在应用程序开发过程中,启用Vulkan验证层可能非常有价值。如上图示例代码所示,在QVulkanInstance::create()之前,在QVulkanInstance上调用QVulkanInstance::setLayers()可以启用验证,前提是系统中的Vulkan驱动程序堆栈包含必要的层。
注意:请注意平台特定的差异。在桌面平台上,安装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。
另请参阅:QVulkanInstance和QWindow。
成员类型文档
[since 6.7]
QVulkanWindow::EnabledFeatures2Modifier
在图形初始化期间调用的一个函数,用于修改将要传递到VkDeviceCreateInfo结构中的VkPhysicalDeviceFeatures2。
默认情况下,QVulkanWindow启用了物理设备报告支持的所有的Vulkan 1.0核心特性,但有例外。特别是为了防止性能损耗,robustBufferAccess
始终是禁用的。
然而,当与Vulkan 1.1、1.2或1.3特性和扩展一起使用时,这通常是不够的。因此引入了这种回调机制。如果运行时只需要关注Vulkan 1.0,则请使用setEnabledFeaturesModifier()取而代之。
回调函数中通过sType
设置传递给VkPhysicalDeviceFeatures2引用,其余为零初始化。该函数必须根据需要更改成员或将pNext
链设置为其他合适的值。
注意:当设置pNext
链时,请确保所引用的对象有足够长的生命周期,例如,可以将其作为成员变量存储在QVulkanWindow子类中。
此typedef是在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
标志 QVulkanWindow::Flags
此枚举描述了可以传递给setFlags的标志。
常量 | 值 | 描述 |
---|---|---|
QVulkanWindow::PersistentResources | 0x01 | 确保当窗口变为不可见时不会释放任何图形资源。默认行为是在变为可见后重新释放一切,并稍后重新初始化。 |
Flags类型是QFlags<Flag>的typedef。它存储了Flag值的组合。
QVulkanWindow::QueueCreateInfoModifier
在图形初始化期间调用,用于添加应创建的其他队列。
如果渲染器需要除了默认的图形队列之外的其他队列(例如传输队列),则设置该标志。提供的队列族属性可用于选择额外队列的索引。渲染器可以在initResources()中请求实际的队列。
注意:当请求额外的图形队列时,Qt本身总是请求一个图形队列。你需要搜索queueCreateInfo以找到适当的条目,并将其操作以获取额外的队列。
成员函数文档
[显式]
QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
使用指定的parent构造一个新的QVulkanWindow。
表面类型设置为QSurface::VulkanSurface。
[虚函数 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()。
[虚拟]
QVulkanWindowRenderer *QVulkanWindow::createRenderer()
返回一个新的QVulkanWindowRenderer实例。
此虚拟函数在窗口的生命周期内调用一次,在窗口首次变得可见之后的一段时间。
默认实现返回null,因此除了清除缓冲区外,不会执行任何渲染。
窗口将拥有返回的渲染器对象。
VkCommandBuffer QVulkanWindow>::currentCommandBuffer() const
返回当前swap chain图像的活动命令缓冲区。期望QVulkanWindowRenderer::startNextFrame()的实现向此命令缓冲区添加命令。
注意: 此函数必须在frameReady()调用之前,在startNextFrame()内部调用。
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()]); // ... }
注意: 此函数必须在frameReady()调用之前,在startNextFrame()内部调用。
另请参阅 concurrentFrameCount()。
VkFramebuffer QVulkanWindow::currentFramebuffer() const
返回使用默认渲染通道的当前换链图像的 VkFramebuffer。
当不使用多重采样时,帧缓冲区有两个附加组件(颜色、深度-模板),当 sampleCountFlagBits() 大于 VK_SAMPLE_COUNT_1_BIT 时为三个(颜色解决、深度-模板、多重采样颜色)。渲染器必须考虑这一点,例如提供清空值。
注意:如果应用程序提供自己的渲染通道而不是使用从 defaultRenderPass() 返回的通道,则不必使用此帧缓冲区。
注意: 此函数必须在frameReady()调用之前,在startNextFrame()内部调用。
int QVulkanWindow::currentSwapChainImageIndex() const
返回当前换链图像索引,范围是 [0, swapChainImageCount() - 1]。
注意: 此函数必须在frameReady()调用之前,在startNextFrame()内部调用。
VkRenderPass QVulkanWindow::defaultRenderPass() const
返回一个典型的渲染通道,包含一个子通道。
注意:应用程序不必使用此渲染通道。然而,他们必须确保当前换链和深度-模板图像从 VK_IMAGE_LAYOUT_UNDEFINED 转换到 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 和 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,无论是通过应用程序的定制渲染通道还是其他方式。
注意:此渲染通道中没有启用模板读写。
注意: 从调用QVulkanWindowRenderer::initResources()到QVulkanWindowRenderer::releaseResources()期间调用此函数是有效的。
VkFormat QVulkanWindow::depthStencilFormat() const
返回用于深度-模板缓冲区(的)的格式。
注意: 从调用QVulkanWindowRenderer::initResources()到QVulkanWindowRenderer::releaseResources()期间调用此函数是有效的。
VkImage QVulkanWindow::depthStencilImage() const
返回深度-模板图像。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
VkImageView QVulkanWindow::depthStencilImageView() const
返回深度-模板图像视图。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
VkDevice QVulkanWindow::device() const
返回活动逻辑设备。
注意: 从调用QVulkanWindowRenderer::initResources()到QVulkanWindowRenderer::releaseResources()期间调用此函数是有效的。
uint32_t QVulkanWindow::deviceLocalMemoryIndex() const
返回一个适用于通用用途的设备本地内存类型索引。
注意: 从调用QVulkanWindowRenderer::initResources()到QVulkanWindowRenderer::releaseResources()期间调用此函数是有效的。
注意:无法保证此内存类型始终适用。特别是在设备本地图像的情况下,正确且相互独立的解决方案是手动选择内存类型,具体操作请查阅 vkGetImageMemoryRequirements 返回的掩码。
QVulkanWindow::Flags QVulkanWindow::flags() const
返回请求的标志。
另请参阅:setFlags。
[信号]
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() 回调)不应调用此函数。
注意:由于额外的阻塞读回,此函数可能会很昂贵。
注意:此函数当前要求交换链支持作为传输源的使用(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, swapChainImageCount() - 1] 内。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
VkImageView QVulkanWindow::msaaColorImageView(int idx) const
返回指定的多采样颜色图像视图,如果没有使用多采样,则返回 VK_NULL_HANDLE
。
idx 必须在范围 [0, swapChainImageCount() - 1] 内。
注意:从 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
的值返回当前采样计数。
当针对默认渲染目标时,VkPipelineMultisampleStateCreateInfo
的 rasterizationSamples
字段必须设置为这个值。
另请参阅:setSampleCount() 以及 supportedSampleCounts()。
void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)
设置要启用的设备扩展列表。
不支持扩展将被忽略。
交换链扩展将始终自动添加,无需将其包含在此列表中。
注意:此函数必须在窗口可见之前或在 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)
设置swapchain的首选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将创建一个多重采样颜色缓冲区,而不是简单地针对swapchain的图像。渲染到多重采样缓冲区的操作将在每个帧结束时将解算到非多重采样缓冲区。
要检查支持采样数的列表,请调用supportedSampleCounts。
在设置渲染管线时,请调用sampleCountFlagBits()以查询活动采样数作为VkSampleCountFlagBits
值。
注意:此函数必须在窗口可见之前或在 QVulkanWindowRenderer::preInitResources() 中最迟调用,之后调用将没有效果。
另请参阅:supportedSampleCounts()和sampleCountFlagBits。
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
返回由setPhysicalDeviceIndex()选择的物理设备创建的逻辑设备支持的扩展列表。
注意: 此函数可以在窗口变得可见之前调用。
QList<int> QVulkanWindow::supportedSampleCounts()
返回使用通过setPhysicalDeviceIndex()选择的物理设备时支持的采样数集合,作为一个排序列表。
默认情况下QVulkanWindow使用采样数为1。通过调用返回此函数的集合中的不同值(2、4、8、...)可以通过此函数请求多重采样抗锯齿。
注意: 此函数可以在窗口变得可见之前调用。
另请参阅:setSampleCount。
bool QVulkanWindow::supportsGrab() const
如果交换链支持用作传输源,返回 true,这意味着 grab() 是有效的。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
VkImage QVulkanWindow::swapChainImage(int idx) const
返回指定的交换链图像。
idx 必须在范围 [0, swapChainImageCount() - 1] 内。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
int QVulkanWindow::swapChainImageCount() const
返回交换链中的图像数量。
注意: 当提供自定义渲染传递和帧缓冲区时,访问此信息是必要的。帧缓冲区针对当前交换链图像是特定的,因此应用程序必须提供多个帧缓冲区。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
QSize QVulkanWindow::swapChainImageSize() const
返回交换链的图像大小。
这通常与窗口大小匹配,但在 vkGetPhysicalDeviceSurfaceCapabilitiesKHR
报告固定大小时也可能不同。
此外,在某些平台上观察到,在启用高 DPI 缩放时,Vulkan 报告的表面大小不同,这意味着与从 QWindow-报告的 size() 乘以 devicePixelRatio() 时比较,值可能比此处返回的值少 1 像素或多 1 像素,这可能是由于四舍五入的差异。渲染代码应该注意这一点,任何相关的渲染逻辑都必须基于此处返回的值,而不是基于 QWindow-报告的大小。无论理论上皮脂大小是否正确,Vulkan 渲染必须始终依赖于 Vulkan API 报告的表面大小。否则,可能会发生验证错误,例如在设置视口时,因为应用程序提供的值可能从 Vulkan 的角度来看超出范围。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
VkImageView QVulkanWindow::swapChainImageView(int idx) const
返回指定的交换链图像视图。
idx 必须在范围 [0, swapChainImageCount() - 1] 内。
注意:从 QVulkanWindowRenderer::initSwapChainResources() 的调用到 QVulkanWindowRenderer::releaseSwapChainResources() 的调用,调用此函数是有效的。
成员变量文档
const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT
此变量保留一个常量值,该值始终等于或大于 concurrentFrameCount 的最大值。
© 2024 Qt 公司有限。包含在此处的文档贡献的版权属于其各自的拥有者。本提供的文档是根据自由软件基金会的发布并由其 根据 GNU 自由文档许可证版本 1.3 许可的。Qt 和相应的商标是芬兰的 Qt 公司和/或世界其他地区的商标。所有其他商标均为其各自所有人的财产。