(約 6,300文字の記事です。)
マテリアルの見た目がBlenderとUnityとで違う。fbxでもglTFでもblendでもだめ。Unityのドキュメントとシェーダー関連の基礎知識を手に入れネット上をさまよったが「結論は無理」ということでした。
シェーダーが違えばマテリアルの構成に互換性など、あるはずがない!という車輪の再発明をしたのでした。(あとでシェーダーの知識を手に入れたら、そりゃまあそうだわな、というオチ。
対象読者はUnity初心者、Blenderユーザーです。
まずは結論を先に書くことにする。詳細は下のUnityのシェーダーに関するドキュメントを読めば正確な理解ができるのだが、今は例え話で簡単に書く。
更新履歴
2023/07/07 USD(Universal Scene Description)という手法(ワークフロー&ファイル形式)を使えば異なるツール間でもマテリアルの見た目の互換性を保てることが判明。時代は変わった。
2022/03/29 執筆。
マテリアルに互換性がない理由
【答え】シェーダーが違うから。
以上、なのだが、ここから牛丼に例えて話してみようと思う。
シェーダーとマテリアルの話を牛丼で例えて解説した人は私が初めてだろう(笑)
例えば牛丼を食べたいとしよう。これを「牛丼をディスプレイに表示させたい」ということにしよう。
牛丼のオーダーを受けて牛丼を作ってくれるのは牛丼屋さんの店員さんだ。店員さんのことをシェーダーと呼ぼう。シェーダーに注文を伝えるメッセージのことをマテリアルと呼ぼう。マテリアルは音声でもいいし文字でもいい。マテリアルで重要なのは「どんな品をいくつ、どういう注文内容で」というパラメーターなのだ。
3DCGの話にすると、何のマップ画像をどこに指定し、どの項目の数値がいくらで、という情報が重要。
例えば吉野家の場合、つまり吉野家シェーダーを使って牛丼をレンダリングしてみよう。吉野家には通常店舗以外にも特別に派生したいくつかの店舗(シェーダー)があるが、「つゆだく」「豚丼」「牛カルビ丼」というパラメーターはどの吉野家シェーダーでも通じるので牛丼が無事に画面に表示される。
ところが「つめしろ」「とろだく」というパラメーターは普通の吉野家シェーダーでは通用しないのでレンダリングできない。これらのパラメーターは吉野家築地シェーダーでのみ利用できるものだった。(閉店済み)
Unityにはたくさんの吉野家シェーダーがあるが、それぞれのシェーダーで使える/使えないパラメーターがあって、それは店舗(シェーダー)ごとに決められている。
吉野家シェーダー同士ですらそうなので、吉野家シェーダーと松屋シェーダーのように別会社同士の互換性は絶望的だ。松屋シェーダーでは「牛カルビ丼」というパラメーターは受け付けてもらえないし、そもそも松屋は食券制だ(笑)
ところが「つゆだく」は両者に通用する。なのでシェーダーが違っても「たまたま」共通するマテリアル要素は存在する。 例えばベースカラーマップ=ディフーズマップ、ノーマルマップはどのシェーダーでも使える、という具合に。
牛丼が欲しいだけなのに
なので、牛丼をディスプレイに表示させたいだけなのに、マテリアルというパラメーター伝達手段を利用しても、シェーダーに互換性がないので注文ができないのだ。
まとめると、
問い:BlenderとUnityのマテリアルに互換性がないのはなぜ?
答え:BlenderとUnityとでシェーダーが異なるから。
具体的に言うと、
- シェーダーが異なれば、マテリアルの内容が同じでもマテリアルを受け付けるシェーダーと受け付けないシェーダーがある。
- シェーダーはソフトごとに異なる(重要)
- なのでマテリアルが同じでもマテリアルを受け取ったソフトによってレンダリングできる場合とできない場合がある
ということ。これが答え。
(もし運良くレンダリングできたとしても、シェーダーのアルゴリズムが完全一致しない限り、レンダリング結果が同じになることはない。なので別ソフト同士で共通マテリアルで共通のレンダリング結果というのは現実的にあり得ない話だろう。業務提携しない限り。)
違いが分かる人は「似せる」ことはできるが
例えば「牛丼と牛めしはどう違うの?」という問いに対して「名前が違うだけで中身は一緒」ということが分かっている人は両店舗を利用できるが、BlenderとUnityにはそういう知恵(切り替え機能)がないので、ユーザーがそれぞれのマテリアルパラメータ要素に応じたパラメータや画像ファイルを手動で指定してあげる必要がある。そうすればほぼ互換になるが、それでも吉野家の味と松屋の牛丼の味は「似ているけれど細部は異なる」という結果になる。
似せることはできても完全一致はほぼ無理。
同様に、BlenderとUnityではシェーダーが違うので、同じマップを使っても出力結果が異なる。特にラフネスとスムーズネスではパラメーターの持つ意味が逆=パラメータの意味が異なる=同じマップを使ってもシェーダーに伝わる意味が変わるので、結果として両者では同じレンダリング結果にはならない。
だから最終的に吉野家の味が欲しいのか松屋の味が欲しいのかを決めて、それから各店舗にいる店員さん(シェーダー)にオーダーを伝えることになるわけだ。
なので、最終的に欲しい絵を出力してくれるソフトでマテリアルをセットアップすることになる。それ以外は作業途中のプレビュー用として「最終仕上げ」に近い質感に寄せる程度で留めておくことになるだろう。細部を詰めても無意味だ。
というわけで、BlenderとUnityのみならず、3DCGのほとんどのソフト間でマテリアルに互換性がない理由が分かったと思う。それぞれのシェーダーが異なる(=互換性がない)ことが原因だ。
互換性ある場合とは、恐らくソフト間で業務提携(フォーマットの統一)をしている場合くらいだろう。
以上でまとめ終了。
ここから下がUnity初心者の学習メモです。
マテリアルについて学ぶ
PBRマテリアルの基礎については学習済みなので前提知識は既にある。なのでUnity特有のマテリアルの設定方法や調整方法を知りしたい。Googleで調べればたくさん出てくるが、まずは公式ドキュメントで基礎の基礎を押さえることにする。
2018以外では日本語ドキュメントと英語ドキュメントとが一致していない。おそらく2018の日本語訳をそのまま2019~2021で使い回している感じなので素直に2018ドキュメントで学んだ方がいい。
シェーダー技術詳細
上記チュートリアルのシェーダー技術詳細がとても役に立つ。Unityにおけるテクスチャ、マテリアル、シェーダーの違いを端的に分かりやすく解説している。これには驚いた。Blenderではこういうスパッと一刀両断な解説を見たことがない。(知らないだけかも知れないが)
何をどう使い回しているのか、なぜ分けるのかの説明もコンパクトかつ分かりやすく解説されている。マテリアルとテクスチャの違い、使い分け方も同時に説明できている素晴らしさ。今まで自分がイマイチ分からなかったことが氷解した。
ただしシェーダーについての日本語訳はイマイチ意味が分からなかったので英語を読んだらスッキリ分かった。シェーダーは「レンダリング方法を決める機能」と、「シェーダーパラメーターという入力ボックス(インスペクターウィンドウで制御可能な項目)を定義する機能」の2つの機能を持っているということ。
そしてマテリアルは「どのシェーダーを選ぶかを設定できる機能」と、「シェーダーパラメーターに入れる値そのものを設定する機能」の2つの機能を持っているということ。
なので、シェーダーによって「必要な要素」というものが事前に決められていて、そのシェーダーでレンダリングさせるためには最低限その要素の値を設定したマテリアルを準備すればいい。そしてマテリアルには「どのシェーダーにどんな値を渡すべきか」を記入することになる。シェーダーが書式や入力高ものルール(入力フォーマット)を定めていて、マテリアルがそれらを全て有していれば、マテリアルがそのシェーダーを指名することで初めて画像としてレンダリングされるわけだ。
Unityのシェーダーについては上記解説だけではなくてこちらの動画を見たほうがより正確な理解ができると思う。
Unityではテクスチャマップ、マテリアル、シェーダーは明確に分かれている。ごちゃごちゃになる要素がない。Blenderの学習時のような「言葉の曖昧さ」がなくてスッキリしている。こういう所もUnityが好きな理由だ。公式チュートリアルで簡潔に明記している点も素晴らしい。
3DCG初心者はUnityから入ったほうが理解が早いかも
ZbrushやBlenderから入って「3DCGって面倒くせぇ」と思うくらいならば、ゲーム作りを楽しみながら3DCGの総合的な知識をUnityの良質な教科書から吸収したほうが上達が早いと感じた。
ドキュメントの次のページのStandard Shaderの解説も素晴らしい。もう3DCGの基礎を学ぶならUnityから入った方が良いんじゃないか?とさえ思えるような良質な解説集になっている。
ドキュメントが面白い!
今までZbrushやBlenderで曖昧だった知識、特にレンダリングなどのグラフィック面に関する知識が少なかったので独学で学んでいたが、知識に穴が多かった。Unityのドキュメントではそういう基礎的なことの解説もあるので、読んでいて面白い。UE4のドキュメントよりもかなり丁寧だ。
目に見える=ディスプレイに表示されるとはどういうことか、の解説が深い
今まで漠然とディスプレイに映るものを見ているだけだったが、Unityではその1ピクセルをどうやって決めているのか、ということについての丁寧な解説がある。だからシェーダーレベルでの処理の内容や考え方がよく分かる。こういう下地があってこそシェーダーを作りたいと思えるのだろう。実際、作ってみたいと思っている。Blenderではこういう気になることは100%なかったよ(笑)
とはいえドキュメントばかり読んでいても前に進まないので、ヒマなときにでも読み物として読むことにする。
なお2018のドキュメントは当然ながら2019以降の新機能の解説はない上に、2019以降で標準となったワークフローに不要な機能の解説もある。なので全部熟読するというよりも、必要な所を読むくらいでいいと思う。機能の解説については可能な限り2021のドキュメントを読んだ方がいい。基本事項の理解ならば2018でいいと思う。
Unityマテリアルを理解した結果
ん?PBRのメタルネスとラフネスの概念がUnityの場合、何だかちょっと違うぞ?色々いじったがどうにもBlenderでの見栄えとUnityでの見栄えが一致しない。というか近寄りすらしない。どういうこと?
調べてみたら、やっぱり両者で面倒くさいほどの仕様の違いがあった。(これはfbxだろうがglTFだろうが結果は一緒だった。)
一発でファイルを相互変換できる機能とかツールは無いのか?
【結論】BlenderとUnityではマテリアルに互換性なし
なので地の色(ベースカラー、ディフューズ)マップと各種テクスチャマップを移植し、ラフネスとメタルネスについてはUnity用にファイルを画像変換することになる。
うん、メチャクチャ面倒くさい。面倒くさい。PhotoshopやGIMPでマクロなどを駆使すれば自動変換はできそうだが、それでも結構面倒くさい。
妥協案はいくつかあるが、もうマテリアル設定は直接Unity上で作業開始にした方がよくないか?Blenderではディフューズカラーマップのみのプレビュー用途として仮の色づけでいい気がする。質感はもうUnity側で詰めたほうがいいだろう。(逆にUnityからBlenderに戻してBlender上で質感を追求する日が来るとは思えない、私にとっては。)
サブスタンス3Dペインター(Substance 3D Painter)の登場かも
サブスタンス3Dペインターならば出力時のテンプレでUnityがある。カスタムテンプレでBlenderを作ってもいいだろう。テクスチャリングは全てサブスタンス3Dペインターを起点としてUnity用のテクスチャを出力し、Blenderにはディフューズマップを与えておけば問題ないだろう。
ん?でも私の目的はUnity Toon Shaderでセル画調の絵作りまたはアニメーション作りなので、そもそもメタルネスやラフネスといった微細な表面形状の情報って、いる?
Unity Toon Shaderにはメタルネスもラフネスも不要
というかUnity Toon Shaderのマテリアル要素一覧を見ても、メタルネスもラフネス(スムーズネス)も、ない(笑)なので結局どっちでもいいってことになる。
そのかわりPBRでは使わない様々な「制御用のマップ」を作ることにはなりそうだが。
そしてUnity Toon ShaderとBlenderとは全く互換性がないわけだから、どのみちUnityとBlenderとでマテリアル互換は探すだけ無駄かも知れない。
今回の創作活動は約3時間30分(累積 約2,758時間)
(808回目のブログ更新)
筆者はAmazonアソシエイト・プログラムに参加しています。(Amazon様の商品を宣伝することで紹介料をAmazon様から頂けるという大変ありがたい仕組みのこと。)
以下の商品名や画像アイコンをクリックしてからAmazon様で何かお買物をして頂ければそのご購入総額の1~2%が私に寄付されます。クリック後に別の商品のご購入でもOKです!誰が何を買ったかは私に通知されませんのでご安心下さい😊
また当サイトは楽天アフィリエイト、バリューコマース Yahoo!ショッピング アフィリエイト、および第三者配信の広告サービス(Googleアドセンス)を利用しています。
続きはこちら。