Eevee や Cycles Render のマテリアルで、ノード編集にてノーマルマップを複数枚使う方法を紹介する。
もくじ
更新(2023-11-03)
執筆当時のやり方より、後述の「オーバーレイ + Bのみ乗算」のやり方の方がいいかもしれない。
使用する画像
今回は、模様のある鉄板(縞鋼板(しまこうはん)というらしい)と、
石畳のノーマルマップを合成する。
フリーテクスチャを探す時は textures.com がおすすめ。
3D Scanned Medieval Cobblestone Path - 6x3 meters
まずは普通にノードを組む
- 追加(Shfit + A) → テクスチャ → [画像テクスチャ]ノードを追加
- ノーマルマップ画像を設定
- 色空間は[Non-Color]にすること
これをしないとノーマルマップが正常に出力されない
- 追加(Shfit + A) → ベクトル → [ノーマルマップ]ノードを追加
- ノーマルマップノードをプリンシプルBSDFの[ノーマル]に接続
RGBミックスノードで2つをミックス
RGBミックスノードを使って画像2枚を合成する。
RGBミックスノードは、ペイントソフトのレイヤー合成機能と似たようなもの。
レイヤーの描画モードと同じように、合成方法を選べる。
レイヤーの不透明度が、値と似ている(RGBミックスでは、どちらの画像をどの程度反映させるか、となっている)。
ノーマルマップを合成するには、
ノーマルマップ同士を乗算で合成し、濃くなったRとGを取り除く。
- 追加(Shfit + A) → カラー → [RGBミックス]ノード を追加
- ブレンドタイプを[乗算]にする
- 値は[1.0]
- ノーマルマップ同士をミックスする
- 最後に、ノーマルマップのベースカラーで「除算」する
- RGB[0.5,0.5,1.0]がノーマルマップのベースカラー
仕組み
ノーマルマップ同士を乗算する
画像1[R,G,B] × 画像2[R,G,B] = 合成結果
- [0.5,0.5,1.0] × [0.5,0.5,1.0] = [0.25,0.25,1.0]
- 乗算なので、RとGの色が濃く(0=黒に近く)なる
- Bは1.0(白)なので乗算しても変わらない
ベースカラーで除算する
RとGが濃くなりすぎたので、色を元に戻す
- 合成結果 ÷ ベースカラー = 最終結果
- [0.25,0.25,1.0] / [0.5,0.5,1.0] = [0.5,0.5,1.0]
ペイントソフトで調整する方法
ペイントソフトでノーマルマップを合成する場合でも、同じ手法で合成することができる。
除算に相当する描画モードがないので、レベル補正にてRとGの値を減らす。
- ノーマルマップレイヤーを2枚用意
- 上のノーマルマップを[乗算]で合成する
- レベル補正調整レイヤーを上に作る
- R・Gチャンネルのみ、それぞれ白レベルを50%にする
【注意】オーバーレイ合成ではBチャンネルの情報が消える
一見、オーバーレイで合成すればうまく合成できているように見える。
しかし、ノーマルマップをオーバーレイで合成すると、 [Bチャンネルの情報が消える]。
これはなぜかというと、
描画モードにはそれぞれ合成結果に影響を与えない中性色があり、
オーバーレイでは、50%のグレーが中性色。
ノーマルマップのRとGはグレーがベースなのでうまくいくが、
Bチャンネルは白ベースなので、
オーバーレイではうまくいかない。
乗算とオーバーレイの手法を比較してみると、オーバーレイでは凹凸の情報量が少ない。
参考
オーバーレイでは駄目だということの参考
よくわからないノーマルマップ講座 Tips編 その1: Sandy Virtual City
https://kouoaeha.at.webry.info/201408/article_4.html?reload=2019-08-18T04:09:05
乗算での合成方法の参考
texturing - How to Combine two Normal Maps? - Blender Stack Exchange
https://blender.stackexchange.com/a/97207/75121
追記
執筆当時より後に見つけた方法を書く。
下記記事参考。
サンプルノーマル画像は下記リンクのものを使用。
Blending in Detail - Self Shadow
オーバーレイ
オーバーレイで合成するのが一番簡単。
ただ、Bチャンネルが消えるのでディティールが損なわれていて、薄い。
オーバーレイ + Bのみ乗算
オーバーレイに加え、Bチャンネルのみ乗算で合成する。
だいぶいい感じになっているが、陰っている時の凹凸が弱いが、これでも十分か。
- 2枚をミックスノードのオーバーレイで合成する。
- それを、XYZ分離ノードでRGBを分離する。
- 2枚の元画像を、それぞれXYZ分離ノードで分離する。
- Z(Bチャンネル)のみを、数式ノードの乗算で合成する。
- XYZ結合ノードを作成し、オーバーレイの方のXとY、乗算で混ぜたBチャンネルの方のZを、合成する。
その他
上記リンクの偏導関数の場合、陰部分の凹凸がよくわかる。
これをBlenderのノードで再現する方法がわからず。