読者です 読者をやめる 読者になる 読者になる

当たったらどうすんだよ

当たらなければどうということはない

ZBとBlenderでUE4用のキャラを作る #6:各種テクスチャマップの作成

Blender UE4 UE4にオリキャラを導入したい ゲーム制作 Zbrush Photoshop

UE4用人物キャラ作成の第6回です。
今回は、当初SubstancePaiter (SP)とSubstanceDesigner (SD)を使って、ZBで作成したテクスチャからさらに凝ったテクスチャを作成する記事を書こうと思っていました。しかし、前回作成したZBのテクスチャをベースに、仮マテリアルをBlenderで作成してワサビミドリのモデルに割り当て、Cyclesでレンダリングしていたところ、次のように考えました。

  • 重要なのはラフネス(粗さ)とハイト(高さ)マップだよね?(あるいはスペキュラー)
  • マテリアルのMixを行うために「混ぜ具合」を指定するマスク用テクスチャも説明したいよね?
  • Substance系は持っていないひとも多いだろうし、別の機会でいいんじゃないかな?
  • というか、基礎が分かっていないでいきなりSP使っても意味が分からないんじゃないかな?

そして、実を言うとこれらのマップ(テクスチャ)はフォトショップの2D画像編集機能だけでも作成できます。ただ、ZBやSPなどのような3D空間に直接ペイントできるソフトのほうが便利なのです。また、フォトショップも今では3Dペイント機能を備えています。

そこで、今回はあくまで基礎編として、Zbrushフォトショップだけで、本来はZBだけではサポートしていない種類のテクスチャを作成してしまう「応用的な手法」を紹介してみることにしました。

ノーマルマップで基礎の座学

f:id:kanianthi:20160610112203p:plain

↑の図はRGBの値を0~1の数値として利用し、白であれば1,1,1という3つの数値を指定できることを示したものです。3D CGでは昔からこうしたパラメータをテクスチャとしてマッピングし、様々な数値を画像で指定する方法が使われてきました。

その代表的なものがバンプマップとスペキュラーマップで、白黒の255段階のグラデーションを使い、50%グレー(標準グレー)を0値と捉え、それより暗ければ値を低く、それより明るければ値を高くマテリアルに渡すものでした。

白黒のマップは明度(輝度)の情報しか持っていませんので、1次元の値しかひとつのピクセルに持たせることができません。しかしRGBの3色を使えば、三次元の座標が指定できるはず…という発想で作られたのがノーマルマップ(法線マップ)です。

f:id:kanianthi:20160610114012j:plain

↑はBlenderの立方体を編集モードで表示したものです。

選択している頂点はXYZ順に(1,-1,1)の座標にあります。Z軸を挟んで反対側の頂点はXの値が-1になります。当たり前の話ですが、それぞれの頂点の座標は軸を挟んで反転します。

それでは、どの頂点でも良いので、ノーマル方向に動かしてみると座標はどう変化するでしょうか。どういう風に動かしても、それぞれの原点に近づけば値は減少し、離れれば増加します。しかし…Xの値だけは値の「向き」がY軸を挟んで逆さまです。

実はこれが「ノーマルマップは片側UVでは使えない」理由になります。

つまりノーマルマップというのは、ベースのメッシュに対して「頂点がどれだけノーマル方向に動いたか」を記録しているものなので、左右で(実は3軸において)ベクトルが反転することになり、ノーマルマップを観察するとYZ平面を境に色が反転していることが分かります。

これはキャラクタモデルのように「左右対称モデル」であれば顕著に出てくる問題です。
※CGを専門的に学んでいるはずの学生さんが、案外ノーマルマップの説明ができないというのはなぜだろう?とよく思います。カリキュラムの問題でしょうか。

テクスチャマップを作成する

これで色情報を使って数値や座標やベクトルを指定できることが分かりました。ついでにノーマルマップが左右で反転することも「なんとなく」理解できたと思います。あとは実践して経験すれば、理屈が知識になり技術になってくれます。

それでは具体的な作業の解説です。

通常、Zbrushではポリペイントをベースにしたカラーテクスチャのほかに、ノーマルマップとディスプレイスメントマップ(ハイトマップ)を作成することができます。また、標準プラグインであるMulti Map Exporterを使えば、アンビエントオクルージョンマップなども作成することができます。

