【Unity】テクスチャを用いたSmoothness設定方法【PBRマテリアル】

3Dモデリングを始めてから1年と数カ月が経ちました。
独学で好き勝手作ってきたのですが、最近基礎力の無さをつくづく自覚しまして。
そろそろ向き合わねばと、色々調べているところです。

で、ここしばらくPBRマテリアルについて試しておりまして。
今回はUnityにおけるPBRマテリアル用テクスチャに関するメモとなります。

そもそもPBR(Physically Based Rendering)とは何ぞ?って問いに関する詳細は以下より。

・Physically based rendering - Wikipedia
https://en.wikipedia.org/wiki/Physically_based_rendering

・物理ベースレンダリング -基礎編- | Cygames Engineers' Blog
https://tech.cygames.co.jp/archives/2129/

・PBRマテリアルのテクスチャは実際どのようなテクスチャなのか – tkmkrocket_tech
http://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/

・物理ベースレンダリング -リニアワークフロー編 (1)- | Cygames Engineers' Blog
https://tech.cygames.co.jp/archives/2296/


要約すれば「物理的な正しさとそれによる現実らしさを求めた手法」みたいな感じ。
その手法で作られるのがPBRマテリアル。

PBRマテリアルに使うものの1つに様々なテクスチャの類があります。
普段僕がBlenderでPBRマテリアルを作る際に使うテクスチャはBaseColor,Normal,Roughnessの3種です。
テクスチャには他にもAOやらMetalnessやらありますが、現状はこれだけ。

テクスチャの作り方としては、まずBaseColor用のテクスチャをBlender内でTexuture Paintするなり、Bakeするなりして用意します。
それをGIMPで脱色してグレースケール化し、適当にコントラストを付けてRoughnessとして出力。
最後にそのグレースケール化したテクスチャをGIMPのNormal Map Pluginを使ってNormal Mapにして出力します。

・GIMP normalmap plugin
https://code.google.com/archive/p/gimp-normalmap/


サンプルとして作ってみたものがこれ。

【BaseColor】

【Normal(Map)】

【Roughness(Map)】


そうして作ったものをBlenderのノードに繋ぐとこんな感じ。

適当なメッシュに貼り付けてビューポートで確認するとこんな感じ。

現実的と呼ぶには解像度が足りませんが、適当に作れるにしてはそれらしい質感になりました。


では、これをUnityに持っていってみます。

Blenderでfbxをエクスポートして、Unityにインポート。
インポート時にNormal MapをFix。
インポート直後のマテリアルではBlenderで繋いでいたRoughnessが外れていますので、マテリアルをいじって繋ぎ直すためにInspector→Materialsへ行き、LocationをUse External Materials(Legacy)へ変更しApply。
RoughnessをSmoothnessにつなぎたいところですが、無いのでとりあえずMetalに適用。
するとなんかメリハリの無い質感に。

Smoothnessがおかしいのかと、Smoothnessの値を調整し、1に近づけてみると・・・これもなんか違う。

ここでUnityにおけるMetallicとSmoothnessの扱いを見てみましょう。

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

・Smoothness - Unity マニュアル
https://docs.unity3d.com/ja/2017.4/Manual/StandardShaderMaterialParameterSmoothness.html

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


ドキュメント曰く「MetallicはMetallicに適用したテクスチャのRGBAのRの値が、SmoothnessはRGBAのAの値(アルファチャンネル)が使われる」。

また、UnityのSmoothnessで使うAlphaの値は「Albedo Alpha」と「Metallic Alpha」の2種類から指定でき、AlbedoまたはMetallicにあてがわれたテクスチャのうち、選んだ方のアルファチャンネルが参照される、と。

・アルファチャンネル - Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB


上のサンプルでBlenderからUnityへエクスポートした時に上手くいかなかったのは、Roughnessに使っていたものをSmoothnessとして何故かMetallicに繋いでいたことと、Smoothnessの指定方法が間違っていたから。

Smoothnessのテクスチャスロットが無いとはいえ、Metallicに繋ぐのは意味がわかりませんね。何を考えていたのでしょう。


現状、上のようにBlenderで使っていたRoughnessマップをそのままUnityに持っていくことはできそうにありません。
RoughnessとSmoothnessでも値が逆ですし。
転用するのであれば、テクスチャを色々いじる必要がありそうです。


ともあれ、MetallicとSmoothnessで使うテクスチャについてはわかりました。

マニュアル内のサンプルを見る限り、「白黒の濃淡」+「アルファ(透明度)の強弱」を組み合わせることで、MetallicとSmoothnessを1枚のテクスチャにまとめることができそう。
(実際、こういう"まとめ"はよく使われてるとかなんとか)


ということで、今回は確認も兼ねていくつかのテクスチャを試してみます。

確認するのは2点。
  • アルファによるSmoothnessの変化
  • 白黒の濃淡によるMetallicの変化
確認方法として、同じテクスチャをGIMPでいじり、比較します。

その開始地点となるのはこれ。
板ポリにAlbedo用のカラーテクスチャ、Normal Mapを適用したものです。
ライトを中央に当て、Smoothnessの値は見やすいように0.9としました。

ちょっとわかりづらいですが、比較しやすいよう、同じテクスチャを左中央右と3つに複製して並べてあります。
(線を引いたところ)


今回使用したテクスチャはこちら。

【Albedo】

【Normal Map】


今回はMetallic Alphaの値を利用しますので、こちらのMetallic用テクスチャをベースにしていじります。

[Metallic]


これをそのままMetallicに適用するとこんな感じ。
当たり前ですが、この段階では3箇所の質感に違いは無いですね。
では色々いじっていきましょう。


1.アルファ値の変更
まずはSmoothnessの変化を期待し、アルファ値を変更してみます。
左中右のアルファ(透明度)を左から右に行くにつれて小さく(薄く)なるよういじってみたのがこちら。

これを適用するとこうなります。
期待通り、アルファの値が大きいほどつるりと滑らかに、小さいほどざらりと粗くなるよう変化してますね。


2.白黒の濃淡調整
次に白黒の値をいじり(Rをいじり)、Metallicを変化させてみます。
適用するテクスチャはこちら。
わかりやすくするため、中心部分は変更せずそのまま、左を黒単色に、右を白単色に塗りつぶしました。
それを適用するとこう。
両側を中と比較すると、左の黒色に塗りつぶしたところは非金属的に、右の白色に塗りつぶしたところは金属的な黒っぽい反射を見せています。


3.アルファ値と濃淡の変更
1と2の結果を合わせ、SmoothとMetallicを同時にいじってみます。
準備したのはこちら。
中は最初のまま。
中部分のコントラストを上げ、白色部分のアルファを0にしたものを左に、黒色部分を0にしたものを右に配置しました。

これを適用するとこんな感じに。
中と比較すると、左は非金属+粗めに、右は金属+粗めに。
期待通りです。



というわけで、これにて確認完了。
無事Metallic用テクスチャにSmoothnessの値を載せることもできましたとさ。

おわじ。

コメント