[Shade3D] Shade3DからUnityに形状を渡す

  • by

Shade3DからUnityに形状(3Dモデル)を渡します。
Unityではマテリアルは「PBRマテリアル」で扱われます。
このうち、Metallic-Roughness(UnityではMetallic-Smoothness)テクスチャを1枚のテクスチャにパックして使用します。
これはUnity側のルールになるため、変換処理を行う必要があります。
glTF Converter ( https://github.com/ft-lab/Shade3D_GLTFConverter )プラグインで、
UnityやUnigineの標準的なマテリアルで使用するテクスチャを出力する機能を設けているため、その使用例を説明していきます。

Unityには何を渡せばよい ?

3Dモデルを渡す場合を考えていきます。
大きく分けると「形状(ジオメトリ)」と「テクスチャ」を渡すことになります。
ここではUnity 2020.2を使いました。

形状(ジオメトリ)

形状を渡すファイルフォーマットとして、fbxかobjが推奨されています。
Unity Asset Storeで出品する場合を考えて、fbxで扱うのが無難かと思います。

(参考)アセットストアへの出品 : http://assetstore.info/guide/

たくさんのアセットを扱う場合やVR/AR時など、寸法があいまいだと判断に困る場合があるため、形状は実寸でモデリングするようにしてください。
fbxフォーマットの場合は単位を持っているため、DCCツール上(ここではShade3D)で正しい寸法でのモデリングを意識していれば問題ないかと思います。

Unityでの描画の種類

Unityでは複数の描画の種類(Render Pipeline)があります。
大きく分けて「Built-in」「URP」「HDRP」があります。
それぞれマテリアルの指定は違いがあり、表現力も差があります。
テクスチャを使用する場合、Metallic-Smoothnessはパックする必要があります。
それぞれの方式でのマテリアルの指定について書いていきます。
ここでは、Metallicモードで扱うとします。

結論から先に書くと、以下のようにテクスチャを与えれば3つの環境で共有できそうです。

用意するテクスチャ 内容
Base Map RGB : Albedo(色のテクスチャ)
A : Opacity (不透明度)
Mask Map R : Metallic
G : Occlusion
B : 1.0
A : Smoothness
Normal Map RGB : Normal

ただし注意点として、Unityの古いバージョン(SRP/URP/HDRPがまだなかった時代、Unity5など)では、
Metallicのテクスチャとして、RGBにMetallic/AにSmoothnessを割り当てていた記憶があります。
その作法が必要なUnityのバージョンでは、テクスチャの共有化(URP/HDRPとそれ以外)は難しくなるのかもしれません。

Built-in

Built-inは、従来のUnityでの描画モードです。
過去バージョンと互換性を保つ場合に使用することになります。
描画のボトルネックがあるため、最近は「URP」に置き換わりつつあります。

Standard Shaderでのマテリアルとテクスチャは以下のようになっています。

Smoothnessは、(1.0 - Roughness)を指定します。
Metallic(R)/Smoothness(A)をテクスチャで指定する場合は、1枚のテクスチャに収める必要があります。
OcclusionテクスチャはG成分を使用するため、Metallic/Smoothnessテクスチャにパックして扱うこともできます。

URP

URP(Universal Render Pipeline)は、従来のBuilt-inがブラッシュアップされたものです。
実装ががらっと変わっています。
そのため、Built-inからの移行はそれなりに苦労しますが(既存のアセットが使えなかったりShaderを大きく書き換える必要が出てくる)、
描画速度もBuilt-inよりも早くなることが多いため、VR/ARに向けたプロジェクトでもプラスになるというメリットもあります。
今後はBuilt-inはレガシー化してURPに移ると思われるため、徐々に慣れていくのがいいかもしれません。

参考 : https://blogs.unity3d.com/jp/2019/09/20/how-the-lightweight-render-pipeline-is-evolving/

URPでのマテリアルとテクスチャは以下のようになっています。

Built-in時と同じテクスチャを使用できます。
Smoothnessは、(1.0 - Roughness)を指定します。
Metallic(R)/Smoothness(A)をテクスチャで指定する場合は、1枚のテクスチャに収める必要があります。
OcclusionテクスチャはG成分を使用するため、Metallic/Smoothnessテクスチャにパックして扱うこともできます。

HDRP

HDRP(High Definition Render Pipeline)は、Built-inやURPよりもさらに高品質なレンダリングを行います。
映り込み(SSR)やTransmissionによる背景のボカシなども行うことができます。
また、GPUレイトレーシング(DXR)も使用できます。
その代わり、速度はBuilt-inやURPに比べて重いです(といってもリアルタイム用ですので、オフラインレンダラよりもはるかに高速)。

参考 : https://unity.com/ja/srp/High-Definition-Render-Pipeline

HDRPでのマテリアルとテクスチャは以下のようになっています。

Built-in/URP時と違い、OcclusionのテクスチャはMetallic-Smoothnessテクスチャにパックする必要があります。

パックされたテクスチャをUnityに渡す手段

上記のようにUnityにテクスチャを渡す場合は、Albedo+OpacityやNormal Mapは問題ないとは思いますが、
Metallic(Mask Map)に相当するテクスチャはUnity専用のパック処理が必要になります。

いくつかのツールではこれを考慮したテクスチャ出力を行う機能があります。

Substance Painter (2018)

ここではSubstance Painter 2018で確認しました。
テクスチャの生成をSubstance Painterで行った場合は、テクスチャはここで完結する場合が多いかと思います。
その場合はSubstance Painterから出力したテクスチャをそのままUnityに渡すのが手っ取り早いです。
なお、バージョンによって出力できるものが変わっているかもしれません。
メインメニューの「File」-「Export Textures」でUnity向けのテクスチャを出力できます。

「Config」で「Unity 5 (Standard Metallic)」の場合は、Built-in/URPとしてのテクスチャを出力します。
出力構成は「CONFIGURATION」タブを選択すると確認/修正できます。

Metallicテクスチャは、RGBにMetallic、AにGlossinessを指定しています。
Glossinessは、UnityでのSmoothnessと同じです(1.0 - Roughnessとも同じ)。
ここにはOcclusionはないため、以下のように追加するのがよいかもしれません。

HDRPの場合は、「Unity HD Render Pipeline」を選択します。

これはそのまま使えそうです。
OcclusionはMaskMapの「G」に格納されているため、Unity 2020.2のBuilt-in/URPでも使用できます。

3DCoat

3DCoat 4.9.68で確認しました。
メインメニューの「File」-「Export Objects &Textures」を選択すると、
テクスチャのプリセットを変更できます。
「Unity (Standard)」「Unity (HDRP)」が選択として選べます。
「Unity (Standard)」は、UnityのBuilt-in/URPで使用できます。

Standardの「Metallic」の出力を見ると、RGBにMetalness、AにGlossinessを指定しています。
HDRPの「Mask」の出力を見ると、RにMetalness、GにAmbient Occlusion、Bに0、AにGlossinessを指定しています。

Shade3DからUnity用のテクスチャをエクスポート

Shade3Dの場合は、標準機能でfbxのエクスポートを行えます。
ジオメトリに関してはfbxを使用し、テクスチャは別途で出力します。
glTF Converter ( https://github.com/ft-lab/Shade3D_GLTFConverter )プラグインは、
Unity用のテクスチャを出力する機能を設けています。
ここでは glTF Converter for Shade3D ver.0.2.5.1を使用しました。

以下のようなデータの渡し方をします。

fbxエクスポート

マテリアルについてはShade3D上ではあらかじめ「マスターサーフェス(マスターマテリアル)」として与えるようにします。
複数のマスターサーフェスが存在する場合は、それらで同一名にならないようにしてください。
これにより、fbxでエクスポートする際にマスターサーフェス名がマテリアル名として格納されます。

Unity用のテクスチャをエクスポート

「glTF Converter for Shade3D」でglTFとしてエクスポートする際に、別途ゲームエンジン向けにテクスチャを出力する機能が用意されています。
メインメニューの「ファイル」-「エクスポート」-「glTF(glb) Shade3D Material」を選択します。

「エンジン別にテクスチャを別途出力」チェックボックスをOnにすると、「エンジン」を選択できます。

「Unity(Standard Shader/URP)」がUnityのBuilt-in/URP向け。
「Unity (HDRP)」がUnityのHDRP向けです。

これでエクスポートするとglTFファイルのあるフォルダ上に「images」フォルダが生成され、その中にUnity向けのテクスチャが出力されます。

以下は共通で出力されるテクスチャです。

テクスチャの種類 出力ファイル名 説明
ベースカラー マテリアル名_baseColor.png RGB : BaseColor
A : Opacity
法線マップ マテリアル名_normal.png RGB : Normal
発光 マテリアル名_emissive.png RGB : EmissiveColor

「Unity (Standard Shader/URP)」を選択した場合は、以下のテクスチャが出力されます。

テクスチャの種類 出力ファイル名 説明
オクルージョン マテリアル名_occlusion.png RGB : Occlusion
メタリック-スムーズネス マテリアル名_MetallicSmoothness.png R,G,B : Metallic
A : 1.0 - Roughness

「Unity (HDRP)」を選択した場合は、以下のテクスチャが出力されます。

テクスチャの種類 出力ファイル名 説明
メタリック-オクルージョン-スムーズネス マテリアル名_MetallicOcclusionSmoothness.png R : Metallic
G : Occlusion
B : Detail(1.0)
A : 1.0 - Roughness

Shade3DでのPBRマテリアルの割り当て

Shade3D ver.21のProfessional版では「PBRマテリアル」に対応していますが、
オープンソース版のglTF ConverterプラグインのエクスポートはShade3Dの機能としての「PBRマテリアル」には対応してません。
ver.19以降での「Shade3Dマテリアル」、ver.19以前での通常のマテリアルに対応しています。
また、ver.21のProfessional版に標準装備されているglTF Converterプラグインは、ここで説明するゲームエンジン用のテクスチャを出力する機能はありません。
オープンソース版をご使用くださいませ。

glTF Converterプラグイン(オープンソース版)のエクスポートでは、デフォルトではShade3Dのマテリアルをある程度近似する形でPBRマテリアルっぽく出力します。
詳しくは https://github.com/ft-lab/Shade3D_GLTFConverter のreadmeをご参照くださいませ。
エクスポートで「テクスチャを加工せずにベイク」チェックボックスをOnにして出力すると、
Shade3Dの表面材質ウィンドウをPBRマテリアルの指定とみなして出力します。
これは「DOKI for Shade3D ( http://www.ft-lab.ne.jp/shade3d/DOKI/ ) 」で
PBRマテリアルを使用している際と同じような結果になるように互換性を取っています。

マスターサーフェス名で [DOKI : PBR] とあるのが、DOKI for Shade3Dでレンダリングする際にPBRマテリアルとして採用されるものです。

Unity側での調整

ここでは Unity 2020.2のURPを使用しました。
Unityに形状ファイル(fbx)とテクスチャ(png)をインポートします。

Projectウィンドウで法線マップのイメージを選択し、
Import Settingsで法線マップの「Texture Type」を「Normap map」に変更します。

Projectウィンドウでfbxファイルの形状を選択し、
Import Settingsの「Materials」タブを選択します。

「Location」で「Use External Materials(Legacy)」を選択。
「Naming」で「From Model's Material」を選択。
Applyボタンをして確定します。
こうすることで、対象の形状でShade3Dでの「マスターサーフェス(マスターマテリアル)」名のテクスチャを別途割り当てることができます。

これによりMaterialsフォルダが作成され、その中にマテリアルが展開されています。

このマテリアルを選択し、それぞれのテクスチャを割り当てていきます。

「Metallic Map」のスライダ値は1.0にします。
URPの場合は、Metallicのテクスチャは「R : Metallic、A : Smoothness」が割り当てられています。

ガラスのような透明体の場合は、「Surface Type」を「Transparent」、両面表示にする場合は「Render Face」を「Both」にします。

これらのマテリアルの指定は、Built-in/URP/HDRPでUIも変わるためそれに合わせて設定する必要があります。

マテリアル設定により、Inspectorウィンドウのプレビューは以下のようになりました。

今回はここまでです。
極力Shade3Dのマテリアルを保ったままUnityに形状を渡す流れでした。