JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

PackedMapを利用する場合のShaderの例(続・Houdiniで制作したSmokeシミュレーションを連番テクスチャとして吐き出してUnityで利用するまで。)

はじめに

この記事は

sakataharumi.hatenablog.jp

の続きです。

前回の記事はColorMap、NormalMapを出力しましたがEmission Mapは使用していませんでした。

本記事では、EmissionMapを使ってみようと試行錯誤した記録と結果を書いていきます。

EmissionMapを得るためにPackedMapを出力

TextureSheetsノードの設定をし、PackedMapを出力します。

  • Render Emission Layerにチェック
  • Channel Pack Normal, Emission, Alphaにチェック
  • Render Packed Mapで出力

f:id:sakata_harumi:20210608235358p:plain

すると、PackedMapが出力されます。

こちらは名前の通り、複数の情報(法線、エミッション、アルファ)が1つのテクスチャに書かれたもので、どのチャンネルに何の情報が書かれているかをChannel Packing タブから確認・変更できます

f:id:sakata_harumi:20210608235546p:plain

BlueのチャンネルにEmissionの情報が書かれていることがわかります。

RedとGreenにNormalの情報が書かれているんですが、X,Y成分のものしか書かれていません。
一見これでええんか?と思いますが何とZを復元できるらしいです・・!詳しくは次のシェーダーを作る過程でみていきたいと思います。

f:id:sakata_harumi:20210609001000p:plain
出力したPackedMap

VFX Graphで使うShaderの実装

ここで得られたのはPackedMapなので、NormalMap、EmissionMapと分解されているわけではありません。

なので、自分でShaderを実装して利用することにします。

1. Shader Graphの作成

VFX Shader Graphを作成し、デフォルトで生成される出力用ノード(Visual Effect Masterノード)の設定を変更。Litにチェックをつけておきます。

f:id:sakata_harumi:20210609001339p:plain

これで、NormalやEmissionを設定できるインプットが出現しました。

2. flip bookの設定

とりあえず、NormalやEmissionは置いておいてメインのテクスチャをアニメーション可能にしていきます

f:id:sakata_harumi:20210609001722p:plain

FlipBookPlayerの現在のインデックスの値は「texIndex」というプロパティで取得できます。この値をShader Graphの入力として与えています。

f:id:sakata_harumi:20210609001828p:plain

3. Normal Mapの設定

次に、Normal Mapを復元し設定していきます。RとGがNormalの情報(X,Y成分)に相当することがわかっているので、これらの値を利用します。

f:id:sakata_harumi:20210609002227p:plain

で、Z成分の復元なんですがこれには「Normal Reconstruct Z」というノードがあるのでこれを利用することで復元できます。

docs.unity3d.com

復元式は以下。


\sqrt{1.0 - saturate(x * x + y * y)}

Z成分は1.0が基準であり、xyベクトルの大きさが大きいとZ成分は小さく(凹凸が大きく)なり、小さいと大きく(凹凸が少なく)なるので、感覚的には納得です。

4. Emission Mapの設定

BチャンネルがEmissionの情報になっているので、これを利用します。 ネットワークは以下のようにしてみました。あってるのかは正直わからん。 間にカラーをブレンドして発光色を決められるのかな。

f:id:sakata_harumi:20210610010907p:plain

EmissionMapでは黒い部分ほど発光度が下がります。

結果はこんな感じ。

f:id:sakata_harumi:20210610010952p:plain