Created on | Updated on
フォローする

VertexAnimationTextureを2のべき乗にして、UEに読み込む

VretexAnimationTextureに関しては下記をご確認ください。

Houdini Game Dev Tools:Vertex Animation Texture でPyroFXをUnrealEngineに

ここでの問題は、作成されるテクスチャが2のn乗にならないということです。
なぜテクスチャが2のn乗でなくてはいけないのか?

重要なのは、乗除算が常に2で行えることです。コンピューターは2の乗除算をほかの数で行うよりもはるかに高速に実行できます。たとえば高速フーリエ変換は、この結果を、次数Nが2の累乗のときに O(N log N) の計算量で得るアルゴリズムであり、テクスチャ計算でも同様の計算が行われます。
下記をあわせてご参照いただければ幸いです。

Wikipedia 「高速フーリエ変換」

実際のVertex Animation Textureの解像度は、指定したポリゴン数(Target Polycount)×3×フレーム数できまります。

指定したポリゴン数(Target Polycount))×=頂点数となり、各頂点のフレームでのPositionとノーマルの方向が楽譜のようにテクスチャに記述されます。

Vertex Animation Texture HDAは、Target Texture sizeを決めることができるので横は強制的に2のn乗にすることができますが、縦は上記の計算結果を横の解像度で除算したものになり、2のn乗を取得することが大変困難です。

例えば、前回のデータだと10,000ポリゴン×3×79で必要なピクセルは2,370,000となります。
これを横2048として実際にVertex Animation Textureツールを使用して作成された画像の縦は1185となります。

このままだと2のn乗ではありませんので、まず試したのはこの画像の2のn乗に足りない部分を黒で塗りつぶしたピクセルを追加し、とりあえず2のn乗にしてUEで適用してみるという方法です。

拡張子はEXRで、PosotionのアルファチャンネルにNormalをパックした場合は、アルファもきちんと用意します。

Houdiniで作成された解像度は2048×1185でした。上記をクリアするには2048にする必要があるので、下記のように修正しています。

元の2048*1185を使用していた場合は問題ありません。

これを拡張して2048*2048に設定した画像に置き換えます。
描画が壊れてしまいました。

ポリゴンが正しく描画されず壊れてしまいます。
理由はHoudiniで頂点位置をフレーム分計算したnum_framesが解像度変更によりずれが生じるからです。


UV ScrollでV方向のアニメーションを決めているこの部分でわかります。

ユーザーが数値を手動でいれるパラメーターはSpeedとnum_framesの2つ。
Speedはスクロール速度を決め、num_framesはHoudiniでシミュレーションしピクセルとして書き出したフレーム数。

Timeとspeedを乗算して現在の周期(0-1)を決定。
Fracで整数部分を切り捨てて、周期が0-1で繰り返すように設定。
その結果をnum_framesと乗算しフレーム数に変換。
上記の結果は小数の半端が出る可能性があるので整数に切り上げる。
さらにnum_framesで除算し、フレームをUV座標値に変換。

手動で入力するnum_framesとテクスチャが持っているピクセルがずれてしまいポリゴンの描画が壊れてしまっています。

ただこのnum_framesを計算してぴったりの値を入れることはこれまた困難です。

そこで下記を追加します。

original_Resという名前のScalar Paramter。Houdiniから出力したテクスチャ解像度を入力。
change_Resという名前のScalar Paramter。修正して2のn乗にしたテクスチャ解像度を入力。

original_resをchange_resで除算し、0-1で読み込んでいた部分をスケーリングし実際にデータが入っている部分のみを読み込むようにする。

これをVスクロールの中に追加します。

Saveしてマテリアルエディタを閉じ、Material Instanceを開きます。
追加したoriginal_resとchange_resを有効にして、数値を入力します。

これで2のn乗にテクスチャを拡張して読み込んでも正しく描画できるようになりました。

他にも方法があると思いますが、その中の1つとして考えていただければ幸いです。