Technology

Vulkan拡張でGPUリソースの参照情報をアプリが直接配置

この記事のポイント

  1. 実現したこと

    既存のシェーダーコードを変えずに、ディスクリプタヒープ内の参照情報を利用できる。

  2. 実現の仕組み

    アプリが確保したメモリーにディスクリプタを書き込み、描画時の値で参照範囲を選ぶ。

  3. 得られた結果

    公開サンプルでは、216個の小立方体に使う1296枚の面テクスチャを一回の描画で表示する。

  4. 従来との違い

    セットのレイアウト定義とプール割り当てを使う方式に、アプリが配置を管理するヒープ方式が加わった。

GPUディスクリプタヒープとシェーダー参照を介して、異なる面テクスチャの立方体群を描画する概念図
AI生成画像

VulkanのGPUリソース接続に、アプリがディスクリプタをメモリーへ直接配置する方式が加わった。拡張機能VK_EXT_descriptor_heapは、既存シェーダーへの対応付けも備え、ドライバーと解析ツールが対応する。

セットを介さずディスクリプタをヒープへ置く

ディスクリプタは、シェーダーが画像やバッファーなどのGPUリソースを参照するための情報だ。NVIDIAが対応を示したVulkan拡張VK_EXT_descriptor_heapでは、アプリが確保したメモリーにこの情報を書き込み、ヒープとして利用する。

従来のディスクリプタセット方式には、セットのレイアウト定義とプールからの割り当てが必要だった。先行するVK_EXT_descriptor_bufferでディスクリプタ用メモリーはアプリが管理できるようになったが、接続方式はセットに基づいていた。

ヒープの配置と参照範囲をアプリが管理

新方式では、リソース用とサンプラー用に別々のヒープを使う。一度に接続できるリソース用ヒープは一つで、アプリがメモリーの割り当てとディスクリプタの配置を担う。

既存のシェーダーがセット番号とバインディング番号を使っていても、ヒープ内のディスクリプタをそれらの番号へ対応付けられる。この対応付けによって、シェーダーコードを変更せずにヒープ方式へ移せる。

描画ごとの位置指定と配列からの選択

Push Index方式では、描画時に渡すプッシュデータの値がディスクリプタ位置のオフセットになる。同じシェーダーでも、描画ごとにヒープ内の異なる参照範囲を選べる。

Constant Offset方式は固定オフセットを起点とし、シェーダーが配列内のディスクリプタを選ぶ。NVIDIAの公開サンプルはこの方式を使い、216個の小立方体の各面に固有のテクスチャを割り当て、全体を一回のインスタンス描画で表示する。

ドライバーと解析ツールがヒープに対応

NVIDIAによると、ドライバー610以降がVK_EXT_descriptor_heapに対応する。描画処理からこの方式を利用するためのドライバー側の対応が用意された。

グラフィックス解析ツールのNsight Graphics 2026.2も、ディスクリプタヒープを使ったフレームの取得と参照状態の確認に対応する。既存のシェーダーリソース表示から、対応付けられたディスクリプタを調べられる。