〇描画順について
さて、先ほども説明しましたが、画面上にオブジェクトを表示する際、基本的にマテリアルのRenderQueueの数字が小さいものから順番に描画されるようになっています。
また、RenderQueueが同じオブジェクトが複数あった場合は、
・2500以下
⇒カメラ(視点)に近い順で描画する。
・2501以上
⇒カメラ(視点)から遠い順で描画する
のような異なった描画処理が行われます。
※距離のソートはTransform (Bounds) を基準に行われます。
これらは、描画結果を自然な見た目にするためのUnityの仕様ですので、RenderQueueをいじる際にはぼんやり考えながら触ってみてください。
なお、RenderQueueは自然な描画結果を得るために設定されているものなので、普段のVRC生活で特に気になることがない場合は、デフォルト値から触らないのがベターです。
(不透明なオブジェクトは2000!半透明なオブジェクトは3000!)
ユーザーによって様々なRenderQueueの設定方法があるがゆえに、1ユーザーが自分で微調整しなければならなくなってしまうVRChatが特殊なのかなと思います。
〇なぜRenderQueueを調整するのか
では、どんなときにRenderQueueの調整が必要になってしまうのでしょうか?
冒頭で挙げたシチュエーションのうち、
「水に入ったら身体が消えた!!」
「窓ガラス越しだとボディが表示されない!!」
については、大半が「ワールド側の水やガラスの半透明マテリアル」と「アバター側のマテリアル」が干渉していることにより発生します。
具体的な条件としては、「水やガラスなどの半透明なマテリアルのRenderQueueが、アバターよりも小さい」が挙げられ、ざっくりと言うと、アバターより先に水やガラスなどの透過マテリアルが描画される状況において、アバターが見えなくなるという現象が発生します。
※詳細は省きますが、BoundsやZ Write等の兼ね合いで同一RenderQueueであっても見えなくなる場合があります。
水やガラス等のマテリアルは、自身の描画順になると「これまでに既に描画が終了しているもの」(つまりRenderQueueが自身より小さいもの)に、自身の情報をブレンドし、その結果を新たに描画するという処理を行います。当然、この処理結果にはRenderQueueがより大きなマテリアルは含まれません。そのため、RenderQueueが小さい(描画順が早い)透過マテリアルが手前にあると、奥のマテリアルはブレンド結果に隠れてしまい映らなくなる場合があるのです。
VRCでワールドに使用されている水やガラスはRQ3000のものが多いため、アバターのRenderQueueの値をあらかじめ3000よりも少し小さくしておくことで、このような現象に遭う可能性を低くすることができます。
liltoonのファーシェーダの場合は初期値がRQ3000になっているため、アバター(特にボディなどの主要部分)に使う場合は要確認です。
ただし、透過マテリアルが自身より描画順が後のマテリアルを消してしまうというのは、何もワールドに限った話ではなく、アバターでも同じことが起こります。アバターに半透明部品が多く使われている場合は、自身のRenderQueueを下げることにより他の人のアバターの服や髪を消してしまう可能性があることにご注意ください。