今回はMatcapについて紹介しようと思います。
Matcapを利用した材質変化。思ってたよりソレッポイ絵が出来てビックリ。 pic.twitter.com/F5swLI5YXG
— 椿 (@tsubaki_t1) 2016年6月10日
手前からゴーストユニティちゃん、トゥーンユニティちゃん、クリスタルユニティちゃん。matcapでテクスチャ変えるだけでココまで変わるのは面白い pic.twitter.com/PnvAP4ldFV
— 椿 (@tsubaki_t1) 2016年6月10日
Matcapって何?
matcapとは、事前にレンダリングした画像を使用してライト表現を行う手法です。
この手法では、材質と光を表現した球の絵を使用して擬似的にライティングを行います。つまり、ライティングの処理を行わず(事前計算して)ライティングの表現を行える訳です。多分
表現の調整が直感的で楽
通常、物体の色や光沢は「光を受けた結果」表現されます。そのため、本当にライティングを行いたい場合、ライトを複数置いたり間接光を調整するといった事を考える必要があります。
対してMatcapは、ライトを受けた結果の「絵」を元に光沢や影を表現します。例えば下の絵のような感じです。そのため、PhotoshopやGimp等のツールで光の陰影を調整し、結果をモデルに適応出来ます。
光の表現は、球体を基本として傾きを計算、再現を行っています。下の絵のように並べてみると、左の球体の一部と右の角度の結果が概ね一致しているのが分かります。
また金属や光沢のある物を表現する場合、下手にPBRで焼くより「綺麗に見える」かもしれません。
ちなみにBakeでライトを焼いた場合、ReflectionProbeが無いとメタリックはメタリックぽく無くなります。ライトを焼いた時に妙にマットになった場合、ReflectionProbeを設定します。
モバイルでも動作する
matcap、実は割と軽いです。光沢や陰影を綺麗に表現したい場合、沢山のライトやReflection(Cubemap)を使用する必要があるのですが、この手法だとテクスチャ1枚読んでシェーダーで変換かけるだけで済みます。
また、ライティングを使わずに光表現ができるので、ライティングに掛かっていたコストをまるっと削れます。(ダイナミックに影を付けたい場合はまた話は別)
ダイナミックなライティング?PBR?なにそれ美味しいの?
Matcapの最大の問題は、ライティングの影響を受けない事です。影の描画をテクスチャから受けるので当然といえば当然なのですが。
例えば下のように、赤い感じの部屋ではPBRで設定すると部屋に馴染む感じで描画出来ますが、Matcapでは以前同様に銀色となり、浮いています。
当然、PBRによるライティング的に破綻のない絵など出来ません。
とはいえ、裏を返せば「ポイントライトやライトを使用せず、思った通りの絵を表現出来る」という事です。
特にモバイルでポイントライトは無理だし、キャラクターが背景に必ずしも溶け込んでいる必要もないので、その辺りのデメリットは場合によっては無視できるかもしれません。PBRによるリアルな絵作りが必ずしも欲しい絵では無いので、その辺りは取捨選択の所です。
なお、稀に「ライティングの影響を受けるMatcap」なる物もあります。例えばMatcapFXはLightの影響を受けます。
これらの手法を利用した場合、材質の美しさはかなり失われます。ケースバイケースでもありますが、下のように水晶に光を当てた際、期待していた表現と異なると思います。
一応、MatcapFXでは「どの程度Matcapを使用するか」的なパラメータを調整する事で、多少違和感のない表現を可能にしています。
視点はある程度固定が前提
matcapにはもう一つ問題があります。それは「どの向きから見てもライティングの結果が同一である」という事です。
通常ライトは特定の方角から照らされている為、光を背負うような形にすると逆光になります。しかしmatcapは1面のライティング情報しか保持していないため、どこから見ても常にライティングは同じになってしまいます。イメージ的には、カメラマンの背中に常にライトが付いてくるような感じ。
ただ、セルルックなキャラクターに美顔ライト(顔に陰影が入らないようにするライト)を設定したい場合や、キャラクターを周囲から見渡さない・視点が固定のゲームでは、この点も余り気にならないかもしれません。
角度がある程度固定なら、角度ごとにmatcapなテクスチャを用意するって手もあるかもしれませんし。それ何てCubemap
UnityでMatcapを使用する
ではUnityでMatcapを使用する方法についてです。
Shaderを自分で書いても良いかもしれませんが、面倒くさいのでフリーのアセットを使用します。既存品最高
アセットのダウンロード・インポート
Matcapのシェーダーは幾つかありますが、今回はFree Matcap Shadersを使用します。色々と使った感じ、自分にはコレが一番合ってます。
インポートすると、JMO Assetsというフォルダがインポートされます。サンプルプロジェクトは JMO Assets > Matcap Shaders > Demoに有ります。
実際に使ってみる
まずマテリアルを用意します。「Create > Material」
次に、MaterialのシェーダーをMatcap対応の物にします。Matcap 以下に幾つかシェーダーがあるので、その内のどれかを使います。
- Matcap > Bumped > Plain
ノーマルと材質の色とMatcap - Matcap > Bumped > Textured add
ノーマルとテクスチャとMatcap(加算) - Matcap > Bumped > Texture Multiply
ノーマルとテクスチャとMatcap(合成) - Matcap > Vertex > Plain
色とMatcap - Matcap > Vertex > Plain Additive
色とMatcap(加算)。アウトラインのみとか出来る - Matcap > Vertex > Plain Additive Z
色とMatcap(加算)。Zも書き込む
- Matcap > Vertex > Texture Add
TextureとMatcap(加算) - Matcap > Vertex > Texture Lit
TextureとMatcap。色の調整も出来る - Matcap > Vertex > Texture Multiple
TextureとMatcap(合成)
後はシェーダーにテクスチャを設定します。Baseはテクスチャの色、MatcapはMatcapの画像、Bumpmapはノーマルマップを設定します。
色は場合によってはR128,G128,B128が良いかもしれません。
Matcapのサンプルは、ZBrashについての情報やその他諸々を参考にします。
個人的には、光沢のある物は色々と物が写っていた方が綺麗になる印象です。MatcapはRepository | 淡波ログさんのページで幾つか公開されているので、使ってみると面白いかもしれません。自作も楽(らしい)ですし。
後は作成したマテリアルをオブジェクトに設定します。
場合によってはRecieve ShadowやCastShadowの項目はOFFにしても良いかもしれません。少なくともRecieve Shadowは使わないはずなので。
その他
その他Matcapで調べていると肌を表現するシェーダーもありました。
サブサーフェイス・スキャタリングのような、光が半透明な物体の表面を透過し、内部で散乱した後に表面から出て行くメカニズム*1を擬似的に再現出来たりするみたいです。
これもモバイルで動きます。
上の絵はFast Fake Skinを使用