[Unity]BlenderとGIMPを使って1枚のテクスチャからNormal,Roughness,Metallicテクスチャを作る実験[PBR]

前回、UnityにおけるPBRマテリアルの設定方法について調べました。

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

今回はそれを踏まえて「1つのテクスチャからBlenderやUnityで使えるPBRマテリアル用のテクスチャを作る方法」を考えます。

先に結果を載せますが、これが

こうなりました。

これを見て少しでも「役立ちそう」って思われた際は少々お付き合いいただければ、と。


今回の作成の流れとしてはこんな感じです。

まず最初にベースとなる「BlenderのBase Color & UnityのAlbedo兼用テクスチャ」を作ります。
それから「Blender用Roughness Map」、「Blender&Unity用Normal Map」、「UnityのSmoothness用Alphaチャンネル付きMetallic」をそれぞれ作成します。

使うツールはBlenderとGIMP。
ぶっちゃけSubstance的何かやその他便利ツールを持っている方はおとなしくそっちを使った方がいいと思います。

BlenderのBake機能は使いません。
Bakeに関してはそのうちまたやります。

もしBakeで作る際にはこのあたりが参考になりそう。

・Blender | 一枚の画像からリアルなマテリアルを作るチュートリアル - Road to 3DCG
http://rt3dcg.blogspot.com/2016/06/blender.html



今回の注意点としては、あくまで"ざっくりとした作り方"であること。
精細さは求めず、カップ麺を作るノリでそれっぽいものを作れればいいなぁ、と。

それでは早速作っていき...たいところですが、まず前回の記事で触れた内容を踏まえて、今回各テクスチャを作るのに必要な色情報などもろもろの制約を列挙します。

BaseColor(Albedo)
BaseColor(Albedo)はRGBまたはRGBA。

Normal Map
RGB。

Metallic
BlenderのMetallicは白黒の画像が使われる。画像中の白色部分は金属に、黒色部分は非金属になる。

UnityのMetallicも白黒画像が利用される。
こちらも同じく白色部分は金属に、黒色部分は非金属に。
厳密に言えば、UnityのMetallicはRGBAのRの値を参照し、それ以外の値は無視される。
なので、白黒で表現すると、白色部分のRは1、黒色部分のRは0になるため、白黒で問題ない。

Metallicは基本的に白or黒の2つの値に振り分けるのが原則。
でも、後述のRoughnessと同じで、灰色の部分も違う変化が出るので、そこまで気にしなくていいのかも。

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

Roughness(Smoothness)
BlenderのRoughnessも白黒。黒色部分は滑らかに、白色部分は粗くなる。
Roughnessは白黒の間に灰のグラデーションを持てる。

UnityのSmoothnessはAlbedoまたはMetallicに適用しているテクスチャの内、選択した方のA(アルファ)の値が使われる(Albedo Alpha または Metallic Alpha)。
粗くしたい部分はアルファを下げ(透明に)、滑らかにしたい部分はアルファを上げる(不透明に)。



これらを踏まえると今回作る必要があるものはこんな感じ。
Blender向け
Roughness

Unity向け
Smoothness用アルファチャンネル付きMetallic

共通
Base Color(Albedo)
Normal


過程でBlender用のMetallicも作れますが、現状作る理由が無いので今回はスルーで。


では実際の作業へ。

1.Base Color(Albedo)
まずBlenderを開き、板ポリでも何でも良いので適当なメッシュを用意し、マテリアルを新規作成します。

適当なサイズのテクスチャを新規作成するか、既存のテクスチャをそのマテリアルのBase Colorに繋ぎます。

UV展開します。

テクスチャを新規作成した場合は、適当にBakeするなりTexture Paintするなりして色を塗ります。

そこまで終わらせた状態がこちら。
そこらへんにあったテクスチャを貼り付けただけです。

このテクスチャ画像に名前を付けてPNGとして保存します。



2.Roughness
次に、出力したテクスチャ(マテリアルのBaseColorに使用中のテクスチャ)をGIMPで開きます。

それを[色]→[脱色}し、グレースケール化します。

[色]→[明るさ-コントラスト]から、コントラストを調整します。

濃淡の指標は、滑らか(Smooth)にしたいところを白に、粗め(Rough)にしたいところは黒になるように。
ただし、くっきりとはわけないように、灰色部分を混じらせて作ります。
そうすると粗さに波ができてそれっぽくなるので。

