VRChatにモデルを上げたら頭と体の明るさが違っていた
こんばんは、みんなはモデルつくってる? わたしはモデルを作ってたらこんな問題にブチ当たりました!
シェーダーの設定を下のですがVRChatホームだとこんな感じで頭だけはやたら赤くなってしまう原因についてどなたかご存知でしょうか?シェーダーはUTS2のバージョン2.0.7で頭と体はマテリアル別ですがパラメーターは一緒の設定にしています。 pic.twitter.com/OSCdLEzHdR
— ゆでうなぎ (@yudeunagi) April 1, 2019
モデルの構造は画像のような感じでそれぞれ
01_head 頭部
02_kami 頭部の髪の毛
05_eye 目
11_body 体
11_body.001 首周りの毛の部分
になっていて、頭部に1つ、体に1つマテリアルを割り当てています。
最初は頭部のパラメータをいろいろいじっていたのですが解決できずにTwitterで助けを求めたら
こんにちは。マテリアルが別でならば、まず身体のマテリアルを複製して、そこに頭のテクスチャを入れて同じ表示になるか見てみるといいですね。これで同じになれば、頭のマテリアルのパラメタのいずれかが違っているのが原因です。
— 小林信行 Nobuyuki Kobayashi (@nyaa_toraneko) April 1, 2019
という助言をいただきました見た感じでは、身体と頭のマテリアルでUnlit Intensityの値、もしくはGI Intensityの値が違ってるのではないかなと思いますが、まずは先の方法でチェックしてみてください。
— 小林信行 Nobuyuki Kobayashi (@nyaa_toraneko) April 1, 2019
マテリアルコピー
とのことなので早速マテリアルのコピーを実施、 Inspecter右上の歯車アイコンから「Copy Material Parameter」を選択すると コピー先のマテリアルを選択できるので体用マテリアルから頭用マテリアルへ パラメータをコピーしました。
Unlit Intensity
で、Unlit Intensity、もしくはGI Intensityの値をがおかしいかもしれないという事なのですが そもそもUnlit Intensityとは何ぞや?ということでマニュアルを見てみました UnityChanToonShaderマニュアルより引用GI Intensity
GI Intensity を0以上に設定することで、 UnityのLightingウィンドウ内で管理されているGIシステム、 特にライトプローブに対応します。 GI Intensity が1の時、 シーン内のGIの強度が100%となります。 v.2.0.6で機能強化をしましたので、ライトプローブを含むGIを利用したい場合には、 まず1を設定した後(Standard Shaderとほぼ同様の明るさになります)で、必要に応じて調整してください。
Unlit Intensity
シーン内に有効なリアルタイムディレクショナルライトが1灯もない時に、 Environment LightingのSource設定を元にシーンの明るさとカラーを求め、 それをUnlit Intensityの値でブーストして光源として使用します (本機能を 「アンビエントブレンディング」 と呼んでいます)。 デフォルトは1(アンビエントカラーをそのまま受ける)で、0にすると完全に消灯します。 本機能は環境カラーにマテリアルカラーを馴染ませたい時に使いますが、 より暗めに馴染ませたい場合は 0.5~1 程度 に設定し、 より明るくカラーを出したい場合は 1.5~2 程度 に設定するとよいでしょう。 (v.2.0.6より、最大値が4になりました。)
用語だらけでやたら難しいですがどうやら前者はあらかじめ計算したライティング情報を 動くモデルに反映させるためのパラメータで、後者は光源が存在しない場合でもモデルが 暗くなりすぎないようにするためのパラメータっぽいです。
ですがマテリアルコピーをしても変わらず・・・。 というところでこんなアドバイスをいただきました
小林さんのツイートされていることの他に、このあたりも確認してみるといいかもですhttps://t.co/yWw5XPUoVX
— お休みさん🌒 (@0yasum13) April 2, 2019
どうやらVRChat(というかUnity)ではオブジェクトごとにある座標(オブジェクトの中心?)を基準にライティングをしているようなので(以下の図を参照)その基準となる座標をすべてのオブジェクトで同じものを指定してあげようということらしいです。
ということなのでライティングの基準となるオブジェクトを作ります。キャラクターオブジェクトの直下にEmptyオブジェクトを作り、高さを胸の辺りに設定します。
次に各メッシュオブジェクトのAnchorOverrideに今作ったEmptyオブジェクトを設定します。
で、設定を完了させてVRChatにアップロードすると見事頭と体で明るさが違うのが解消されました!やったね!
まとめ
- ・複数マテリアルを使うときは基準となるマテリアルをコピーして作る
- ・メッシュオブジェクトはあらかじめすべて結合して1つにしておく(VRChatもそうする事 を推奨している)
- ・メッシュオブジェクトが複数になってしまう場合は全てのメッシュオブジェクトのAnchorOverrideに光源処理の基準となるオブジェクトを設定する。