VRC 服等が消えるレンダーキュー(RenderQueue)問題について
覚書。自分はUnity専修ってわけじゃないので違うこと書いてるかもしれない
ステンシルは知らん。
下記のワールドでオブジェクト動かしながら読むと違いが分かるかも。
レンダーキューを触ってみる:https://vrchat.com/home/world/wrld_c555f2b2-7038-4aa0-99a8-fb689fc7bd82
前書き
よくある改変したお洋服がフレンドの服を通してみたら下着姿に!
ワールドの水に飛び込んだフレンドが消えた…
服を通してみた何故か空がバグってる…
とかの話をする時にぶん投げる記事です。
他の人も書いてたりするけど、欲しい情報を抜き出してみた感じ。
まず、レンダーキューってなんぞ?
カメラ映像を描画する順番です。
まず0000番から描画して、そこから0001~…と描画していきます。
これらはUnityとしては、下記のレイヤー用途として用意されています
マテリアル設定をした場合、大体はこの番号に設定されます(わざと変えてるシェーダーなどもあります)。
その場合、下記のような描画になるわけです。
しかし、これをマテリアル設定で意図的に変更すると、下記のような描画になってしまうわけですね。
じゃあ同じ番号だったら?
自然な疑問ですね。
2499番号以下では「手前から優先描画」され、2500番以上では「奥から優先描画」されます。 2499番以下且つ、シェーダーが異なったりすると点滅したりするみたい?
なので多くの半透明服は全員「3000番」にいるので、基本的には影響がないわけですね。
つまるところどうしろと
(理想は全アバター/ワールドの半透明が3000番だったら解決するわけなんですよね)
不透明しかない服は2000番にすれば解決です。
CutOutも2450が基本ですが、たまに2450で半透明してる人に消されるので、2449とかに下げておくと安心。
問題はTransparent。
基本的には3000番にしましょう。
例えば「半透明なマント」や「レーススカート」等、体から離れて背景を多く透過するオブジェクトを含むものは3000番、消えてもいいやって場合は3001~3010番に置いておくとトラブルが減ります。
濡れ透け表現で半透明、スーツパーツの一部が半透明になっている、目を透過する前髪等、透過先がすぐアバターの体になっているような物は3000番よりもっと下げてみても良いでしょう。
※半透明の番号を低くすると、当然他の人を脱がす事故に繋がるので、不透明服をちゃんと肌と番号揃えて対策したり、肌を半透明服の番号に揃えたほうが安全です(一緒に全身消えるので全裸にはならない)
後、下げ過ぎるとスカイボックスが消されるためフレアの原因になったりします。
多分他者を脱がせないようにする設定(Zwrite)
じゃあ結局他の人がミスってたら消しちゃうよね?
ってなると思うので一応解決策として、Zwriteがあります。
なんかデプスバッファがどうとか言うけど自分は理解してないので詳しい仕組みは調べてください。
これをOffにした場合、通常消える物は全部透過処理を無視して表示されます。多分。
当然ですが表現としては凄い違和感のある状態になるので注意してください。
各シェーダーの設定方法
UTS
Zwriteは多分無い。
Show All propertiesを押して、一番下のレンダーキューから。
Sunao
一番下、Otherの中。
Enable Z Write(デフォルトOn。有効になっています。)
Render Queue
Poiyomi
Rendering Optionsの中に
ZWrite(デフォルトOn。)
レンダーキュー
LillToon
基本設定の中
ZWrite(デフォルトOn)
レンダーキュー。
どちらもいじると注意が表示されます。
最後に
ここまで読んで、良かったと思ったらBoothとかTwitter見てくれると嬉しいです。