ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

真珠光沢シェーダの作り方~星の欠片の物語技術解説

こんにちは!VR事業部の長谷川(id:waffle_maker)です。
今回は『星の欠片の物語。しかけ版』で使用した真珠光沢をもったシェーダを作成するテクニックについて紹介します。

はじめに

本編ではShader Forgeを使用していましたが、今回ご紹介するに当たって、重要な部分のみShader Graphに移植したものをサンプルとして掲載しています。

Shader Forgeとは?

ノードベースで視覚的にシェーダを作成するUnityエディタ拡張です。
現在ではサポートを終了していますし、ビルトインレンダーパイプライン専用であるため、これから使いたい場合は後述のShader GraphやAmplify Shader Editorを使う事をオススメします。

acegikmo.com

Shader Graphとは?

ノードベースで視覚的にシェーダを作成するUnityエディタ拡張です。
Unityパッケージマネージャからインストールすることができ、無料で使用する事が出来ます。

docs.unity3d.com

バージョン情報など

各種バージョン情報は以下の通りです。

方針

真珠光沢を実現する方法はいくつかあると思いますが、今回はシンプルな実装で近似できそうなHue Shift方式を採用しました。

  • MatCap
  • HueShift ←今回はこちらを採用
  • LUT
  • 物理現象を再現

HueShiftとは

HSV色空間で、色相(Hue)をずらす(Shift)ことを指します。
左画像の虹色のリングとバーの部分が色相で、色相を時間経過で循環させると右画像の様になります。

実装

新規のShader Graphを作成し、以下の様にノードを接続します。

グラフ変更例

①の部分では、Dot Productノードで、Normal VectorノードとView Directionノードの内積を求めることで、正面を向いている部分が白く、輪郭に近付くほど黒くなりました。

②の部分では、Hueノードで、入力されたPearlColorの色相を①の値だけずらすことで、正面から輪郭に向かって色相を変化させました。

モデル適用例

カスタマイズ例

上記のグラフ作成例は、重要な部分のみを切り出して分かりやすくしたもので、理想に近付けるためには色々な工夫が必要になります。
ここからは、いくつかのカスタマイズ例を紹介します。

強度を調整

②の結果を加工して、真珠光沢の適用度合いを調整してみましょう。

以下の例では、Hueノードの結果をMultiplyノードで十分の一に調整して、うっすらと虹色になるようにしました。

強度を調整のグラフ変更例
強度を調整のモデル適用例

色相を反転

①の結果を加工して、②に渡す値を調整をしてみましょう。

以下の例では、Dot Productノードの結果をOneMinusノードで反転して、正面から輪郭に向かって変化する色相を逆向きにしました。

色相を反転のグラフ変更例
色相を反転のモデル適用例

グラデーション(Gradient)

②のHueノードを、GradientおよびSample Gradientノードに置き換えてみましょう。

こうしてしまえば、アーティストさんによって調整しやすくなるでしょう。
※例のグラデーションは光の周波数を元にざっくり作成した物です。

グラデーションのグラフ変更例
グラデーションのモデル適用例

ルックアップテクスチャ(LUT)を採用しても良いかもしれません。

陰影の考慮

陰になっている部分は真珠光沢が不要なため、光があたっている部分のみ真珠光沢を適用したかったのですが、Shader GraphではShader ForgeのLight Attenuationノードに相当する機能が見つかりませんでした。 Custom Function Nodeを使えば実現できそうでので、興味がある方は挑戦してみてください。

blog.unity.com

まとめ

今回紹介したテクニックは、真珠の他にも、玉虫色、シャボン玉、オーロラ生地、油膜などにも応用できます。
自作のVRゲームや、VRChatアバターなどのアクセントにおひとつ如何でしょうか?

使用した素材について

本記事の執筆に当たって、下記アセットを使用させて頂きました。

casual-effects.com

宣伝

最後に『星の欠片の物語。しかけ版』『星の欠片の物語、ひとかけら版』が各種プラットフォームで発売中です。
もし、ご興味を持って頂けたらポチッとお願いします。
star.anos.jp