こんな感じに。
今回はそのままで問題ありませんでしたが、必要であれば色を反転させることで粗さを反転できます。

・8.3. 階調の反転
https://docs.gimp.org/2.8/ja/gimp-layer-invert.html

・8.4. 明度の反転
https://docs.gimp.org/2.8/ja/plug-in-vinvert.html

・【GIMP】色を反転させる方法いろいろ【階調反転・明度反転・色相反転など】
https://gimp-easy.net/iro-hanntenn/

・GIMP – 写真/画像の色の階調・明度・色相・輝度を反転する方法 | Howpon[ハウポン]
https://howpon.com/8413



3.Normals
次はNormal Mapです。
これはGIMPのNormal Map Pluginで作ります。

・GIMP normalmap plugin | Google Code Archive - Long-term storage for Google Code Project Hosting.
https://code.google.com/archive/p/gimp-normalmap/

Ubuntu系統であれば sudo apt install gimp-normalmap でインストールできます。

インストールが終わったらGIMPに戻り、先程作ったRoughness用テクスチャを開き、[フィルター]→[マップ]→[Normalmap]と進みます。
あとは凹凸の強さや向きを調整し、[OK]すればできあがり。

PNG形式で保存しておきましょう。



4.Unity用Smoothness付きMetallic
最後にUnity用にSmoothness付きのMetallicテクスチャを作ります。

まず、グレースケール化したBase Color(Albedo)、または先程のRoughnessテクスチャをGIMPで開きます。

そのテクスチャのコントラストを調整します。
コントラストを最大にした後、明るさを変更することで白黒の部分を調整して、灰色部分を消去。
完全に白黒に分けます。

[選択]→[色域を選択]から、白か黒の部分を選択します。
選択できたら、[切り取り]からそのまま[貼り付け]、[レイヤーウィンドウ]内から[新しいレイヤーを画像に追加]。
これで白色部分と黒色部分をそれぞれ別のレイヤーに分けることができました。

あとは、それぞれのレイヤーの不透明度(アルファ)をいじります。
テクスチャの制約や条件のところで書いたように、この不透明度(アルファの値)がUnityのSmoothnessに使われます。

粗くしたいところは不透明度を下げ(0に近付け)、滑らかにしたいところは不透明度を上げ(100に近付け)ます。
※もし不透明にできない時は、アルファチャンネルが無いので、[レイヤー]→[透明部分]→[アルファチャンネルの追加]としましょう。


調整時の注意点としては、Blender用のRoughnessをUnityのMetallic + Smoothnessに使っているところです。

Blenderでは「Roughness」ですが、Unityでは「Smoothness」と、逆になってます。
それぞれの指定方法も異なり、前者は白黒灰のグラデーション、後者は透明度(アルファ値)です。

また、UnityのMetallicにおいて、白色部分はMetallic = 1(金属的)、黒色部分はMetallic = 0(非金属的)として扱われます。
Smoothnessに関しては、不透明度(アルファ) = 100はSmoothness= 1 (滑らか)、不透明度 = 0はSmoothness = 0 (粗い)となります。

このあたりは実際にUnityで適用して確認しながらやるといいでしょう。

アルファの調整が終わったらPNGで出力します。



と、テクスチャ作りはこれにておしまいです。

最初に載っけましたが、出来上がったテクスチャをUnityに持っていってみます。

まず、Albedoのみ適用したもの。
平面的にテカってますね。
嫌いじゃあないですがリアルさには乏しいです。

で、こっちがAlbedo + Roughness + Normal全て適用したもの。
さっきと比べると、粗い部分や金属質の部分の入り交じる、錆っぽさと呼べそうなものが出ましたね。

どうでしょう、1枚のテクスチャから即席で作ったにしてはそれっぽいんじゃないでしょうか。
もう少し丁寧にするのであれば、Unity用Metallicのところで、はっきり白黒に分けず、灰色も含めた数段階のレイヤーに分けてそれぞれのアルファをいじればいけそうですが、そこまでやるならベイクしたり、他のツール買うなり何なりしたほうが良い気がします。

ともあれ、慣れればカップ麺レベルにインスタントにできますので、もしよければお試しくださいませ。

ではまた。

コメント