Ray-MMD1.5.2でアルファマップにもAPPLY_SCALE機能を追加して更にモデルのモーフで動的に変化させる方法
>書き直しました。
だがアルファマップには他のパラメータ(アルベドとかノーマルとか)にはあるAPPLY_SCALEがない。なんでや。
動画中に透過度を変化させる必要がないのであればマッピング画像の側で調整してやればどうにかなるのだが、動的に変化させたい場合にはそうはいかない。
というわけで、今回はアルファマップにもAPPLY_SCALEを追加して、ついでにモデルのモーフの値を参照して動的に値を変化させる方法について書いていきたいと思う。
ALPHA_MAP_APPLY_SCALEを追加する
この作業はMaterialsフォルダのmaterial_common_2.0.fxsubを編集する必要がある。
まずは適当なテキストエディタで開いて、877行目に移動する。するとこの様になっているはず:
876: #endif
877:
878: return saturate(alphaValue);
この877行目の空行に以下のコードを挿入する。
#ifdef ALPHA_MAP_APPLY_SCALE
alphaValue=alpha*(alphaValue-1)+1;
#endif
material_common_2.0.fxsubでの作業はこれだけ。
あとは好きな材質のfxファイルで
#define ALPHA_MAP_APPLY_SCALE
を追加すればAPPLY_SCALEが機能する。尚、ifdefで場合分けしたので末尾に数字を書く必要はない。
一応 alpha*(alphaValue-1)+1 の計算の意図も説明しておこう。
この式ならアルファマップ画像で透過なしの部分は数字をどれだけ大きくしても透過されず、透過部分のみを対象としてスケーリングができる。
もし全体の透過度を一括で操作したいならalphaValue*=alpha に書き換えればいい。
モデルのモーフでパラメータを動的に制御する
Materials/Editor/には数値パラメータをコントローラpmxを使って動的に制御できる材質fxが置かれている。
これの機能を他の材質fxに導入して、材質の適用対象モデルのモーフから制御できるようにしよう。
コントローラpmxからモーフの値を持ってくる部分は material_editor.fxsub 内に記述されている。
float 「変数名」 : CONTROLOBJECT<string name="「コントローラPMXのファイル名」"; string item = "「値を取得したいモーフの名前」";>;
という形式になっているようだ。最終的に「変数名」にモーフの値が代入される。
「コントローラPMXのファイル名」には文字通りファイル名のみで、パスを指定してやる必要はないようだ。おそらくMMDに読み込んだpmx名から取ってきているからだろう。
というわけで、例えば「朝風.pmx」というモデルの「髪透過」モーフから持ってきた値をalpha変数に代入してやりたい場合は以下のように書けばいい:
float mAlpha : CONTROLOBJECT<string name="朝風.pmx"; string item = "髪透過";>;
static const float alpha = mAlpha;
気をつけなければならないのは const float の頭に static を追加せねばならない点だ。
おわりに
fxsubファイルは書き換えても勝手に読み直してくれたりはしない。なので、MMDを開きっぱなしで書き換えたあとは、そのfxsubをincludeしているfxの方を上書き保存して読み直させよう。
APPLY_SCALEの話は微妙だが、モーフの動的制御の話の方は覚えておけば便利に使えそうだと思う。材質fxがモデルと強く結びついているなら、わざわざコントローラpmxから弄るよりモデル自身のモーフと連動させたほうが扱いやすいだろう。
AutoLuminous用モーフからemissiveIntensityの値を持ってきて、ALとrayを同時に制御するとかできるし。
というわけで、この記事が誰かの役に立つことを願って締めたいと思います。
何か質問があったらお気軽にTwitterとかコメント欄とかにどうぞ。面倒くさくなかったら答えます。面倒くさかったら気が向いたときにブログに答えを投稿するかもしれないし、しないかもしれない。