BlenderのMetallic,RoughnessテクスチャをUnityのMetallic+Smoothnessテクスチャに変換する方法

今回のお話はタイトル通り、Blenderのマテリアルで使うMetallicとRoughness用のテクスチャをUnity用のMetallic+Smoothness用テクスチャに変換する方法について。

実は以前も同じようなことを書きました。

・[Unity]BlenderとGIMPを使って1枚のテクスチャからNormal,Roughness,Metallicテクスチャを作る実験[PBR] 
https://kairandou.blogspot.com/2020/01/unityblendergimp1normalroughnessmetalli.html


この時はBlenderで使っていたテクスチャをGIMPでレイヤー分けしたり、色を反転したり、フィルターかけたり、透明度をいじったり云々かんぬんみたいな手間をかけてやってました。

見てもらえればわかると思いますが、このやり方は非常にめんどくさいです。
やり方自体なんとも泥臭いし、結果もイマイチそれに見合うものではない。
作りたいものはたくさんあるのに、毎回これをやるのはだるすぎる。

てなわけで改めて考えてみましたところ、かなり簡単な方法を見つけましたので、今回そのやり方についてまとめてみます。

(おそらくですが、今回のやり方は僕が知らなかっただけで、ちゃんと学んだ人からすれば知ってて当たり前な知識なんじゃないかと。
要するに車輪の再発明。
なので、もしご存知の方は生暖かい目で見ていただきまして。はい。
加えて、可能であればよりよい方法をご存知の方は教えて頂ければ嬉しゅうございます。)


早速ですが、それを使った結果から。

サンプルとして使用するモデルは以前作ったこの短剣。

・3Dモデル「剣58」 - HollowCradle - BOOTH
https://hollowcradle.booth.pm/items/2175382


これをBlenderのビューポートで見るとこんな感じ。

マテリアルの設定はこんな感じ。
Principled BSDFのDiffuse,Metallic,Roughness,Normalに各テクスチャを繋げただけのものです。

これを今回のやり方を用いてUnityに持っていったものがこちら。

Unityでの設定はこちら。
環境の違いがあるので見え方はある程度異なりますが、質感は近いものになっているんじゃないでしょうか。

実際にどうやるのかについては以下より。




準備
使用ソフト
Blender
Unity
GIMP

GIMPは同じような処理ができる画像編集ソフトであれば何でも大丈夫です。


テクスチャ
さっきサンプル画像にあったように、BlenderのPBRマテリアル用のテクスチャを利用しますので、以下のテクスチャを用意しておいて下さい。

Diffuse(UnityのAlbedoでも使うベースカラー)
Metallic
Roughness
Normal


前提知識
BlenderとUnityではPBRマテリアルに用いるテクスチャの扱いが少し異なります。
Blenderに関しては特に不要かと思われますが、Unityに関しては以前書いたこちらの記事やUnityのドキュメント参照頂ければ、と。

・【Unity】テクスチャを用いたSmoothness設定方法【PBRマテリアル】 https://kairandou.blogspot.com/2020/01/unitypbr.html 

 ・Unity - Manual: Metallic mode: Metallic Parameter https://docs.unity3d.com/Manual/StandardShaderMaterialParameterMetallic.html 


・シェーディング - Unity マニュアル https://docs.unity3d.com/ja/2017.4/Manual/BestPracticeMakingBelievableVisuals5.html


面倒だったら飛ばしても構いません。

大事なのは以下の部分。
・Blender
Diffuse:ベースカラー用。
Metallic:金属or非金属を白or黒(1or0)で表したもの。
Roughness:「粗さ」。白黒の濃淡(1〜0のグラデーション)で表したもの。
Normal:RGBで凹凸を表したもの。

・Unity
Albedo:ベースカラー。
Metallic:金属or非金属を白or黒(1or0)で表したもの。
Smoothness:「滑らかさ」。不透明度0〜1のグラデーションで表したもの。MetallicあるいはSpecularとして利用しているテクスチャのアルファチャンネルから取得。(今回はMetallicを使用)
Normal:RGBで凹凸を表したもの。

各テクスチャの詳しい性質については以下参照のこと。

■参考■
・PBRマテリアルのテクスチャは実際どのようなテクスチャなのか – tkmkrocket_techhttp://tkmkrocket.net/tech/2019/11/18/pbr%e3%83%86%e3%82%af%e3%82%b9%e3%83%81%e3%83%a3%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/

・基礎からはじめる物理ベースレンダリング - Qiita https://qiita.com/mebiusbox2/items/e7063c5dfe1424e0d01a


2つの環境を見比べると、MetallicとNormalは同じ仕組みなのでそのまま使えます。
DiffuseとAlbedoは同じくベースカラーを指すものなのでそのままで問題無さそうです。

問題はRoughnessとSmoothness。
そもそもBlenderでは「粗さ(Roughenss)」、Unityでは「滑らかさ(Smoothness)」と逆になってます。

また、BlenderではRoughness用のテクスチャを単独で用意するのに対し、UnityではMetallic(あるいはSpecular)のアルファチャンネルが利用されるため、Metallic+Smoothnessとして1枚のテクスチャにまとめる必要があります。

