2023-07-02(更新)

【UE5】FBXインポートでラフネス等が正しく反映されない【検証】

BlenderからUEへFBX経由でエクスポートした場合、ラフネスやメタルネスが正しく反映されないので検証した。

Article Image
使用ソフトウェアバージョン備考
Unreal Engine5.2.1

2023/07/02:「まとめ」「プラグインで対応できる?」の項目を追加。

この記事で分かること

BlenderからFBXでエクスポートを行いUnreal Engine(以下UE)でインポートすると、ラフネス等が正しく設定されない。

何がダメなのか、どうすれば良いのかを検証する。

また、透明マテリアルについても検証した。

「分かること」と書いたが、結局なんもわからなかったので注意。

先に結論

どうやらノードの接続先がUEに読み込んだ際に次のように書き換えられているようだ。

  • ラフネス > メタルネス
  • スペキュラー > ラフネス

検証方法

Blenderにて次のように上から順番に数字を入れたテクスチャをマテリアルに挿していく。

番号のテクスチャを入れたblender画面

これをFBXで出力してUnreal Engineでどう読み込まれるのかをテストする。

全25ソケットに番号の画像を接続した。

注意点:受け付けるのはTextureのみ

念のため書いておくが、FBX等に出力するときは必ず画像テクスチャのノードだけを使用する。

演算などのノード互換性がなくFBXで扱えないため。

これはFBXに限ったことではなく、汎用的なファイルで出力する場合は基本的にすべてこうなる。

意外に初心者が知らないケースなので覚えておきたい。

UEで読み込んだ結果

では、実際に読み込んでみよう。

次のようになった。

組み替えられたノード

この画像から分かるようにUEで読み込んだ際に接続先が変わってしまっている。

  • ラフネス > メタルネス
  • スペキュラー > ラフネス

このようにFBXで出力するとつながる先のノードが変わってしまう。

これがFBXを読み込んだ時におかしくなる原因だ。

ただ、ベースカラーとエミッションは正しく設定されている。

ノーマルだけ特殊

別途調査したところノーマルだけ特殊扱いだということがわかった。

上の例からわかるようにテクスチャノードをそのまま繋いでもUEでは認識されないが、次のようなノードを組むとノーマルも正しく引き渡しされていた。

ノーマルを繋いだ例

灰色の線は灰色の線で繋がないと効果がない?

上のノーマルで気づいたかもしれないが、ソケットの色違いを入力してしまっているのがダメな可能性もあるので検証した。

次のように灰色には灰色のノードを接続して検証(灰色はアルファチャンネル単体が入っている)

灰色を繋いだ

結果を言えば何も変わらなかった。

これは関係ないようだ。

この他は読み込みすらされない

Blender側では上から順に25枚のテクスチャを差したが、上の通り4枚しか読み込まれないようだ。

これに関してはFBXの仕様も大きく関わっているためBlenderやUEが悪いとは言い切れない。

ただ、後に解説するがアルファ画像に至っては読み込みすらできないのが致命的に思う。

FBXはアルファチャンネルを扱えるはず。

なぜこうなるのか?

海外のフォーラムを含めこれに関して丸一日調べたが全くもって納得の行く解答が得られなかった。

この問題は2年以上前から指摘されているため恐らく今後も対応することはないだろう。

結論:どうしたらいい?

残念ながら現時点ではインポート後に手動でノードを組み替えてやるほかない。

Blender側でスクリプトを書いてやるという手法も考えられるが、それでは元となるマテリアルを書き換えてしまう。

その回避のために複製してマテリアルを変換して...といった手続きを考えると手間が大きすぎる。

透過マテリアルの調査

透過マテリアルが正しく反映されない件についても調査した。

透過マテリアル?

つまりAlphaのテクスチャが送られていないことを調査。

私が作ったものではない配布FBXによっては正しく送れるものがあるため。

Translucent

Blenderで作成したデータは全てこれがOpaque(不透明)になってしまう。

マテリアルのBlend Modeを変えてもダメ

