Hello Vulkanトライアングルの例

QVulkanWindow と Vulkan API を使用したレンダリングの基本を示します。

Hello Vulkan Triangle Exampleは、三角形をレンダリングするために、頂点シェーダとフラグメントシェーダを含むフルグラフィックスパイプラインを作成します。

スタートアップ

Vulkan を使用する各 Qt アプリケーションは、アプリケーションレベルの状態をカプセル化し、Vulkan ライブラリを初期化するVulkan instance を持つ必要があります。

QVulkanWindow は常にQVulkanInstance に関連付けられている必要があり、そのためこの例ではウィンドウの前にインスタンスの作成を行います。また、QVulkanInstance オブジェクトはウィンドウよりも長生きしなければなりません。

    QVulkanInstance inst;
    inst.setLayers({ "VK_LAYER_KHRONOS_validation" });
    if (!inst.create())
        qFatal("Failed to create Vulkan instance: %d", inst.errorCode());

この例では、サポートされている場合、検証レイヤーを有効にします。要求されたレイヤーが存在しない場合、リクエストは無視される。追加のレイヤーと拡張も同様に有効にできる。

    VulkanWindow w;
    w.setVulkanInstance(&inst);

    w.resize(1024, 768);
    w.show();

インスタンスの準備ができたら、いよいよウィンドウを作成する。w はスタック上に存在し、inst の後に宣言されることに注意してください。

QVulkanWindowサブクラス

QVulkanWindow にカスタム機能を追加するには、サブクラスを使用します。これはQOpenGLWindowQOpenGLWidget の既存のパターンを踏襲しています。ただし、QVulkanWindow は別のQVulkanWindowRenderer オブジェクトを使用しています。

QVulkanWindow サブクラスはファクトリー関数QVulkanWindow::createRenderer() を再実装します。これは単にQVulkanWindowRenderer サブクラスの新しいインスタンスを返すだけです。ウィンドウオブジェクトを介してさまざまなVulkanリソースにアクセスできるようにするため、コンストラクタを介してウィンドウへのポインタが渡され、格納されます。

class VulkanWindow : public QVulkanWindow
{
public:
    QVulkanWindowRenderer *createRenderer() override;
};

実際のレンダリング

QVulkanWindow サブクラスは、 ()の再実装で描画呼び出しをキューに入れます。完了したら、 ()をコールバックする必要がある。この例では、非同期コマンド生成がないため、frameReady() 呼び出しは startNextFrame() から直接行われます。継続的な更新を得るために、この例では、再描画をスケジュールするために、 ()を呼び出すだけです。QVulkanWindowRenderer::startNextFrame QVulkanWindow::frameReady QWindow::requestUpdate

また、この例では、マルチサンプル・アンチエイリアシングも示しています。この例では、QVulkanWindow::supportedSampleCounts ()によって報告されたサポートされているサンプル数に基づいて、8倍、4倍、またはマルチサンプリングなしのいずれかを選択します。一旦QVulkanWindow::setSamples()によって設定されると、QVulkanWindow 、残りの処理を行います。追加のマルチサンプルカラーバッファは自動的に作成され、スワップチェーンバッファへのリゾルビングは、各フレームのデフォルトのレンダーパスの終了時に実行されます。

例を実行する

Qt Creator からサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Example を参照してください。

サンプルプロジェクト @ code.qt.io

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。