2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unreal Engine (UE)Advent Calendar 2024

Day 24

[UE5] Bindless Resourcesを試してみる

Last updated at Posted at 2024-12-24

はじめに

この記事はUnreal Engine (UE) Advent Calendar 2024 シリーズ1 12/24(火)としての投稿です

当日夜に枠見てみたら「おっ空いてんじゃーん」ということで書いてみました。

UE5.5でBindless Resourcesの対応プラットフォームが拡充されたということでBindless Texture(Texture Collection)を試してみます。

Bindless Resourcesについて

Bindless ResourcesはBindless Renderingの機能の一つです。
大量のテクスチャをマテリアル内で動的に切り替えて使用したりできるようになります。

説明があまりないのでChatGPTに聞いてみました

Unreal Engine 5(UE5)におけるバインドレスリソース(Bindless Resources)は、シェーダー内でリソースをより柔軟かつ効率的にアクセスするための機能です。従来のスロットベースのバインディングモデルでは、各リソース(テクスチャやバッファなど)を個別にバインドする必要がありましたが、バインドレスリソースを使用すると、これらのリソースを事前に大規模なテーブルとしてGPUに提供し、シェーダー内でインデックスを使用して動的にアクセスできます。

ですね。

設定

まず設定を変更してBindless ResourcesとBindless Sampersを有効化しておきます。
プロジェクト設定からは変更できないため直接 Config\DefaultEngine.ini に以下の記述追加してください。

Config\DefaultEngine.ini
[PCD3D_SM6]
BindlessResources=Enabled
BindlessSamplers=Enabled

99_config.png

ちなみに以下みたいな記述だとマテリアル作業中にエディタがハングしたので Enabled で記述する必要があります。
BindlessResources=1
BindlessSamplers=1

TextureCollectionデータアセット

Bindless Resourcesでテクスチャのインデクスアクセスを行う場合、TextureCollectionデータアセットを作りそこに登録しておく必要があります。

データアセットの作成を選択し、インスタンスクラスは Texture Collection を選んで「選択」
作成されたデータアセットにテクスチャを登録してください。

00_data_asset.png
01_data_asset.png
02_data_asset.png
10_textures.png

マテリアル

マテリアルノード

主に使用するマテリアルノードは以下になります。

  • TextureCollectionParameter
  • TextureObjectFromCollection
  • BindlessSwitch

20_material_node.png

名前から大体察していただけると思うので説明は省きます。

マテリアル例

機能を確認するためのマテリアルを組んでみました。
IdTextureの内容でTextureCollectionの中から使用するテクスチャを動的選択する内容です。

30_material.png

補足説明しますと

  • TextureCollectionParameterにTextureCollectionデータアセットを設定してください
    • マテリアルインスタンスで差し替え可能
  • TextureObjectFromCollectionのCollectionIndex入力へはFloatToUIntなどを挟んでInt化する必要があります
    • Int化しないと接続できません
  • TextureObjectFromCollection出力を入力したTextureSampleは Sampler Source をSheredのどれか使用するように変更が必要です

使用用途

主な用途としては今までTexture2DArrayでないと出来なかったテクスチャのインデクス選択の置き換えだと思います。
Texture2DArrayだと複数テクスチャのどれか1枚でも差し替えた別セットを持とうとすると、他も重複して複製するする必要がありメモリを圧迫しました。Bindless Resourcesならピンポイントで差し替えしつつインデクスアクセスを実現できるためメモリ効率が向上します。

ソレイユさんの講演などでもあったスマートマテリアルが扱いやすくなると思います。

後期

GDCでのUE4やUE5タイトルのセッション内でBindless Textureを自前対応したという話がちょくちょく出てきていました。公式の対応広がって手が出しやすくなったと思います。

あと、実はNanite描画内で自動的にスマートマテリアルみたいにDraw Callをまとめる仕組みが入っているらしいと聞いたのでそれも確認しておきたいですね。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?