見出し画像

VRC 服等が消えるレンダーキュー(RenderQueue)問題について

覚書。自分はUnity専修ってわけじゃないので違うこと書いてるかもしれない
ステンシルは知らん。
下記のワールドでオブジェクト動かしながら読むと違いが分かるかも。

レンダーキューを触ってみる:https://vrchat.com/home/world/wrld_c555f2b2-7038-4aa0-99a8-fb689fc7bd82

当記事参考データ
Unityマニュアル:ShaderLab
Unityスクリプトリファレンス:RenderQueue

前書き

よくある改変したお洋服がフレンドの服を通してみたら下着姿に!
ワールドの水に飛び込んだフレンドが消えた…
服を通してみた何故か空がバグってる…
とかの話をする時にぶん投げる記事です。
他の人も書いてたりするけど、欲しい情報を抜き出してみた感じ。

まず、レンダーキューってなんぞ?

カメラ映像を描画する順番です。
まず0000番から描画して、そこから0001~…と描画していきます。
これらはUnityとしては、下記のレイヤー用途として用意されています

らしい。でもワールドではVRC内スカイボックスは2450より上にあるし、1000番は2000番に置き換えられたりする。謎。

マテリアル設定をした場合、大体はこの番号に設定されます(わざと変えてるシェーダーなどもあります)。
その場合、下記のような描画になるわけです。

良くある普段の描画

しかし、これをマテリアル設定で意図的に変更すると、下記のような描画になってしまうわけですね。

3000オブジェクトが2450の半透明によって描画がされない。

じゃあ同じ番号だったら?

自然な疑問ですね。
2499番号以下では「手前から優先描画」され、2500番以上では「奥から優先描画」されます。 2499番以下且つ、シェーダーが異なったりすると点滅したりするみたい?
なので多くの半透明服は全員「3000番」にいるので、基本的には影響がないわけですね。

3000ではちゃんと見える

つまるところどうしろと

(理想は全アバター/ワールドの半透明が3000番だったら解決するわけなんですよね)

不透明しかない服は2000番にすれば解決です。
CutOutも2450が基本ですが、たまに2450で半透明してる人に消されるので、2449とかに下げておくと安心。

問題はTransparent。
基本的には3000番にしましょう。
例えば「半透明なマント」や「レーススカート」等、体から離れて背景を多く透過するオブジェクトを含むものは3000番、消えてもいいやって場合は3001~3010番に置いておくとトラブルが減ります。
濡れ透け表現で半透明、スーツパーツの一部が半透明になっている、目を透過する前髪等、透過先がすぐアバターの体になっているような物は3000番よりもっと下げてみても良いでしょう。

半透明の番号を低くすると、当然他の人を脱がす事故に繋がるので、不透明服をちゃんと肌と番号揃えて対策したり、肌を半透明服の番号に揃えたほうが安全です(一緒に全身消えるので全裸にはならない)
後、下げ過ぎるとスカイボックスが消されるためフレアの原因になったりします。

多分他者を脱がせないようにする設定(Zwrite)

じゃあ結局他の人がミスってたら消しちゃうよね?
ってなると思うので一応解決策として、Zwriteがあります。
なんかデプスバッファがどうとか言うけど自分は理解してないので詳しい仕組みは調べてください。
これをOffにした場合、通常消える物は全部透過処理を無視して表示されます。多分。

左がZwrite On 右がZwrite Off 文字が表示されてるのはZ Testが無効のため(?)

当然ですが表現としては凄い違和感のある状態になるので注意してください。

各シェーダーの設定方法

UTS

Zwriteは多分無い。
Show All propertiesを押して、一番下のレンダーキューから。

Sunao

一番下、Otherの中。
Enable Z Write(デフォルトOn。有効になっています。)
Render Queue

Poiyomi

Rendering Optionsの中に
ZWrite(デフォルトOn。)
レンダーキュー


LillToon

基本設定の中
ZWrite(デフォルトOn)
レンダーキュー。
どちらもいじると注意が表示されます。

最後に

ここまで読んで、良かったと思ったらBoothとかTwitter見てくれると嬉しいです。


この記事が気に入ったらサポートをしてみませんか?