しかし、Zbrushで作成するカラーテクスチャは、あくまで「塗り絵」した色だけをマッピングしたものであり、陰影の入った写真的なテクスチャにはなりません。そこで、フォトショップを使って、ひと手間加えたテクスチャを作成してみます。

f:id:kanianthi:20160610123402j:plain

↑はZBで作成した髪の毛のテクスチャをフォトショップで表示したものです。色は塗られていますが陰影が一切ないので平面的なショボいテクスチャです。

f:id:kanianthi:20160610124746j:plain

そこで、ZBで作成したディスプレイスメントマップを重ねます。描画モードはオーバーレイにしています。ソフトライトかハードライトで合成しても良いでしょう。

たったこれだけの手間を加えることで、テクスチャマップの表現力が跳ね上がったことが分かると思います。

ラフネスとスペキュラーのおさらい

3D CGのマテリアルというのは、結局のところ「シェーダーモデル」のことです。Blenderであれば、Cyclesのマテリアルノードに表面材質ノードひとつだけ、というシンプルなマテリアルもあるでしょうし、画面をスクロールしないと収まらないような複雑なノードも作成できます。

とはいえ、いわゆるPBR(物理ベースレンダラ)やリアル系を指向するなら、重要なのはカラーテクスチャとノーマルマップ(バンプマップ)と光沢/反射マップです。

ここでラフネスというのは表面(サーフェース)の鏡面的な性質を指します。

最近のPBRでは、ラフネスとメタリックでおおよそのシェーディングを決定しています。ラフネスは0で完全な鏡面になり、1で鏡面反射を行わなくなる、と覚えておけばだいたい大丈夫ですw

この逆に、スペキュラ(光沢)マップでは、1で強く反射し、0で反射を行わなくなります。ただしスペキュラのふるまいは各レンダリングエンジン(あるいはカスタムマテリアル)でかなり違いがあり、うまい具合のスペキュラマップを作成するのはとても難しいことでした。というのは、スペキュラひとつでフレネル(光線の入射角による反射の度合い)を制御していたり、それぞれ別々のパラメータを使っていたり、いまいち統一性がないのです。

f:id:kanianthi:20160610131119j:plain

なにはともあれ、BlenderのCyclesで仮マテリアルを構築しました。今回作成したすべてのパーツは、基本的に同じ作りのシェーダーノードを使います。

ここでラフネスに使用しているテクスチャはディスプレイスメントマップをフォトショで階調反転させたものです。記事の最後にレンダリング結果を貼りますが、とりあえず狙った感じに機能してくれているようです。

複合マテリアルをマスクでMixする

UE4でマテリアル作成するときには、二つ以上のマテリアルを指定してしまっても良いのですが、ここで「ひとつのマテリアルで二つ以上の材質をはっきり分離させるテク」も紹介しておきます。

やることは実に単純です。

f:id:kanianthi:20160610132910j:plain

↑のように平面を作成し「UVを生成」にチェックを入れます。新規マテリアルも割り当てておきます。

次に、ディフューズBSDFノードを追加して、Mixノードで接続します。同じノードを複製するときはshift+DでDupeできます。

f:id:kanianthi:20160610133307j:plain

↑青と赤が50%でMixされたので紫色のマテリアルになった!

それでは続いてフォトショップでこんな画像を作成しました。

f:id:kanianthi:20160610133451p:plain

↑名付けてMixMaskです。これをMixノードの「係数」に接続します。

f:id:kanianthi:20160610133850j:plain

結果は↑の通り。見事!

このようにマスク画像を使えば複数の材質をひとつのマテリアルで表現することができます。ワサビミドリのモデルでは、ボディのメッシュひとつで「服」と「肌」を大きく分けると表現したいですし、さらに細かく「靴」や「ソックス」もその気になれば分割することが可能です。

このマスクテクスチャによる材質分けのメリットは、ポリゴン毎にマテリアルを割り当てる方法だと難しい「フリーハンドなエリア分けで材質を分離することができる」ことにあります。というか上記の作例では「ポリゴンがひとつ」しかないのに関わらず、複数のディフューズBSDFを表示していますね。

それでは長くなりましたので、今回の記事はここまでにして、続きをすぐに書こうと思います。