マテリアル設定のBlend Modeを変更し出力したが全てにおいてUE側でOpaque(不透明)で認識されてしまう。

Blend Mode外観

RGBAテクスチャを使ってもダメ

一部フォーラムにBlender側で読み込まれているテクスチャそのものにアルファチャンネルが入っているものが使われているとTranslucentの透明テクスチャとして認識されるとの報告有り。

しかしながら、透過されたテクスチャを入れたところでなんの変化もなかった。

Send to Unrealを使ってもダメ

UE公式が用意しているSend to Unrealというプラグインを利用してファイル化することなくダイレクトにUEに送ることができる。

こちらは単純なメッシュやデフォルトの設定のみで送る場合は非常に素早くデータを送ることが出来る。

ただ、残念ながら透過テクスチャは送ることができず、上のようにラフネスの問題も解消されていない。

恐らくベースにあるエクスポートプログラムは同じものだと思われる。

さらに、こちらに関しては頂点数が多いモデルを送ろうとするとエラーが出てしまい何度やっても解消できなかった(頂点数を減らすとなぜか通る)

またメッシュの結合(Combine Meshes)などのオプションをオンにしても機能しないため現時点ではFBXで出力したほうが高機能だと考える。

正しく認識するFBXをBlenderで読み込んでから出力してもダメ

正しく透過マテリアルとして認識するFBXが存在する。

これは私が作ったものではなく配布されているFBXを調査したときに見つけたもの。

それを一度Blenderで開いた後FBX化してUEで読み込むと結局不透明なマテリアルとして読み込まれてしまう。

恐らくBlenderのFBX出力そのものに問題があるのではないかと予想した。

USD, Alembic, Colladaなどもダメ

USD, Alembic, Collada等のファイル形式でも試したが、これらも全てダメ。

特にUSDは最新の形式だが、ボーンが入った物をスケルタルメッシュとしては読み込むことができない。

また複雑なマテリアル(1つのメッシュのなかに複数のマテリアル)も上手く渡せなかった。

FBX自体がUEの推奨であり、結局のところこれが一番正しくデータを扱えることがわかった。

透過テクスチャの結論:できません

以上のことから透過テクスチャを直接UEに投げることは私の検証範囲内では不可能だと結論付けた。

つまりFBXで読み込んだ後、UE側でマテリアルノードを手動で組んでやる必要あり。

プラグインで対応できる?(未検証)

Blenderの標準FBX出力は完全ではないとの記述があり、その解決策として次のプラグインが開発されている。

Better FBX Importer & Exporter - Blender Market

こちらは有料プラグインであり、これが使えるかどうかは検証していないため機会があれば試したい。

まとめ

BlenderからFBXを出力する場合、UE側では次のマテリアルに変換される。

Blender(出力元) Unreal Engine(出力先) 備考
Roughness Metallic
Specular Roughness
Base Color 正しく出力
Emission 正しく出力 Emission StrengthではなくEmissionの方
Normal 正しく出力(条件あり) Blender側でNormal Mapノード通すこと
Alpha Blender標準機能で出力不可 他のソフトなら出力可能(要調査)
その他 出力不可 Normalのようなケースがあるので要検証

Send to Unrealを使用しても制限は同様。

長い間放置されているので、今後対応される可能性は低い。

情報募集中

これに関して詳しい情報があればメッセージフォームから気軽に投稿していただければ幸いです。

匿名でも構いません。

メッセージフォーム | 謎の技術研究部

以上

調べて思ったのだが、このあたりのDCCツールからUEに持っていく系の記事があまりにも少ない。

おそらく個人クリエータークラスだと自分でモデリングしてゲームに持っていくというワークフローを経由している人口そのものが少ないのではないだろうか。

この記事自体があまり有用だとは思えないが、この現状を鑑みると少しでも同じ境遇のユーザーに役に立てるのではないかと思って記事を書いた。

今後も調査する。

なんもわかりません



この記事をシェア


謎の技術研究部 (謎技研)