【VRChat】服や髪が消えてしまう問題”レンダーキュー”(Render Queue)について

VRChatで水やガラスなどの半透明オブジェクト越しにフレンドを見ると服や髪が消えているといった問題が発生したことはありませんか?

この問題はUnityの設定である「レンダーキュー(Render Queue)」が正しく設定されていないときに発生します。

この記事では、”服や髪が消えてしまう問題の解決方法“や”レンダーキュー(RenderQueue)の仕様“について詳しく説明していきたいと思います。

なつきなつき

衣装制作者さんやワールド制作者さんにも知ってほしいことがたくさん詰まってます!

レンダーキュー(Render Queue)とは?

Unityでは、描画されるオブジェクトの順序は「レンダーキュー(Render Queue)」という数値で管理されています。
この数値が小さいほど先に描画され、大きいほど後から描画されます。

主に「重なったときの見え方」や「透明オブジェクトの透ける順番」などに影響します。

なので、遠くのものを小さい値にして近いものを大きい値にする必要があります。

レンダーキュー(Render Queue)の代表的な値

名前説明
Background(背景)1000最も早く描画される背景など
Geometry(不透明)2000通常の不透明オブジェクト
AlphaTest(くりぬき)2450マスク処理される透明
Transparent(半透明)3000通常の半透明オブジェクト
Overlay(オーバーレイ)4000UIなどの一番手前に表示するもの

図を使ってわかりやすく解説

正しく「レンダーキュー(Render Queue)」が設定されていたら下のように描画されます。

しかし「レンダーキュー(Render Queue)」の設定がずれていて順番がおかしくなっていたら下のような描画になります。

オレンジ色のオブジェクトの”3000″より近いガラスに”2450″が設定されてしまっているので、先にガラスが描画されてしまい、奥にあるオレンジ色のオブジェクトが消えてしまいました。

要するに簡単に言うと…
「消えてほしくない(=確実に見えてほしい)オブジェクトには、小さいRender Queueの値(2999以下)を設定する」
これだけ覚えとけば何とかなります!

「Render Queue」の値が同じだったら?

では、「レンダーキュー(Render Queue)」が同じ値に設定されている場合はどうなるのでしょうか?

結論は、手前のものが表示され奥のオブジェクトは表示されません。
なので、下の画像のように外側にあるアウターの部分が表示され、奥にあるスカートの部分が消えてしまいます。

難しい話ですが、これはアウターとスカートを両方ともシェーダーを「Transparent(半透明)」に設定してあります。
この場合は「Render Queue」の影響で消えてしまう問題が発生しますが、シェーダーを「Geometry(不透明)」にすることで「Render Queue」に関係なく正しく描画することができます。

なので、不透明にする必要がない部分は「Geometry(不透明)」に設定することで事故を防ぐことができます。

服や髪を消えなくする方法

使用している衣装や髪などによって数値が異なるので発生原因から知っておくことをお勧めします。
なので、この記事では「発生原因」→「解決方法」の順番で紹介していきます。

なぜこの問題が発生するのか?

水の表現はたいてい次のような条件で作られています。

  • 透明なシェーダー(例:AlphaBlend)
  • 水面シェーダーがZWrite(深度書き込み)ON
  • 描画順(レンダーキュー)が3000前後

このような状況のとき、以下のような描画の順番の問題が発生します。

  1. 水面のシェーダーが「ZWrite ON」+「Render Queueが3000前後」で描画
  2. 服や髪などの「Render Queueが3000~3100」の透明マテリアル
  3. 水よりも後に描画される
  4. 水面が「奥に何もない」と判断して、服や髪の部分を描画しない(消えて見える)

【ZWrite(深度書き込み)とは?】
オンに設定すると、Zバッファに奥行きを書き込みます。これにより、後ろのものを隠すようになります。
オフに設定すると、Zバッファに書き込まなくなります。これにより、透過が正しく見えますが順序にバグが発生することがあります。

なので、基本的に不透明オブジェクトはオンにします。透過表現を使いたい場合はオフにしつつ「Render Queue」で調整します。

Unityの設定

では、発生原因が分かったと思うので実際にUnityで「Render Queue」を設定していきましょう。

この記事では「liltoon」「Poiyomi」「UnlitWF」で分けて設定方法を説明していきます。
ここにないシェーダーを使用している場合でも「Render Queue」の項目から変更することが可能です。