どうするか。


ここで大事なのは4つ。

・BlenderのRoughness MapとUnityのSmoothness Mapはどちらも0〜1の濃淡で表現される画像である
・BlenderのRoughness MapとUnityのSmoothness Mapは白黒反転すれば同じものになる
・Metallic Mapは共通である
・UnityではMetallic Mapの各ピクセルの不透明度(0〜1の値)がSmoothnessに使われる

こと。


今回はこれらに「マスク」というものを組み合わせてテクスチャを変換します。

マスクに関してはこのあたりを参照。

・GIMPレイヤーマスク:知っておくべきすべて| デイビスメディアデザイン https://daviesmediadesign.com/ja/gimp-layer-masks-everything-you-need-to-know/


マスクというのは簡潔に言えば、マスクを摘要する画像の不透明度を決めるために使う別の画像みたいなものです。
今回使うGIMPの例であれば、マスクはグレースケールの画像であり、その濃淡の度合(1〜0のグラデーション)によって、マスクが適用される画像の透明度を指定します。

例えばマスクとして指定した画像の真っ白の部分(値は1)は不透明に、真っ黒の部分(値は0)は透明に、中間の灰色部分(値は0.5)は半透明になります。
これを何かしらの画像に適用することで、その画像の透明度を変更できます。


ここで一旦整理のため、それぞれのテクスチャ(画像)の持つ値や性質がどのように対応しているかまとめてみます。

・Roughness
白→黒
1→0
粗い→滑らか

・Smoothness
白→黒
1→0
滑らか→粗い

・マスク
白→黒
1→0
不透明→透明

・Metallicのアルファチャンネル
1→0
不透明→透明
滑らか→粗い


今回求めるUnityのMetallic+Smoothnessに利用するために必要なテクスチャは、Metallic Mapの不透明度(アルファチャンネル)をSmoothnessの値として調整したものです。

それを踏まえて上の対応を見ると、白黒で表現されたMetallic Mapに対して、Smoothness Mapをマスクとして適用し、不透明度をいじることで、滑らかさ(Smoothness)がそのまま引き渡せそうです。

ちょっとわかりにくいかもしれませんので例を挙げると、マスクの真っ白の部分(数値1の部分)は透過されません(適用先の画像の不透明度1)。

UnityのMetallic+Smoothness Mapにおける不透明度1の部分は最も滑らか(Smoothness=1)になります。

つまり、Smoothness Mapとして使用していた画像の真っ白の部分はSmoothness=1で、これはマスクにおいては完全に不透明(不透明度=1)、そしてUnityのSmoothnessの値はMetallic+Smoothness Mapのアルファチャンネルが参照されるので、不透明度1のところはそのままSmoothness=1となります。


ということで、共通であるMetallic Mapに対して、BlenderのRoughness Mapの白黒を反転(Unity用Smoothness化)したものをマスクとして適用し、不透明度(アルファチャンネル)をいじれば、求めるUnity用Metallic+Smoothnessテクスチャが手に入るということです。


手順
で、実際の手順はこちら。

まず、Blenderで適用していたRoughness,Metallic用の画像を開きます。

これが今回の剣に使用したRoughness。

こっちがMetallic。
わかりにくいですが、剣の柄のところは非金属(黒)、刃は金属(白)というふうに塗り分けています。
(実験用に柄と刃の部分を塗り分けましたが、BOOTHで実際に公開しているものは全て金属だったと思います。)

そして、Roughnessを選択し、[色]→[階調の反転]します。
(この反転した画像の白黒濃淡の値がUnityのSmoothnessの値)

反転したものがこちら。

それをCtrl+Cで[コピー]します。
コピーしたらRoughnessは非表示にして大丈夫です。

次に、Metallicにマスクを追加します。
レイヤードックからMetallicを置いてあるレイヤーを右クリックで選択し、[レイヤーマスクの追加]。
すぐに上書きするので、レイヤーマスクの種類は何でもいいです。

追加したレイヤーマスクを選択し、先程コピーしたもの(Roughnessを反転したもの)をCtrl+Vで[貼り付け]ます。

すると、貼り付けたマスクに応じてMetallicが透過されます。
これがUnityにおけるMetallic+Smoothnessテクスチャとなります。

あとはPNG形式でエクスポートし、UnityのマテリアルにあるMetallicに繋ぐだけです。

おそらく不要だと思いますが、もし透過されないって場合は、画像を開いた後、各レイヤーに対して右クリックまたは[レイヤー]から[アルファチャンネルの追加]を行って下さい。


以上がBlenderのMetallicとRoughness用テクスチャをUnityのMetallic+Smoothnessテクスチャに変換する方法となります。

■参考■
・Gimp-画像を別の画像の透明レイヤーとして使用する

 ・Chapter 8. Combining Images https://docs.gimp.org/2.6/en/gimp-image-combining.html



このやり方は素人が思いつきでやってみたものなので、もし間違ってること、あるいはもっと上手くやる方法などございましたら教えて頂けると嬉しゅうございます。

ではまた。

コメント