Bindless Raytracing Advanced の例

この例では、バインドレスレンダリングとレイトレーシングを使用して、リアルタイム 3D シーンでレイトレーシングによる影と反射を生成する方法を示します。

要件

  • Vulkan 1.2 以降で、次のデバイス拡張機能が有効になっていること:

    • VK_KHR_acceleration_structure

    • VK_KHR_ray_query

    • VK_KHR_buffer_device_address

例の入手

この例を入手するには、Kanzi Studio Quick Start ウィンドウで Examples をクリックします。BindlessRaytracingAdvanced の例の横にある ダウンロード をクリックします。

Kanzi Studio は、例を <KanziWorkspace>/Examples/BindlessRaytracingAdvanced ディレクトリにダウンロードします。

例の内容

この例では、Kanzi で現在サポートされているレイトレーシングによるシャドウと反射の機能を紹介します。どちらの機能もバインドレスレンダリング機能を活用しています。シーン内の植物は、アルファを考慮した GBuffer とレイトレーシングを示しています。バインドレスにより、マスクされたジオメトリが GBuffer に正しく取り込まれ、個別のレンダーパスを必要とせずにシャドウレイと反射レイに反映されます。提供されているシェーダーは PBR 互換で、意図的に簡略化されています。

レイトレーシングまたはバインドレスを使用するプロジェクトのセットアップ

注釈

レイトレーシングとバインドレスレンダリングはエクスペリメンタル機能です。今後のリリースで変更または削除される可能性があります。

独自のプロジェクトでレイトレーシングまたはバインドレスレンダリングを有効にするには、次のようにします。

  1. プロジェクトを開き、メインメニューで Project > Properties を選択します。

  2. Properties で Preview カテゴリを展開し、Preview Graphics API Configuration を Vulkan に設定します。

    ../../_images/properties-preview.png
  3. Properties で Profile カテゴリを展開し、Target Graphics API を Vulkan 1.2 に設定します。

    ../../_images/properties-target-graphics-api.png

例を実行する

Kanzi Studio でこの例を開きます。ホスト GPU が上記の要件を満たしている場合、Preview はレイトレーシングによるシャドウと反射を使用してシーンをレンダリングします。

GPU またはドライバーが Vulkan 1.2 の要件を満たしていない場合、あるいはレイトレーシングをサポートしていない場合、Kanzi はサポートされていない機能をスキップします。

技術的な詳細

レンダーパスプレハブ

この例では、デフォルトのレンダーパスプレハブを拡張し、いくつかのパスを追加しています。

  • Build Acceleration Structure — シーンのジオメトリからボトムレベルおよびトップレベルのアクセラレーション構造を構築します。このパスは、レイクエリを発行する前に実行する必要があります。

  • Raytraced Shadows — 各 GBuffer フラグメントから特定の光源に向けてシャドウレイをトレースし、その結果をシャドウレンダーターゲットに書き込むコンピュートパスです。この例では、すぐに使える出発点として RaytracedShadowsMaterial コンピュートマテリアルを提供しています。その後、ライティングパスでシャドウテクスチャをサンプリングし、直接光の寄与を減衰させます。

  • Raytraced Reflections — GBuffer のサーフェス法線から反射レイをトレースして反射テクスチャをレンダリングするコンピュートパスです。生成されたテクスチャは、ラスタライズパスで最終イメージにブレンドできます。

レイトレーシングによるシャドウパスと反射パスはどちらも、レンダーパス階層内で Gather Lights レンダーパスの下 に配置する必要があります。これにより、両パスは Gather Lights が収集したライトデータにアクセスでき、シーン内のすべてのアクティブなライトについてシャドウと反射を正しく評価できます。

また、両パスの実行前に、GBuffer にデプス、法線、ラフネスのデータが格納されている必要があります。ベロシティはオプションで、シャドウのデノイザーに使用されます。この例ではバインドレスレンダリングを使用しているため、GBuffer はアルファを考慮します。植物のようなマスクされたジオメトリは GBuffer に正しく取り込まれ、シャドウレイと反射レイに反映されるため、アルファテストを行うジオメトリ用に個別のレンダーパスを用意しなくても正確なシルエットが得られます。

提供されているシェーダーは PBR 互換で、意図的に簡略化されています。プロジェクト固有のニーズに合わせて、大幅に最適化したり調整したりできます。

バインドレス

共通のバインドレスインフラストラクチャは <kanzi/bindless/common.glsl> にあります。このファイルは、これをインクルードするすべてのシェーダーで使用できる次の構造体とユーティリティを宣言しています。

  • kzGPUSceneMeshInfo — メッシュごとの頂点ストリーム (位置、法線、接線、UV、インデックス) のデバイスアドレス。

  • kzGPUSceneInstanceInfo — インスタンスごとのワールド/オブジェクト変換、インデックスオフセット、マテリアル ID とメッシュ ID。

  • kzGPUSceneInfo — メッシュ、インスタンス、マテリアルの情報配列へのトップレベルポインター。

  • kzGPUSceneTextures2D — マテリアル構造体に格納されたテクスチャ ID でインデックス付けされる、バインドレス 2D テクスチャ配列。

  • ヘルパー関数 fetchPosition、fetchNormal、fetchTangent、fetchUV — float32 と float16 の両方の頂点データを透過的に処理する型付きアクセサー。

実際の使用例については、この例の Shaders/ ディレクトリにあるシェーダー RaytracingUtils.glsl、GBufferVelocity.frag.glsl、RaytracedShadows.comp.glsl、RaytracedReflections.comp.glsl を参照してください。

kzGPUSceneMaterialInfo は BindlessMaterialDefinition.glsl 内のユーザー定義のシェーダー構造体で、プロジェクトに必要なマテリアルプロパティを含めるよう自由に変更できます。この構造体は、マテリアルごとのどのデータをバインドレスバッファーに格納するかを指定します。kzGPUSceneMaterialInfo のフィールド名は、対応するマテリアルプロパティ名と正確に一致する必要があります。名前が一致しない場合、バインドレスの更新でプロパティが見つからず、Kanzi はそのフィールドをゼロにします。現在、プロジェクトごとにサポートされる kzGPUSceneMaterialInfo の定義は 1 つだけです。