LoginSignup
2

More than 1 year has passed since last update.

[Unity]ShaderGraphで複数マテリアルをひとつにまとめる

Last updated at Posted at 2022-06-28

desktop.PNG

はじめに

一つのオブジェクトに複数の異なる色や質感をアタッチしたい
方法は大きく2つある。
1. マルチマテリアル方式──複数のマテリアルを使って色分けする
2. UVテクスチャマッピング方式──1つのマテリアルの中でテクスチャを使って色分けする

1. マルチマテリアル方式

サブメッシュというメッシュをマテリアルごとに割ってグループ化する仕組み
DCCツールがあれば簡単に作れる
  
こんな感じ↑

複数のマテリアル、その数と同じだけのサブメッシュ
ただし複数マテリアルを使うとそのぶんだけドローコール数が上がってしまい負荷の原因になる
また、オブジェクト数が増えていくとマテリアル数が膨大になり管理がやや面倒

2. UVテクスチャマッピング方式

テクスチャで質感を指定する仕組み
SubstanceやQuixel、簡単なものではPhotoshopのようなペイントツールなどでテクスチャを作成する
  

アルベド(拡散色)のテクスチャはこんな感じ↑

UVに画像をマッピングしているのでトポロジーに影響されず色分け、質感分けができる
テクスチャを使うのでメモリを使うものの、マテリアルをまとめられるため描画負荷が少ない
UVの編集が必要、テクスチャ編集ツール(Quixel,Substanceなど)が必要
また質感や色の調整をするためにいちいち外部ツールで画像を編集しなければならず修正が手間
画像の解像度に見た目が依存する

マルチマテリアルとUVテクスチャマッピングのいいところ取りをしたい

本当に最適化したかったり質感を詰めたいのであればもちろんUVテクスチャマッピングがいい
でもいつもUVを開いたりテクスチャを丁寧に描く時間があるわけじゃないし、
いつもモバイル並みの最適化が必要なわけでもない
かといってマルチマテリアルもオブジェクトが増え過ぎるとマテリアルの管理の手間もパフォーマンスへの影響も無視できない

マルチマテリアルのお手軽さを活かしつつ、マテリアル管理やパフォーマンスを改善したシェーダーを考えてみたい

こんなふうにUVの領域を区切って動的に質感を調整できる仕組みにしてみた↓
 
マテリアルとしてはひとつにまとめてあるけれどV座標0.1刻みで質感を変更できるようにしており、最大10マテリアルぶんの質感を個別に調整できるようにした

ShaderGraphの中身
左側で10領域ぶんのマスクを作成し、右側でマージしてセットしている
10領域ぶんの処理を作っているのでノード数が多いが、基本的にマテリアルの数だけ同じ処理を繰り返しているだけ↓

multi.PNG

DCCツールでオブジェクトの確認
マテリアル領域を分けずに書き出す↓
  

UVの設定
Substanceで使うほどしっかり開く必要はない
あくまでどのポリゴンがどの質感を拾うようにするのか区分けしているだけなのでUVの重なりもサイズも気にしない↓
  

シェーダ設定
6色を1マテリアルにまとめて色調整する↓

色と質感の変更
マテリアル1つにまとまっているので調整しやすい↓
cam.PNG

まとめ

UV編集だけやや面倒だが一度設定してしまえばその先の作業が簡素化されて楽

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2