4.24今回はVirtualTexturingについて紹介したいと思います。※※注意※※VirtualTexturingはバージョン4.23から入ってきた機能で、現在ベータ版です。VirtualTexturingを使うことそのものが処理負荷軽減にはならない可能性があります。・VirtualTexturingの種類についてVirtualTexturingには2種類あります。それぞれの利点や使い方について触れていきたいと思います。・StreamingVirtualTexturing(以下SVT)・RuntimeVirtualTexturing(以下RVT)・StreamingVirtualTexturingについてこの手法が効果的なものは、ライトマップなど、どうしてもテクスチャサイズが大きくなってしまうものや、巨大なオブジェクトに対して高解像度なテクスチャを適用しているときなどに効果的です。現状のmipmapの方法だと、オブジェクトに対して近い状態だと、そのオブジェクトが画面の1部分にしか描画されていなくても、高解像度のテクスチャ全体が読み込まれてしまいます。それに対し、SVTでは表示されている部分にあった解像度のテクスチャがストリーミングされます。下の画像はSVTが適用されている状態です。適用されているテクスチャの解像度が1つのオブジェクトの中で変化しています。メッシュがカメラに近い部分ほどグリッドが細かく分割されている(高い解像度が使われている)のが確認できます。このボックスに貼られているSVTはすべてのmipmapがタイル状に分割されていて、必要な部分だけロードしています。Supportにチェックを入れます。Streamingのチェックを有効にします。設定が適用できるとテクスチャのサムネイルに『VT』の文字が付きます。Streamingが有効になります。4Kサイズ以上になると自動的にVTになるようです。SVTによってUDIMにも対応することができます。※ベータ版のためか、かなり挙動が怪しいです。テクスチャリインポートではほぼ確実にエディタが落ちてしまいました。UDIMテクスチャはテクスチャが同じ階層内に下記のように連番で名前がつけられていると自動的にUDIM・VirtualTexturing化されます。BaseName.####.[サポート画像形式]テクスチャを上記の命名規則に従ってサイズ違いで4枚、以下の用に用意しました。UDIM用テクスチャのうちどれか1枚を選択すると同階層にあるテクスチャも自動的に読み込んでくれます。UE4に読みこんだテクスチャは以下の様に複数のテクスチャが1枚にまとめられています。Mayaで以下のようなUV配置をしたオブジェクトを用意しました。そのオブジェクトにインポートしたテクスチャを適用すると2つ目の画像になります。0~1のUV領域を超えてちゃんとマッピングされています。読み込み時にテクスチャサイズが異なるものが入っていると、以下の画像のように勝手にタイリングされてしまう場合があります。タイリングはプロジェクトを開き直すと正しくなるようです。(それでも治らない場合はNoMipmapに変更してプロジェクトを開き直したりすると正しくなるかもしれません...)他にもStreamingのボーダーが正しく可視化されない場合があったりと、使用にはかなり注意しなければいけないかもしれません。・RuntimeVirtualTexturingについてRVTは前述したSVTと異なり、テクスチャ単体の仕組みではなく、シェーディングキャッシュのようなものになっています。マテリアルで使用しているテクスチャをそのままを使うのではなく、そのマテリアルを使用してブレンドした結果をテクスチャとしてキャッシュしている状態になっています。そのテクスチャをSVTと同様、すべてのmipmapがタイル化され、サンプリングする際に解像度などを加味してくれています。(mipmapをどこまで含めるかは設定で変更できます。)以下のランドスケープマテリアルをRVT化してみます。マテリアルの状態ビューポートの状態RVTしたものをRendererDocでどのようなテクスチャを読んでいるのか確認したのが以下の画像になります。マテリアルで使用している複数のテクスチャが使用状況に応じた1枚のテクスチャに合成されています。そのテクスチャがSVTのようにタイルに分割され、必要な解像度にあわせたmipmapが呼び出されています。RVTは、ランドスケープなどの様にテクスチャを複数使ったりする複数なマテリアルなどのレンダリングに向いています。このRVTは実質的にシェーディングキャッシュのため、フレームごとの更新では無いそうです。そのため、動くメッシュには向いていません。MovableMeshではなくても、頂点シェーダで動いているようなStaticMeshも不向きなものに該当します。軸の負方向への垂直投影するような形でテクスチャをメッシュに反映しています。RVTを適用する手順を見ていきます。Supportが有効になっている必要があります。本記事ではRVT化するアセットはLandscapeアクタをベースにしています。SVTを有効にするにはテクスチャのオプションを有効にするだけでしたが、RVTでは設定をもたせるアセットの作成、マテリアルの作成、適用範囲を決めるボリュームアクタの配置など、いくつか手順が必要になってきます。順に説明していきたいと思います。いうアセットを作成します。アセットとします)このアセット内でRVTの設定を変更することができます。設定の内容についてはこちらをご参照ください。https://dq8iqaixvew1d.cloudfront.net/ja/Engine/Rendering/VirtualTexturing/Reference/index.htmlこの記事では作成時のデフォルトの設定で作業を進めます。アセットはマテリアル、ボリューム、RVTを適応したいアクタの合計3箇所に設定します。次に、RVT用のマテリアルを作成します。Sampleを追加します。https://dq8iqaixvew1d.cloudfront.net/ja/Engine/Rendering/VirtualTexturing/Runtime/QuickStart/index.html上記UE4ヘルプのクイックスタートではマテリアルをアトリビュート化しVirtualTextureFeatureSwitchノードに接続していますが、VirtualTextureFeatureSwitchノードはRVTがサポートされていないときに従来どおりのマテリアルを使用するように切り替えるスイッチャーです。この記事では省略させていただいてます。VirtualTextureFeatureSwitchノードや、他のRVTに関するマテリアルノードに関してはこちらをご参照ください。SampleノードにはどのRVTアセットを使用するかを割り当てておきます。マテリアルが作成できたら、RVTを割り当てるアクターを覆うようにRuntimeVirtualTextureVolumeを配置していきます。Boundsを押すと自動でアクタの形に合うようにボリュームを配置してくれます。この記事の作例の様に平らなもので行うとボリュームのZスケールが0になるので手動で調整します。アセットを設定する必要があります。Texturesの+ボタンを押してエレメントを作成して、そこにRVTアセットを設定します。以上の設定でLandscapeマテリアルをRuntimeVirtualTexturingにすることができていると思います。RuntimeVirtualTexturing化したものは他のものにテクスチャとして適応したり、逆にRuntimeVirtualTexturingに要素を追加することもできます。Sampleをマテリアルで使用すれば可能です。メッシュ形状のディテール追加に役立ちそうです。以下の画像はスフィアのマテリアルにRVTのカラーテクスチャに適用した場合です。Textureに書き込む先のRVTアセットを設定すると要素が書き込まれます。Textureになっている必要があります。メッシュをデカールのように扱うことができます。元のメッシュのマテリアルのノーマルやラフネスなども反映されています。Sampleからラフネスやノーマルの値を受け取っている必要があります。)長くなってしまいましたが、以上VirtualTexturingについての紹介でした。参考になれば幸いです。