LoginSignup
4
5

More than 1 year has passed since last update.

【UE5】タイリングした連番テクスチャの切れ目を修正する

Last updated at Posted at 2023-03-19

概要

連番かつタイリング可能なテクスチャをUE5で再生するときに発生する、切れ目のようなアーティファクトを解決します。

こちらの記事を参考に実装しましたので、本記事は要約した日本語訳程度のものとなります。
https://shaderbits.com/blog/tiling-within-subuv-or-volume-textures

エンジンバージョンはUE5.1を使用しました。

問題点

連番タイリングテクスチャをUE5のFlipBookノードなどで再生すると、タイリングされているにもかかわらず端の方に切れ目が発生します。
seams.gif
テクスチャ上では隣にある次のフレームとのフィルタリングが行われてしまうのが原因のようです。

解決方法

これを回避するため、あらかじめ各フレームの端にタイリングされたピクセルを追加します。
要はフレームごとに少しだけ縮小させればいいだけです。

以下は解像度64x64の4フレームあるテクスチャの例です。
texel1.png
フレームごとにスケールして、余分なピクセルを持たせます。
texel2.png

テクスチャの作り方によって変化しますが、以下のような計算で縮小します。

スケール = (パディングテクセル + フレームテクセル) / フレームテクセル

解像度64x64Pixelの4フレーム(1フレーム16Pixel)であれば以下のようになります。

スケール = (パディングテクセル + 16) / 16

パディングに追加するテクセル数次第で綺麗にタイリングできるMip数が変わります。
片側のパディングテクセルが1の場合、1つ目のMipまで
片側のパディングテクセルが2の場合、2つ目のMipまで
片側のパディングテクセルが4の場合、3つ目のMipまで
といった感じで綺麗に処理できるMip数が増えていきますが、パディングテクセルに面積を奪われることになるため、増やすほど解像度が犠牲になっていきます。

この辺はお好みですが、3つ目のMipまでにしておくのが無難なようです。

UE5でのセットアップ

テクスチャ作成の際に縮小した分を、今度は拡大してあげる必要があります。
つまり先ほどとは逆の計算を行います。
スケール = フレームテクセル / (フレームテクセル + パディングテクセル)
スクリーンショット 2023-03-19 033320.png
更に中心からスケールを行うためにオフセット値をAddします。
オフセット = 0.5 * パディングテクセル * (1 / フレームテクセル )
スクリーンショット 2023-03-19 0333202.png

Mipはこのままだと正しく計算されない場合があるため、Texture SampleのMipValueModeをDerivativeモードに変更し、元のUVからDDX DDYで計算してあげます。
スクリーンショット 2023-03-19 145036.png

これでシームレスな連番再生が可能となりました。
seamless.gif

最終的なマテリアルグラフのサンプルを以下にアップしてあります。
4096x4096Pixel 8x8アニメーションの例です。
https://blueprintue.com/blueprint/3c1r7uwc/

参考

Tiling within subUV or pseudo-volume textures
https://shaderbits.com/blog/tiling-within-subuv-or-volume-textures

4
5
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
4
5