これはS.Haruyaさんから寄稿していただいた記事になります。
元記事URL:https://zenn.dev/sfuka/articles/943cf4ec07fa56
はじめに
これは Resonite Advent Calendar 2023 その3 20日目の記事です。
今回の記事ではResoniteでマテリアルに初めて触れた、最近モデリングを初めた、という人が躓きやすい『Metallic(メタリック)』についてできるだけ簡単に解説しようと思います。
今回使うのはPBS_Metallic
今回は特にResoniteで使われるマテリアルとしては大部分をしてめていると思われるPBS_Metallicを使って解説!
このマテリアルは物理ベースになっているため、簡単に言うと現実世界に近い見た目が作れるマテリアルです。
Metallicとは
そもそもMetallicとは何なのか?
答えは『金属か非金属(金属じゃない)か』単純に言ってしまえばこれ。
つまり結論から言えば鉄のマテリアルを作りたかったらMetallicの値は1!
プラスチックを作りたければMetallicの値は0です。
Metallicを1にしても鉄っぽくならない理由と対処法
しかし実際に鉄を作ろうとして金属のMetallicを1にしても鉄どころか金属っぽくも見えない、ということが多いと思う。
やっぱりMetallicを1にするのがおかしいんだ!…と安易にMetallicの値を下げたくなる。けどちょっと待って!
実はそれにはちゃんと原因はあって、その問題を解決すればMetallicはすごくリアルな金属を作れます!
問題1:なんか黒くなる
Metallicを上げると黒くなる。そういうイメージを持っている人もいますよね?
例えばまず最初にAlbedoColorに鉄っぽい色を入れる。
結構こうやって作り始めますよね。
しかしここからMetallic値を上げると…。
ほら真っ黒!!
原因:値を設定する順番が間違っている
けどその原因はマテリアルを作る時の手順にあるのかも。
マテリアルを作るときまず最初にAlbedoColorを設定して最後にMetallicを設定する人が多いと思う。
どうしても上からパラメーターを設定していくとそうなる…。
しかし実はMetallicの値は最初から決まっている。
金属か非金属か。だとすれば一番最初にMetallic値を決めてしまうのが正しい。
今回のように鉄を作りたければMetallic値をまず1にするといい。
けれどMetallic値が間違っていないとすればなぜ黒くなるのか。
解決:AlbedoColorを調整する
実は私たちがイメージしている鉄の色と実際の鉄の色は大きく違ったりする。
現実世界の鉄の色をスキャンしたデータというのがネット上にはあるが、その鉄の色をMetallic値0のAlbedoColorに当てはめるとこれ。
白い!っと思うでしょう。
でも実はこれが鉄の色。私たちが思っているイメージより金属はずっとずっと白いんです。
しかしこれのMetallcを1にしてみると…。
ほらだいぶ!私たちの知っている鉄に見えるでしょう。
ついでにおまけとして金の色はこれです。黄土色というよりクリーム色。
けれどメタリックをMetallcを1にしてみると…。
ほらすごく金でしょう!
問題2:背景を反射しすぎる
次に金属っぽく見えない問題としてあるのは背景を反射しすぎて金属っぽく見えない時。
これは反射を抑えるためにはMetallic値を下げないと!!…と思うかもですがちょっと待って!
原因:Somoothness値が高すぎる
背景が反射しすぎるのは結論から言ってMetallic値が高いせいではなくSomoothness値が高いせいです。
Somoothness値とは要するに「表面がどれだけツルツルか」というものです。
つまりSomoothness値1というのは表面がめちゃくちゃ磨かれていて現実では見たこともないレベルでツルツルということ。
そう思えば背景をくっきり反射してもおかしくない。
解決:Somoothness値を下げる
だとすれば解決法は簡単。Somoothness値を下げればいい。
上と同じ設定のままSomoothness値をだけを下げると…
ほらいい感じの反射具合!
(実のところSomoothness値が見た目に与える影響はMetallic値が高い方が高い。理由はちょっと難しくなるので割愛)
問題3:周りの色を反射してくれない
室内でマテリアルを取り出したとき壁は茶色いのになぜか青が混ざったり、青空の下で取り出したはずなのにマテリアルが真っ黒だったりする。
下のスクショのマテリアルはすべてMetallic値が1でSomoothness値も0.7以上あったりする。
↑空は青く地面は緑のはずなのにマテリアルはグレー
↑屋内のはずなのに空が移っているように見える
↑屋内は茶色系のはずなのにマテリアルは真っ黒。光っぽい点だけ見える。
原因:反射はLightとSkyBoxとReflectionProbeからしかしない
現実世界なら金属に顔を違づければ顔が映るし、常に周辺の色が映りこむもの。
けどそれをゲーム上でやるにはかなりのパフォーマンスが必要でVRでは特に現実的じゃない。
なのでゲーム上のライティング計算は現実に比べるとかなり簡略化され、その簡略化した部分を補うための技術がいくつも使われています。
Resoniteの反射の場合、SkyBoxコンポーネントに設定されたマテリアルの色とReflectionProbeと直接当たっているLightを使って反射しているように見せています。
逆に言えばそれ以外の要素が反射することはない。
解決:ReflectionProbeを使う&SkyBoxを見直す
これを解決する一番はReflectionProbeを使うことです。
あとはSkyBoxに設定されているマテリアルの色を調整する。この2点です。
ReflectionProbeとはあらかじめ反射に使う画像を用意しておき、反射が必要な時にその画像を使用して疑似的な反射を見せるための技術です。
ResoniteでもReflectionProbeは使えますし必要な画像(Cubemap)もその場で作れます。
先ほど真っ黒になってしまったマテリアルもReflectionProbeを使うと…
ほらめっちゃ反射しているように見えます!
むしろSomoothness値が高すぎて反射しすぎてるくらいです。
なので先ほどのようにSomoothness値を落とすと…
綺麗なメタリックになりますね!
↓書いたけど割愛しようかなと思った文章。無理に読まなくてもいい↓
((特にResoniteはSkyBoxとは別に球体でワールドを覆って背景に見せる手法もある(私もよく使った)があくまで反射するのはその球体の外にあるSkyBoxの色になってしまうため球体の色は一切反映されない。なので反射を綺麗に見せるためにはSkyBoxを使用するのが無難。ただしSkyBoxの色は全体や影の色などにも影響するので意図的に球体とは違う色を設定する場合もある(むしろそれが目的が多い?)。その辺はやっぱReflectionProbeはいいのだけど完全をカバーするとなると…長くなりそうなので割愛))
余話:金属じゃなくても周りの景色は反射する
よくツルツルなプラスチックなど周りの景色が映ったりしますよね?
それを再現しようとして金属じゃないけどMetallic値を少しだけ上げよう!…とか思うかもだけどちょっと待って!
周りの景色を反射するのは決してMetallic値があるからじゃない。もちろんMetallicが高い方が周りの景色を反射しやすいけどMetallicが0でも実は周りの景色は反射する。
ReflectionProbeを使いつつ、Metallic値が0でSomoothness値が1だと…。
ほら(ちょっと見づらいかもだけど)うっすらとだけど周りの景色が映りこんでる!
実際非金属な物の周囲の映り込みなんてこんなもの。
(クリアコートの話は今回は割愛)
おしまい
以上!なにかと原因にされてすぐ値を下げられたり使われなかったりするMetallicに光を当ててみました!Metallicだけに!!
実のところMetallicは現実世界で考えると金属か非金属かの概ね二択です。
鉄、金、銀、銅、アルミ、チタン、プラチナ、すべて金属です。
中間な素材もないわけじゃないですが主に希少金属。
(あ、仮に金属を色ペンキで塗装してあった場合それは非金属。あくまで一番表面に見える素材のことね)
もちろん何らかの意図をもってMetallic値をあえて中間の値にすることはあるけれどMetallicが原因でないことは結構多い。なので最初は金属か非金属かで0か1にして、他のパラメーターから調節していくことがおすすめ。Metallic値の変更は最終手段!
おまけ。ホームワールドの入り口を見てみよう!
ホームワールドの入り口。とてもきれいですね~。
しかしReflectionProbeを切ると…
こうなります。MetallicにとってReflectionProbeがどれだけ大事かがわかりますね!
ちなみに手すりの下の部分や縁取りに使われている金属マテリアルはこれ。
AlbedoColorはかなり明るくすべて0.8(うっすらノイズのあるテクスチャ付き)。Metallicは1。Smoothnessは0.64です。
金属のパラメーターとしてはこのあたりが凄く無難です。
補足
この説明は初心者向けのわかりやすさを重視しているため厳密にいうと間違い(ってほどでもないけど)や誤解を招く表現を一部含んでいます。ご了承ください。