よく使われるRender Queueの回避設定例

オブジェクトRender Queueの値
髪(透明)2995~2999
服(透明)2950~2980
水面3000~3050

ワールド側(水面など)の「Render Queue」はプレイヤー側から変更はできないので、アバターの「Render Queue」を調整していくことになります。

liltoonの場合

まず、「Render Queue」を変更したいオブジェクトをHierarchyから選択します。

選択した後、Inspectorからマテリアルの設定を開いて「基本設定」の項目を開きます。

すると「Render Queue」という部分があるのでこちらの値を変更します。
また「ZWrite」という項目も変更する必要があるなら変更します。(基本的に有効で大丈夫です)

Poiyomiの場合

まず、「Render Queue」を変更したいオブジェクトをHierarchyから選択します。

選択した後、Inspectorからマテリアルの設定を開いて一番下の部分に「Render Queue」という部分があるのでここを変更します。

「ZWrite」は”レンダリング”という項目の中にあります。

UnlitWFの場合

まず、「Render Queue」を変更したいオブジェクトをHierarchyから選択します。

選択した後、Inspectorからマテリアルの設定を開いて下にスクロールすると「Render Queue」という部分があるのでここを変更します。

「ZWrite」はここでは変更できません。シェーダーのファイルを編集する必要があります。

基本的にデフォルトでオンになっているので変更する必要はありません。
変更方法を知りたい方がいる場合は、追記していきたいと思うのでX(Twitter)までお願いします!

ワールド制作の観点から見た「Render Queue」の重要性

VRChatでは、ワールド側の設定によっても「服や髪が消える現象」が引き起こされることがあります。これもワールド側で使われている透明なオブジェクトの”Render Queue”設定が原因となるケースです。

よくある例として、

  1. ワールドの水面が”Rnder Queue”:3000(Transparent)で描画されている
  2. アバターの服や髪も3000以上で描かれている
  3. 水が先に描画された結果、「奥には何もない」と判断され、アバターが描画されない

水面以外でも「ガラス」「パーティクル」など透明にする設定が入っているオブジェクトは気を付ける必要があります。

ワールド制作時の「Render Queue」のポイント

目的Render Queueの値備考
不透明な背景や建物2000(Geometry)描画のベースになる
ガラス・水面などの透明物3100 ~ 3200アバターの髪・服より後に描画することで干渉を防ぐ
パーティクル・光エフェクト3200 ~ 3500半透明エフェクト順に調整する
UIなど4000以上(Overlay)最前面に表示する用途向け

ワールド制作者が水や透明エフェクトの”Render Queue”を高めに設定することで、アバター側の”Render Queue”との競合を避けることができます。
また、必要に応じて「ZWrite」や「ZTest」の挙動もシェーダーで調整するとさらに安定します。

まとめ

項目内容
アバターの髪・服2950~2999に設定する(Render Queue)
ワールドの水・ガラス3100~3200に設定する(Render Queue)
ワールドが3000付近のままだと…アバターと競合して消える可能性あり
対策Render Queueを調整する
  • Transparent(透明)になっているマテリアルは消えやすい
    • 対応策:
      可能であれば「Geometry(不透明)」や「Cutout(カットアウト)」に変更する
      →髪や服の表現に影響が少なければ、この方法が最も安定します
    • どうしても透明感を残したい場合は次の項目へ
  • 服や髪のRender Queueが水面と同じまたは3000以上だと消えるリスクあり
    • 対応策:
      透明パーツは”Render Queueを2950~2999″に下げる
    • 服「2980」髪「2995」など
  • ZWrite Offのままだと、奥行き判断ができず水に隠れる可能性がある
    • 対応策:
      透明でも可能であれば”ZWrite On”に変更
    • 見た目が崩れないか要確認

これらのリストを正しく設定できていれば、服や髪などが消えてしまう問題は解決したと思います。

ということで今回は「レンダーキュー(Render Queue)」について解説してきました。少しでも「レンダーキュー(Render Queue)」について知ってもらうことができたらうれしいです!

当ブログ「ぶいなび」ではこのようなUnityの情報を紹介しているので他の記事も見てみてください👇


記事内で使用しているもの
【アバター】Chocolat:https://booth.pm/ja/items/6405390
【衣装】ピクセルポップ:https://booth.pm/ja/items/6396405