QVulkanWindow Class
QVulkanWindow クラスは、Vulkan レンダリングを実行するためのQWindow の便利なサブクラスです。詳細...
ヘッダー | #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) |
静的パブリック・メンバー
const int | MAX_CONCURRENT_FRAME_COUNT |
詳細説明
QVulkanWindowは、Vulkanデバイス、グラフィックキュー、コマンドプールとバッファ、デプスステンシルイメージ、ダブルバッファFIFOスワップチェーンを管理するVulkan対応のQWindow 、リサイズのようなイベント、グラフィックとプレゼンテーションの両方をサポートするデバイスキューがないような特殊な状況、デバイスが失われたシナリオ、レンダリングされたコンテンツの読み取りのような追加機能に関して正しい動作を行います。概念的には、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(); }private: QVulkanWindow*m_window; QVulkanDeviceFunctions*m_devFuncs; };classVulkanWindow :publicQVulkanWindow {public: QVulkanWindowRenderer*createRenderer() override {return newVulkanRenderer(this); } };intmain(intargc, char *argv[]) { { app(argc, 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の主な使用パターンは以下の通りです:
- QVulkanInstance はQWindow::setVulkanInstance() で関連付けられます。QWindow::vulkanInstance は () を介して関連付けられ、 () を介してどこからでも、どのスレッドからでも取得可能です。
- QVulkanInstance と同様に、デバイスの拡張機能は、実際の初期化の前にsupportedDeviceExtensions() で問い合わせることができます。拡張機能を有効にするリクエストは、setDeviceExtensions() を使って行う。このような呼び出しは、ウィンドウが表示される前、つまりshow() や同様の関数を呼び出す前に行う必要がある。サポートされていない拡張機能のリクエストは、潔く無視される。
- レンダラーはQVulkanWindowRenderer サブクラスで実装され、そのインスタンスはcreateRenderer() ファクトリー関数で作成されます。
- コアVulkanコマンドは、QVulkanFunctions オブジェクトを介して公開され、QVulkanInstance::functions() を呼び出すことで取得できます。デバイスレベルの関数は、QVulkanInstance::deviceFunctions ()を呼び出してVkDeviceを作成した後に使用できます。
- 次のフレームの描画コールのビルドはQVulkanWindowRenderer::startNextFrame() で行われます。実装では、currentCommandBuffer ()から返されたコマンドバッファにコマンドを追加することが期待されます。この関数から戻っても、コマンドを送信する準備ができたことにはなりません。むしろ、frameReady ()を明示的に呼び出す必要がある。これにより、複数のスレッドでコマンドを非同期に生成できる。単純な実装では、QVulkanWindowRenderer::startNextFrame ()の最後にframeReady ()を呼び出すだけです。
- 基本的なVulkanリソース(物理デバイス、グラフィックキュー、コマンドプール、ウィンドウのメインコマンドバッファ、画像フォーマットなど)は、QVulkanWindow上で軽量なゲッター関数を介して公開されます。これらのいくつかは便宜的なものであり、アプリケーションは常に自由に、Vulkan API を介して直接追加のリソースを照会、作成、管理できます。
- レンダラーは、ウィンドウ自体のように、gui/メインスレッドに住んでいます。このスレッドは、スワップ間隔が1のOpenGLがどのように動作するかと同様に、プレゼンテーションレートにスロットルされます。しかし、レンダラーの実装は、適切と思われる方法で自由に複数のスレッドを利用することができる。vulkanInstance ()、currentCommandBuffer ()などのアクセサは、どのスレッドからでも呼び出すことができる。メインコマンドバッファの送信、プレゼントのキューイング、次のフレームの構築は、gui/メインスレッドでframeReady ()が呼び出されるまで開始されない。
- ウィンドウが表示されると、内容は自動的に更新される。さらなる更新は、QWindow::requestUpdate ()を呼び出すことで要求できる。連続的にレンダリングするには、frameReady() の後にrequestUpdate() を呼び出す。
トラブルシューティングを行うには、ロギング・カテゴリqt.vulkan
を有効にします。クリティカル・エラーは、qWarning() によって自動的に出力されます。
OpenGLとVulkanの座標系の違い
注意すべき2つの顕著な違いがあります:まず、VulkanのY軸はクリップ空間でスクリーンの下を指しますが、OpenGLは上向きのY軸を使用します。第二に、標準的なOpenGLの投影行列は、近平面と遠平面の値が-1と1であるのに対し、Vulkanは0と1を好みます。
頂点データでY座標を反転させることなく、アプリケーションがOpenGLベースのコードから移行できるようにするため、また、VulkanビューポートのminDepthとmaxDepthを0と1に設定したまま、QMatrix4x4::perspective ()のようなQMatrix4x4 関数を使用できるようにするため、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検証レイヤーを有効にすることは非常に有益です。上記のコード例に示すように、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() を使用してください。
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()も参照してください 。
enum QVulkanWindow::Flag
flags QVulkanWindow::Flags
この enum は、setFlags() に渡すことができるフラグを記述します。
定数 | 値 | 説明 |
---|---|---|
QVulkanWindow::PersistentResources | 0x01 | ウィンドウが非露出状態になったときに、グラフィックス リソースが解放されないようにします。デフォルトの動作は、すべてを解放し、再び見えるようになったときに後で再初期化することです。 |
Flags 型はQFlags<Flag> の typedef です。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()
OpenGLとVulkan間の座標系の違いを補正するために使用できるQMatrix4x4 。
この行列で投影行列を事前に乗算することで、アプリケーションはYが上を向いていると仮定し続けることができ、頂点Zの位置にそれ以上の補正を行わなくても、ビューポートのminDepthとmaxDepthをそれぞれ0と1に設定できます。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 の新しいインスタンスを返す。
この仮想関数はウィンドウの有効期間中に一度だけ呼び出されます。
デフォルトの実装では null を返すため、バッファのクリア以外にレンダリングは行われません。
ウィンドウは返されたレンダラー オブジェクトの所有権を持ちます。
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
デフォルトのレンダーパスを使用した現在の swapchain 画像の VkFramebuffer を返します。
フレームバッファは、マルチサンプリングが使用されていない場合、2つのアタッチメント(カラー、デプス-ステンシル)を持ち、sampleCountFlagBits ()がVK_SAMPLE_COUNT_1_BIT
より大きい場合、3つのアタッチメント(カラーリゾルブ、デプス-ステンシル、マルチサンプルカラー)を持ちます。 レンダラは、クリア値を提供する場合など、これを考慮する必要があります。
注意 : アプリケーションは、defaultRenderPass() から返されるレンダーパスを使用する代わりに、独自のレンダーパスを提供する場合、このフレームバッファを使用する必要はありません。
注意: この関数は、startNextFrame() 内からのみ呼び出す必要があり、非同期コマンド生成の場合は、frameReady() を呼び出すまで呼び出す必要があります。
defaultRenderPass()も参照してください 。
int QVulkanWindow::currentSwapChainImageIndex() const
0,swapChainImageCount() - 1] の範囲で、現在のスワップチェイン画像のインデックスを返す。
注意: この関数は、startNextFrame() 内からのみ呼び出す必要があり、非同期コマンド生成の場合は、frameReady() を呼び出すまで呼び出す必要があります。
VkRenderPass QVulkanWindow::defaultRenderPass() const
1つのサブパスを持つ典型的なレンダーパスを返します。
注: アプリケーションはこのレンダーパスを使用する必要はありません。ただし、アプリケーションのカスタムレンダーパスまたはその他の手段によって、現在のスワップチェーンとデプスステンシルイメージがVK_IMAGE_LAYOUT_UNDEFINED
からVK_IMAGE_LAYOUT_PRESENT_SRC_KHR
とVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
に確実に移行されるようにする責任があります。
注: このレンダーパスでは、ステンシルの読み取り/書き込みは有効になっていません。
注意 : この関数の呼び出しは、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効である。
currentFramebuffer()も参照のこと 。
VkFormat QVulkanWindow::depthStencilFormat() const
デプスステンシルバッファで使用されるフォーマットを返す。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() からQVulkanWindowRenderer::releaseResources() まで有効です。
VkImage QVulkanWindow::depthStencilImage() const
depth-stencil 画像を返す。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() からQVulkanWindowRenderer::releaseSwapChainResources() まで有効です。
VkImageView QVulkanWindow::depthStencilImageView() const
Depth-stencil 画像ビューを返す。
注意: この関数の呼び出しは、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()も参照 。
[signal]
void QVulkanWindow::frameGrabbed(const QImage &image)
このシグナルは、image の準備ができたときに発せられる。
void QVulkanWindow::frameReady()
この関数は、QVulkanWindowRenderer::startNextFrame ()実装の各呼び出しに応答して、正確に1回呼び出されなければならない。この関数が呼び出された時点で、currentCommandBuffer() を介して公開されているメインコマンドバッファには、必要なレンダリングコマンドがすべて追加されていなければなりません。
注: この関数は、QVulkanWindowRenderer の関数が呼び出され、QVulkanWindow インスタンスが存在する、gui/main スレッドからのみ呼び出されなければならない。
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を返します。
注意: 初期化は、ウィンドウが可視化された後の最初の expose イベントで発生します。
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
の値として返す。
デフォルトのレンダーターゲットをターゲットにする場合は、VkPipelineMultisampleStateCreateInfo
のrasterizationSamples
フィールドをこの値に設定する必要があります。
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 のリストは順番に並んでいる。最初のフォーマットがサポートされていない場合、2番目のフォーマットが考慮され、以下同様となる。リストのどの書式もサポートしていない場合、動作はデフォルトの場合と同じである。
初期化後に実際のフォーマットを問い合わせるには、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 を使用する。この関数が返すセットとは異なる値(2、4、8、...)を指定してsetSampleCount() を呼び出すことで、マルチサンプル・アンチエイリアシングを要求できる。
注意: この関数は、ウィンドウを表示する前に呼び出すことができる。
setSampleCount()も参照してください 。
bool QVulkanWindow::supportsGrab() const
swapchainが転送元としての使用をサポートしている場合、つまりgrab()が機能している場合、trueを返す。
注意: この関数の呼び出しは、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
スワップチェーンの画像サイズを返す。
これは通常ウィンドウのサイズと一致しますが、vkGetPhysicalDeviceSurfaceCapabilitiesKHR
が固定サイズを報告している場合は異なる場合があります。
さらに、いくつかのプラットフォームで、Vulkanで報告されるサーフェスサイズが、高DPIスケーリングがアクティブな場合に異なることが確認されています。つまり、QWindow-報告されるsize ()とdevicePixelRatio ()を乗算した値は、おそらく丸めの違いにより、ここから返される値と比較して、1ピクセル小さいか大きいということです。レンダリングコードはこのことを認識し、関連するレンダリングロジックは、QWindow-報告されたサイズではなく、ここから返された値に基づいていなければなりません。どのピクセルサイズが理論的に正しいかに関わらず、VulkanレンダリングはVulkan APIが報告したサーフェスサイズにのみ依存しなければなりません。そうでなければ、例えばビューポートを設定するときに、アプリケーションが提供した値がVulkanの観点からアウトオブバウンズになる可能性があるため、検証エラーが発生する可能性があります。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() まで有効です。
VkImageView QVulkanWindow::swapChainImageView(int idx) const
指定されたスワップチェーンイメージビューを返します。
idx は [0, () - 1] の範囲でなければならない。swapChainImageCount
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。
メンバ変数ドキュメント
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.